電子工作55 – 経過時間LED表示付きで、30分、1、2、3、4、5、6、7、8、9、10、11、12時間に設定可能な簡易タイマの製作
概要
前回の電子工作54の簡易タイマを最長12時間まで選択出来るように改良した。5個のLEDを使って各選択した時間の経過の状態を目視出来る機能は同じである。プログラムをコンパクトにして16F886にやっと収まった。時間は予想に反し大変正確であった。
注意: 危険なので製作は自分の責任で行うこと。。
回路図と動作原理
回路図を下に示す。前回と同じ16F886を使った。ADCの入力電圧を変えるVR100Kを回すとLED1−13のいずれが点灯する。各LEDに設定時間が割り当てられている(LED1=30min,LED2=1hr、LED3=2hrs、LED4=3hrs、LED5=4hrs、LED6=5hrs、LED7=6hrs、LED8=7hrs、LED9=8hrs、LED10=9hrs、LED11=10hrs、LED12=11hrs、LED13=12hrs)。設定した時間が来たらタイマが“切れる”または“入る”の設定はMode SWで行う(L:“切れる”、H:“入る”)。設定した時間が終了したらSSRとLED(G)をON/OFFする。経過時間レベル表示LEDsは時間を設定すると5個のLEDsが全て点灯し、時間の経過とともに点灯するLEDs数が上から減って行き、時間が終了すると全てが消える。Reset SWを押すと同じLED表示時間でまた時間の計数が始まる。VR100Kを回して別の(または同じ)時間を選択すると、その瞬間をゼロして時間の計数がまた始まる。電源には出力DC5V位(>200mA)のACアダプタを使う。
)
実験中: 16F886の右手が経過時間レベル表示用の5個のLEDL5−1。現在LEDL5-4が
消えている。左下が時間設定用の13個のLED1−13。現在1時間に設定されている。
左上の丸いものがVR。これを回して時間を設定する。その下にはMode SWが見える。
このボードには差当りSSRの代わりにブザー{右上}を載せている。時間が来ると鳴る。
実用機: アルミボックス(18X11X6cm)に収容。左の黒いのがDC5VのACアダプタ、右手にAC100Vの差込みが見える。
ボックス上に電源SW、Mode
SW、Reset SW、それに時間設定VRが見える。内部には経過時間レベル表示用
の5個のLEDL5−1と時間設定用の13個のLED1−13が組込んであり、現在は時間設定は1時間であと12分
以内にAC100V出力がONになることを示している(2011.4.21に完成追加)。
後日5V電源のGNDをアルミボックスに接続する必要があることが分かり修正した(2011.5,5追加)。
結果&コメント
1) 下表のように今回も時間の精度は大変高かった(誤差は設定時間のほぼ0.1%以下)。Internal Clock 4MHzを基準にし、Pauseを使って遅延をつくっていることを考えると驚きである。 なおデータを得るために測定は2−3日間にわたって行った。これらのデータは原則1回の測定で得られた値である。気温の変化が多少精度に関係しているように思われる。
設定時間 |
30 min |
1 hr |
2 hrs |
3 hrs |
4 hrs |
6 hrs |
8 hrs |
12 hrs |
実測時間 |
30m 1s |
1hr 4s |
2hr 2s |
3hr 6s |
4hr 4s |
6hr 6s |
7hr 59m 57s |
12 hrs 27s |
時間差 |
1s |
4s |
2s |
6s |
4s |
6s |
-3s |
27s |
誤差(%) |
+0.06 |
+0.11 |
+0.03 |
+0.06 |
+0.03 |
+0.03 |
-0.01 |
+0.06 |
(測定時環境温度:10−20°C、クオーツ時計で時間測定)
誤差(%)=(時間差/設定時間)X 100
2) 30分の遅延ルーチンFor m=1 to 177で、繰返し数177は実験的に見出した。この値を基準にして1、2、3、4、5、6,、7,8,9,10,11,12時間値も作成した。例えば、2時間では177x4=708回。
3) 経過時間と5個のLEDL5-1表示の関係 {設定時間が1時間の場合} − 時間の経過と共にLEDL5、LEDL4、...LEDL1が順次消灯して行く。例えば、上からLEDL5とLEDL4が消灯していて残りの3つのLEDが点灯している場合は残りの時間は36−24minの範囲と考える。設定時間が2時間以上の場合も、各時間値を下表の各数値に掛け算してやれば残り時間や時間範囲が計算できる。
設定時間が1時間の場合
消灯するLED |
残り時間 |
時間範囲 |
LEDL5 |
48min |
60-48min |
LEDL4 |
36min |
48-36min |
LEDL3 |
24min |
36-24min |
LEDL2 |
12min |
24-12min |
LEDL1 |
0 |
12-0min |
4) VR100Kを回して、ある時間表示LEDを選択した瞬間からその時間の計数が始まる。したがって、1時間に設定しておいて途中で3時間などに設定し直すとその時点から3時間の計数が始まる。
5) この簡易タイマでは、例えば30分と1時間の間の時間設定は出来ない(市販のシンクロナスモータを使ったものは出来る)。
6) プログラムが大分コンパクトになってやっと16F886に収容できコンパイルできた。 Lines assembled: 9901とコンパイル終了時表示が出た。意味は良く分からないが、メモリを消費しつくしている感じ。
7) このタイマの長所は可動部分がないのでシンクロナスモータ式の様に壊れにくいことである。あとは実用機を製作して使ってみたい。
8) (追加情報:4.21) 下の追加修正で示した様に、実用機を作成したところ不具合が見つかったのでプログラムを一部修正した。
9) (追加情報:4.21) 実用機はもうちょっと小奇麗に仕上げたかった。アルミボックスを含め全費用は2000円ほど。とにかくしばらく使ってみて動作や実用性を観察してみたい。
10) (追加情報:5.1) 実用機の基板をアルミボックスに入れるとLEDL5−1が変化しない(時間を刻まない)問題が発生した。電源5VのGNDをアルミボックスにも接続したら解決した。
プログラム
このプログラムの構成は原則前回の電子工作54と同じで、7−12時間の部分が増加しただけである。今回は5Vに対応する1024を13区分に分割し1区分を切りの良い75(計算では1024/13=78.7)にしてある。Mode SWで時間が来たら“切れる”と“入る”を選択できるようにしたので合計26(13x2)個のの時間の計数ルーチンが必要になるが、サブルーチンを使って13個に減らした。どのLED表示時間にあってもVRを回して途中で自由に変更し再スタート出来るのがポイントの一つである。すなわち現在計数しているルーチンの中に“まだ同じLED表示時間の中にいるか?”を常時チェックする部分を加えることでそれが可能になった。経過時間を5個のLED(LEDL5-LEDL1)を使って表示する機能は次の様な原理による。すなわち、各時間で計数中の秒数を6範囲に分けて選択させ、サブルーチンを使って最初は点灯しているLEDL5-LEDL1を順次消灯させて行き、設定時間が終了すると同時に最後のLEDL1も消灯させる仕組みである。
以下のリストはより大きいだけで電子工作54とほぼ同じなので詳細説明は省略した。プログラムリストのフォントはスペース節約のため10.5から8にした。
(追加修正 2011.4.21: 組み上げた実用機で、時間が来たら“入る”モードで電源を入れるとSSRSWの出力が一瞬ONになる問題、電源が時々入らなくなる問題が発生したので、SSRSW=0 と Pause10を初期設定の最後の部分に加え、プログラマConfigでPower-up Timer を Enable (PICの立ち上げ時の時間待ち)にしたら問題が解決した!)
'********************************************
'SimpleTimer16F886LvlCmp.bas - 2011.4.11 works OK Slightly modified on 2011.4..21
'Comments:
'PICBasic Pro 250A
used
'This prog. is a
compact version of SimpleTimer16F886Lvl.bas.
'Times covered are
30m,1,2,3,4,5,6,7,8,9,10,11,12hr (13 time selections)
'16F886 (24pins)
with internal clock 4MHz (default)
'Timer - ON or OFF
when time expires (30 min, 1 - 12 hour - 13 settings)
'********Pin
connections************ ピンの接続
'Pin 1: MCLR (Reset)
'Pin 2: PORTA.0:
input - analogue input of 0-5.0V from VR 100K
'Pin 3: PORTA.1:
input - connected to Mode SW
'Pin 4: PORTA.2:
output - connected to LED (G) - SSR
'Pin 5: PORTA.3:
output - connected to LED1
'Pin 6: PORTA.4:
output - connected to LED2
'Pin 7: PORTA.5:
output - connected to LED3
'Pin 8: Vss (GND)
'Pin 9: PORTA.7:
output - connected to LED5
'Pin 10: PORTA.6:
output - connected to LED4
'Pin 11: PORTC.0:
output - connected to LED6
'Pin 12: PORTC.1:
output - connected to LED7
'Pin 13: PORTC.2:
output - connected to LED8
'Pin 14: PORTC.3:
output - connected to LED9
'Pin 15: PORTC.4:
output - connected to LED10
'Pin 16: PORTC.5:
output - connected to LED11
'Pin 17: PORTC.6:
output - connected to LED12
'Pin 18: PORTC.7:
output - connected to LED13
'Pin 19: Vss (GND)
'Pin 20: Vdd (+5V)
'Pin 21: PORTB.0
output - LEDL1 (0-20)
'Pin 22: PORTB.1
output - LEDL2 (20-40)
'Pin 23: PORTB.2
output - LEDL3 (40-60)
'Pin 24: PORTB.3
output - LEDL4 (60-80)
'Pin 25: PORTB.4
output - LEDL5 (80-100)
'*********** Program
********** ここからプログラム開始
Define ADC_BITS
10 '10-bit ADC
used 以下に長い初期設定が続く
Define ADC_CLOCK
3 'Internal
clock used ?
Define
ADC_SAMPLEUS 50 'Sample timing
ADCON0=%01000011
'bit7-6=01(Fosc/8),
bit5-2=0000(Channel An0 selected)
'bit1=1(GO/DONE
starts right away),bit0=1(ADC enable)
ADCON1=%10000000
'bit7=right
justified),bit6=0(unimplemented)
'bit5-4=00(Vss
& Vdd used as refererence voltage)
'bit3-0=0000(unimplemented)
ANSEL=%00000001 'Channel AN0 for ADC used as
analog
ANSELH=0
OSCCON=%01100001 'Internal 4MHz clock used
CM1CON0=0 'Comparator Off
CM2CON0=0 'Comparator Off
TRISA=%00000011 '2 inputs - from An0 and divider
TRISB=%00000000 'All are outputs (5 ports)
TRISC=%00000000 'All are outputs
Vin var word 'AD input value from VR 100K ADC値は最大で1024(5V)なのでWORDで変数宣言
ModeSWInput var
PORTA.1 'Mode SW input from Mode SW (ON or OFF when time expires) 設定時間が終了したらSSRが“切れる”なたは“入る”の変数宣言
SSRSW var PORTA.2
'SSRSW - ON/OFF of SSR ( LED G)
LED1 var
PORTA.3 'ON/OFF of LED1
(30min) 以下の13個のLED1−LED13で設定時間を宣言
LED2 var
PORTA.4 'ON/OFF of LED2 (1hr)
LED3 var
PORTA.5 'ON/OFF of LED3 (2hrs)
LED4 var
PORTA.6 'ON/OFF of LED4 (3hrs)
LED5 var
PORTA.7 'ON/OFF of LED5 (4hrs)
LED6 var
PORTC.0 'ON/OFF of LED6 (5hrs)
LED7 var PORTC.1 'ON/OFF of LED7 (6hrs)
LED8 var
PORTC.2 'ON/OFF of LED8 (7hrs)
LED9 var
PORTC.3 'ON/OFF of LED9 (8hrs)
LED10 var
PORTC.4 'ON/OFF of LED10 (9hrs)
LED11 var
PORTC.5 'ON/OFF of LED11 (10hrs)
LED12 var
PORTC.6 'ON/OFF of LED12 (11hrs)
LED13 var PORTC.7 'ON/OFF of LED13 (12hrs)
LEDL1 var
PORTB.0 'ON/OFF of LEDL1 以下の5個のLEDL1-5で経過時間を宣言
LEDL2 var
PORTB.1 'ON/OFF of LEDL2
LEDL3 var
PORTB.2 'ON/OFF of LEDL3
LEDL4 var
PORTB.3 'ON/OFF of LEDL4
LEDL5 var
PORTB.4 'ON/OFF of LEDL5
m var word 'counter
n var byte 'counter
SSRSW=0 'new 4/21 essential to prevent SSRSW
from turning ON a vert short period of time この2行がないとSSRSW出力(例えば電球)が一瞬ONになる
Pause 10 'new 4/21 when power is turned ON
– important
Loop: 'このLoop内で実際のプログラムが動く
Adcin 0, Vin
Pause 5 'Wait 5ms
SSRSW=0
LOW LEDL1: LOW
LEDL2: LOW LEDL3: LOW LEDL4: Low LEDL5
'OFF LEDL1-5
'Selecting voltage
range (5V - 1024/13 fractions=78)
VRを回して設定時間を選択する部分、合計13個のラベルに分類されて飛ぶ
If (75>=Vin)
then LED1ON
'30 min
if (75<Vin) AND
(Vin=<150) then LED2ON '1
hr
if (150<Vin)
AND (Vin=<225) then LED3ON '2
hrs
if (225<Vin)
AND (Vin=<300) then LED4ON '3
hrs
if (300<Vin)
AND (Vin=<375) then LED5ON '4
hrs
if (375<Vin)
AND (Vin=<450) then LED6ON '5
hrs
if (450<Vin)
AND (Vin=<525) then LED7ON '6 hrs
if (525<Vin)
AND (Vin=<600) then LED8ON '7
hrs
if (600<Vin)
AND (Vin=<675) then LED9ON '8
hrs
if (675<Vin)
AND (Vin=<750) then LED10ON '9
hrs
if (750<Vin)
AND (Vin=<825) then LED11ON '10
hrs
if (825<Vin)
AND (Vin=<900) then LED12ON '11
hrs
if (900<Vin)
then LED13ON
'12 hrs
'Indicating
selected voltage ranges on LED1
LED1ON: '30 min: '30 min 30分の場合
High LED1:Low
LED2:Low LED3:Low LED4:Low LED5:Low LED6:Low LED7:Low LED8:
Low LED9:Low
LED10:Low LED11:Low LED12:Low LED13
' LED1-13のうちLED1だけ残して他は消灯する
If ModeSWInput=0
then LED1Tcount 'モードSWをチェックし、LED1TcountまたはLED1TcountDownに飛ぶ
Goto
LED1TcountDown
LED2ON: '1 hr
Low LED1:High
LED2:Low LED3:Low LED4:Low LED5:Low LED6:Low LED7:Low LED8:
Low LED9:Low
LED10:Low LED11:Low LED12:Low LED13
If ModeSWInput=0
then LED2Tcount
Goto
LED2TcountDown
LED3ON: '2 hrs
Low LED1:Low
LED2:High LED3:Low LED4:Low LED5:Low LED6:Low LED7:Low LED8:
Low LED9:Low
LED10:Low LED11:Low LED12:Low LED13
If ModeSWInput=0
then LED3Tcount
Goto
LED3TcountDown
LED4ON: '3 hrs
Low LED1:Low
LED2:LOW LED3:High LED4:Low LED5:Low LED6:Low LED7:Low LED8:
Low LED9:Low
LED10:Low LED11:Low LED12:Low LED13
If ModeSWInput=0
then LED4Tcount
Goto
LED4TcountDown
LED5ON: '4 hrs
Low LED1:Low LED2:LOW
LED3:LOW LED4:High LED5:Low LED6:Low LED7:Low LED8:
Low LED9:Low
LED10:Low LED11:Low LED12:Low LED13
If ModeSWInput=0
then LED5Tcount
Goto
LED5TcountDown
LED6ON: '5 hrs
Low LED1:Low
LED2:LOW LED3:LOW LED4:Low LED5:High LED6:Low LED7:Low LED8:
Low LED9:Low
LED10:Low LED11:Low LED12:Low LED13
If ModeSWInput=0
then LED6Tcount
Goto
LED6TcountDown
LED7ON: '6 hrs
Low LED1:Low
LED2:LOW LED3:LOW LED4:Low LED5:Low LED6:High LED7:Low LED8:
Low LED9:Low
LED10:Low LED11:Low LED12:Low LED13
If ModeSWInput=0
then LED7Tcount
Goto
LED7TcountDown
LED8ON: '7 hrs
Low LED1:Low
LED2:LOW LED3:LOW LED4:Low LED5:Low LED6:Low LED7:High LED8:
Low LED9:Low
LED10:Low LED11:Low LED12:Low LED13
If ModeSWInput=0
then LED8Tcount
Goto
LED8TcountDown
LED9ON: '8 hrs
Low LED1:Low
LED2:LOW LED3:LOW LED4:Low LED5:Low LED6:Low LED7:Low LED8:
High LED9:Low
LED10:Low LED11:Low LED12:Low LED13
If ModeSWInput=0
then LED9Tcount
Goto
LED9TcountDown
LED10ON: '9 hrs
Low LED1:Low LED2:LOW
LED3:LOW LED4:Low LED5:Low LED6:Low LED7:Low LED8:
Low LED9:High
LED10:Low LED11:Low LED12:Low LED13
If ModeSWInput=0
then LED10Tcount
Goto
LED10TcountDown
LED11ON: '10 hrs
Low LED1:Low
LED2:LOW LED3:LOW LED4:Low LED5:Low LED6:Low LED7:Low LED8:
Low LED9:Low
LED10:High LED11:Low LED12:Low LED13
If ModeSWInput=0
then LED11Tcount
Goto
LED11TcountDown
LED12ON: '11 hrs
Low LED1:Low
LED2:LOW LED3:LOW LED4:Low LED5:Low LED6:Low LED7:Low LED8:
Low LED9:Low
LED10:Low LED11:High LED12:Low LED13
If ModeSWInput=0
then LED12Tcount
Goto
LED12TcountDown
LED13ON: '12 hrs
Low LED1:Low
LED2:LOW LED3:LOW LED4:Low LED5:Low LED6:Low LED7:Low LED8:
Low LED9:Low
LED10:Low LED11:Low LED12:High LED13
If ModeSWInput=0
then LED13Tcount
Goto
LED13TcountDown
'Counting time
LED1Tcount: '30
min OFF when time expires
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub
A30mTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED1TcountDown: '30 min ON when time expires
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub
A30mTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED2Tcount: '1
hour
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A1hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED2TcountDown: '1 hour
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A1hTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED3Tcount: '2
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A2hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED3TcountDown: '2
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A2hTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED4Tcount: '3
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A3hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED4TcountDown: '3
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A3hTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED5Tcount: '4
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A4hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED5TcountDown: '4
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A4hTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED6Tcount: '5
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A5hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED6TcountDown: '5
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A5hTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED7Tcount: '6
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A6hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED7TcountDown: '6
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A6hTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED8Tcount: '7
hours
High LEDL1: High LEDL2:
High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A7hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED8TcountDown: '7
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A7hTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED9Tcount: '8
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A8hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED9TcountDown: '8
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A8hTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED10Tcount: '9
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A9hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED10TcountDown:
'9 hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A9hTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED11Tcount: '10 hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A10hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED11TcountDown:
'10 hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A10hTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED12Tcount: '11
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A11hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED12TcountDown:
'11 hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A11hTcount
High SSRSW 'SSR -> ON
Goto Finishing
LED13Tcount: '12
hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
High SSRSW 'SSR -> ON
Gosub A12hTcount
Low SSRSW 'SSR -> OFF
Goto Finishing
LED13TcountDown:
'12 hours
High LEDL1: High
LEDL2: High LEDL3: High LEDL4: High LEDL5 'ON LEDL1-5
Low SSRSW 'SSR -> OFF
Gosub A12hTcount
High SSRSW 'SSR -> ON
Goto Finishing
'Subroutines 以下に13個の時間計数サブルーチン
A30mTcount: '30min time counting 30分間計数するルーチン
For m=1 to
177 '30 min adjusted after actual measurement
(180 in theory)
For n=1 to 40 '10 sec
Adcin 0, Vin ' Vinを読込んで75>=Vinであるかどうか確かめる。YesならEndifへ、NoならLoopへ飛ぶ
Pause 5 'Wait 5ms 'この部分は時間の計数の途中でVRを回してLED1−13(時間選択)の位置を変えても、その位置で最初から計数が始まるようにするためである。重要!!
If (75>=Vin)
then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<35)
Then GOSUB Level5 'mの値をチェックしながらサブルーチンに飛んでLEDL5-1を順次OFFにする
If (m>=35) and (m<70)
Then GOSUB Level4
If (m>=70) and
(m<106) Then GOSUB Level3
If (m>=106) and
(m<141) Then GOSUB Level2
If (m>=141) and
(m<177) Then GOSUB Level1
If m=177 Then GOSUB Level0
Next m
Return
A1hTcount:
For m=1 to 354 '1 hour (177 x
2)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (75<Vin) AND
(Vin=<150) then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<70)
Then GOSUB Level5
If (m>=70) and
(m<141) Then GOSUB Level4
If (m>=141) and (m<211) Then GOSUB Level3
If (m>=211) and
(m<282) Then GOSUB Level2
If (m>=282) and
(m<354) Then GOSUB Level1
If m=354 Then GOSUB Level0
Next m
Return
A2hTcount:
For m=1 to
708 '2
hours (354 x 2, 2011.4.7)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (150<Vin)
AND (Vin=<225) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<140)
Then GOSUB Level5
If (m>=140) and
(m<280) Then GOSUB Level4
If (m>=280) and (m<420)
Then GOSUB Level3
If (m>=420) and
(m<560) Then GOSUB Level2
If (m>=560) and
(m<708) Then GOSUB Level1
If m=708 Then GOSUB
Level0
Next m
Return
A3hTcount:
For m=1 to
1062 '3 hours
(354 x 3, 2011.4.7)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
if (225<Vin)
AND (Vin=<300) then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<210)
Then GOSUB Level5
If (m>=210) and
(m<420) Then GOSUB Level4
If (m>=420) and
(m<630) Then GOSUB Level3
If (m>=630) and
(m<840) Then GOSUB Level2
If (m>=840) and
(m<1062) Then GOSUB Level1
If m=1062 Then GOSUB Level0
Next m
Return
A4hTcount:
For m=1 to
1416 '4 hours
(354 x 4, 2011.4.7)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (300<Vin)
AND (Vin=<375) then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<280)
Then GOSUB Level5
If (m>=280) and
(m<560) Then GOSUB Level4
If (m>=560) and
(m<840) Then GOSUB Level3
If (m>=840) and
(m<1120) Then GOSUB Level2
If (m>=1120) and
(m<1416) Then GOSUB Level1
If m=1416 Then GOSUB Level0
Next m
Return
A5hTcount:
For m=1 to
1770 '5 hours
(354 x 5, 2011.4.7)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (375<Vin)
AND (Vin=<450) then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<350)
Then GOSUB Level5
If (m>=350) and
(m<700) Then GOSUB Level4
If (m>=700) and
(m<1050) Then GOSUB Level3
If (m>=1050) and
(m<1400) Then GOSUB Level2
If (m>=1400) and (m<1770)
Then GOSUB Level1
If m=1770 Then GOSUB Level0
Next m
Return
A6hTcount:
For m=1 to
2124 '6 hours
(354 x 6, 2011.4.7)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (450<Vin)
AND (Vin=<525) then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<420)
Then GOSUB Level5
If (m>=420) and
(m<840) Then GOSUB Level4
If (m>=840) and
(m<1260) Then GOSUB Level3
If (m>=1260) and
(m<1680) Then GOSUB Level2
If (m>=1680) and
(m<2124) Then GOSUB Level1
If m=2124 Then GOSUB Level0
Next m
Return
A7hTcount: 'これ以下が前の電子工作54に新たに加わった部分
For m=1 to
2478 '7 hours (354 x
7=2478)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (525<Vin)
AND (Vin=<600) then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<490)
Then GOSUB Level5
If (m>=490) and
(m<980) Then GOSUB Level4
If (m>=980) and
(m<1470) Then GOSUB Level3
If (m>=1470) and
(m<1960) Then GOSUB Level2
If (m>=1960) and
(m<2478) Then GOSUB Level1
If m=2478 Then GOSUB Level0
Next m
Return
A8hTcount:
For m=1 to
2832 '8 hours (354 x
8=2832)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (600<Vin)
AND (Vin=<675) then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<560)
Then GOSUB Level5
If (m>=560) and
(m<1120) Then GOSUB Level4
If (m>=1120) and
(m<1680) Then GOSUB Level3
If (m>=1680) and
(m<2240) Then GOSUB Level2
If (m>=2240) and
(m<2832) Then GOSUB Level1
If m=2832 Then GOSUB Level0
Next m
Return
A9hTcount:
For m=1 to
3186 ‘9 hours (354 x
9=3186)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (675<Vin)
AND (Vin=<750) then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<630)
Then GOSUB Level5
If (m>=630) and
(m<1260) Then GOSUB Level4
If (m>=1260) and
(m<1890) Then GOSUB Level3
If (m>=1890) and
(m<2520) Then GOSUB Level2
If (m>=2520) and
(m<3186) Then GOSUB Level1
If m=3186 Then GOSUB Level0
Next m
Return
A10hTcount:
For m=1 to
3540 ‘10 hours
(354 x 10=3540)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (750<Vin)
AND (Vin=<825) then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<700)
Then GOSUB Level5
If (m>=700) and
(m<1400) Then GOSUB Level4
If (m>=1400) and
(m<2100) Then GOSUB Level3
If (m>=2100) and
(m<2800) Then GOSUB Level2
If (m>=2800) and
(m<3540) Then GOSUB Level1
If m=3540 Then GOSUB Level0
Next m
Return
A11hTcount:
For m=1 to
3894 ‘11 hours (354 x
11=3894)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (825<Vin)
AND (Vin=<900) then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<770)
Then GOSUB Level5
If (m>=770) and
(m<1540) Then GOSUB Level4
If (m>=1540) and (m<2310)
Then GOSUB Level3
If (m>=2310) and
(m<3080) Then GOSUB Level2
If (m>=3080) and
(m<3894) Then GOSUB Level1
If m=3894 Then GOSUB Level0
Next m
Return
A12hTcount:
For m=1 to
4248 '12 hours (354 x
12=4248)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (900<Vin)
then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
If (m>=1) and (m<840)
Then GOSUB Level5
If (m>=840) and
(m<1680) Then GOSUB Level4
If (m>=1680) and
(m<2520) Then GOSUB Level3
If (m>=2520) and (m<3360)
Then GOSUB Level2
If (m>=3360) and
(m<4248) Then GOSUB Level1
If m=4248 Then GOSUB Level0
Next m
Return
'LEDL5-1
displaying subroutines
LEDL5-1を表示するサブルーチン
Level5: High
LEDL1: High LEDL2: High LEDL3: High LEDL4: High LEDL5: Return
Level4: High
LEDL1: High LEDL2: High LEDL3: High LEDL4: Low LEDL5: Return
Level3: High
LEDL1: High LEDL2: High LEDL3: LOW LEDL4: Low LEDL5: Return
Level2: High
LEDL1: High LEDL2: LOW LEDL3: LOW LEDL4: Low LEDL5: Return
Level1: High
LEDL1: LOW LEDL2: LOW LEDL3: LOW LEDL4: Low LEDL5: Return
Level0: LOW LEDL1:
LOW LEDL2: LOW LEDL3: LOW LEDL4: Low LEDL5: Return
Finishing:
End
'****** End of
Program ********
'Note:
'melabs U2
Programmer's configurations for 16F886
'Oscillator - INTOSCIO, WDTE - Enable; Power-up
Timer – Enable (4.21 IMPORTANT), MCLR Pin Function - Reset, Brown-out Reset - Enable
'Internal External Switch Over -
Enable, Fail-Safe Clock Monitor - Enable, Low Voltage Programming - Enable,
'Code - Not Protected, Data EPPROM -
Not Protected, Brown-out Reset Voltage - 4.0V, Flash Program Memory Write – all
Simple Timer with Elapsed Time LED Indicator using PIC¢s Internal Clock (English version of the above Electronics Project 55 in Japanese, 2011.4.22)
This is a simple software controlled timer based on PIC¢s internal clock (4MHz). By changing the position of its Mode SW the timer can begin or stop the supply of AC100V to its outlet when a set time expires. You can select one out of 13 different time sets – 30min, 1,2,3,4,5,6,7,8,9,10,11,12hrs by simply rotating the variable resister (VR). This Timer may be durable because of no moving parts used and useful for various daily applications.
What have been found and comments:
1) A 28-pin 16F886 was used because it has more than 20 ports and 8K-program memory, compiled with PBP 2.50A.
2) Program is quite long (Lines assembled: 9901). The program list used (SimpleTimer16F886LvlCmp.bas) is shown in the above Japanese section though unreadable and quite messy.
3) Timer is surprisingly very accurate despite it uses the internal 4MHz-clock. The following are the test results conducted over 3 – 4 days at a room temperature of 10 – 20 degrees C.
Set time |
30 min |
1 hr |
2 hrs |
3 hrs |
4 hrs |
6 hrs |
8 hrs |
12 hrs |
Measured time |
30m 1s |
1hr 4s |
2hr 2s |
3hr 6s |
4hr 4s |
6hr 6s |
7hr 59m 57s |
12 hrs 27s |
Time difference |
1s |
4s |
2s |
6s |
4s |
6s |
-3s |
27s |
Error (%) |
+0.06 |
+0.11 |
+0.03 |
+0.06 |
+0.03 |
+0.03 |
-0.01 |
+0.06 |
4) How the Elapsed Time LED Indicator works? As time passes, LEDL5-1 black out one by one as shown below (in case of 1hr). That is, immediately after LEDL5 blacked out, the remaining time is 48 min. When only LEDL1 is lighting, the remaining time will be nearly zero to 12 min. This is a case of 1 hr. To calculate both remaining and lighting time range for 5 hr, for instance, simply multiply the figure of each column by 5.
In case of 1-hr set time
Black-out LED |
Remaining time |
Lighting time range |
LEDL5 |
48min |
60-48min |
LEDL4 |
36min |
48-36min |
LEDL3 |
24min |
36-24min |
LEDL2 |
12min |
24-12min |
LEDL1 |
0 |
12-0min |
Timer in aluminum box: The upper 5 LEDs are LEDL5-1, while the lower 13 LEDs are LED1-13.
Two lighting LEDs show that the set time is 1 hr and the time will expire in less than 12 min.
5) How to use this Timer: a) Connect whatever appliance
you want to the outlet, b) Turn ON the power SW, c) Select the position of Mode
SW (ON/OFF when time expires), d) Select a time on the LED1-13 by
rotating VR. Immediately after a time is
selected, the time counting begins. If you change the time setting by rotating
VR while time counting is proceeding, the time counting restarts from beginning.
6) (Additional
information 2011.5.5): It was found that GND of Power Source 5V needs
to be connected to Aluminum Box for
correct time counting.