6分タイマー

HEART★6基板(OUT1~6にLED,IN1~IN4にSWを追加したシールド基板)とIchigoDakeを使った、6分タイマーです。

【サンプル】

タイマーは、1分単位で時間をセットし、時間が来たらアラームが鳴ります。
SAVE0にプログラムを保存しておけば、BTNを押しながら電源を入れると、タイマーのプログラムが自動スタートします。

1.プログラムスタート時はタイマーセットモードです。
セット中の時間分だけLEDが点灯します。
ボタンを操作して時間をセットします。
IN1(SW1) -1分減らす(最小1分)
IN4(SW4) +1分増やす(最大6分)
IN3(SW3) セット完了&スタート

2.タイマー動作中は、1秒毎にLEDの光が一周し、残り時間の数だけLEDが点滅します。
IN2(SW2)ボタンを押すとキャンセルとなり、1.のタイマーセットモードになります。

3.時間が来たら、全LEDが点滅し、アラームが鳴ります。
どれかボタンを押すと、1.のタイマーセットモードになります。

【ソースコード】

1’HEART*6タイマー v1.0 by NEXTDAY
10 LET[1],4,6,7,39,55,63:C=3:CLO

20 @SET
30 OUT [C]
40 GSB @SW(S): IF S CONT
50 GSB @SW(S): IF !S CONT
60 BEEP 20
70 C=C-(S=8&&C>1)+(S=1&&C<6)
80 IF S<>4 GOTO @SET
90 CLT:BEEP5,100

100 @TIMER
110 OUT 1<<(TICK()%60)
120 IF TICK()/15%2 THEN OUT [C-TICK()/3600]
130 GSB @SW(S): IF S=2 BEEP 50,50:GOTO @SET
140 IF TICK()<C*3600 GOTO @TIMER

150 @ALM
160 PLAY”O5$B8C6″
170 OUT TICK()/10%2*63:GSB @SW(S): IF !S CONT
180 BEEP
190 GOTO @SET

1000 @SW(S):S=!IN(4)*8+!IN(3)*4+!IN(2)*2+!IN(1):RTN

【プログラム説明】

10行目 配列[1]~[6]にLED点灯パターン値を設定します。
 [1] OUT3の点灯値      ”000100=4
 [2] OUT3,2の点灯値     ”000110=6
 [3] OUT3,2,1の点灯値    ”000111=7
 [4] OUT6,3,2,1の点灯値   ”100111=39
 [5] OUT6,5,3,2,1の点灯値  ”110111=55
 [6] OUT6,5,4,3,2,1の点灯値 ”111111=63
※LED3の位置(基板頂点)を基準にした点灯値を配列設定することで、プログラムをわかりやすくしています。
 変数C タイマーセットの値。初期値3分。
 CLO IchigoJamポートのリセット。
    これをしないとボタン(IN1~IN4)が利かなくなることがあります。

20行目~ タイマー設定モード
 現在のタイマ設定値のLEDを点灯させて、40-50行目でボタンが押されるのを待ちます。ボタンの値は変数Sに入力されます。
70行目 ボタンによって設定された時間をセットします。1~6分の範囲チェックも同時に行います。
80行目 IN3ボタン(セット完了)が押されるまで、タイマー設定を繰り返します。
90行目 TICK値をゼロにリセットしてタイマーを開始します(BEEP音で合図)。

100行目~ タイマーカウントダウン
110行目 60tick(1秒)毎にLED点灯を回転させます。
120行目 15tick(0.25秒)毎に残り時間のLED数を点灯させます(110行目と合わせて、結果的に点滅となる)
130行目 IN2ボタン(キャンセル)が押されていれば、タイマー設定へ行きます。
140行目 セットした時間まで、タイマーカウントダウンを繰り返します。

150行目~ アラーム
160行目 アラーム用のPLAY文を実行します($繰り返し)。
170行目 何かボタンが押されるまで、全LEDを点滅して待ちます(この行を繰り返し)。
190行目 タイマー設定へ行きます。

1000行目 ボタン入力サブルーチン
     変数Sに、SW1(IN1)からSW4(IN4)の論理和をセットします。
     SW1が押されたとき、S=1、
     SW2が押されたとき、S=2、
     SW3が押されたとき、S=4、
     SW4が押されたとき、S=8、がセットされます。
     例えば、SW1とSW4が押されていた時は、S=9となります。

※TICK()命令の応用例
TICK()の値は0~16383を常に繰り返し変化します。
この性質を利用すると、特定の数値パーターンを作ることができます。
たとえば、

A=TICK()/60
 これは、1秒ごとに、0,1,2,3,4,5,0,1,・・が変数Aに値が入ります。さらに、

A=TICK()/60%2 
 これは、1秒ごとに0,1,0,1,0,1,0,・・が変数Aに値が入ります(%は余りを求める計算式)。

A=TICK()/30%6+1
 これは、0.5秒(30Tick)ごとに、6で割った余りプラス1、
つまり、1,2,3,4,5,6,1,2,3,・・の値が変数A入ります。

【書式】  TICK()/t%n+c
 t  変化時間(1/60秒単位=t/60秒毎)
 n 出力範囲(2なら0,1,0,1・・、3なら0,1,2,0,1,2)
 c オフセット

【ソースコード:かんたん版】

20 @SET
70 INPUT”タイマーセット(1-6)?”,C
80 IF C<1 OR C>6 THEN BEEP: GOTO @SET
90 CLT:BEEP5,100

100 @TIMER
110 T=TICK()/3600: ?”アト “;C-T;”フン”
120 OUT C-T,1 : WAIT 10
130 OUT 0 : WAIT 10
140 IF T<C GOTO @TIMER


160 PLAY”O5 $B8C3″
190 GOTO @SET