電子工作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

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.

 

 

Menu Pageへ戻る

Topへ戻る