10 BEEP 20 WAIT 60*60*60 30 GOTO 10
まずは、IchigoJamだけでできること。WAITは60で1秒なので、60倍して1分、さらに60倍して1時間。これで1時間おきにBEEPが鳴る?実はそうはなりません。なぜでしょう。
60*60は3600、もう10倍もするとIchigoJamの変数で扱える最大値32767を超えてしまいます。5分は収まるので12回繰り返して、1時間待ってもらいましょう。
20 FOR I=1 TO 12:WAIT 60*60*5:NEXT
WAITコマンドは指定の数だけ待ちますが、CPUは全力で動いています。これを休ませて、省エネにするのが、WAITの二番目のパラメーター。
20 FOR I=1 TO 12:WAIT 60*60*5,0:NEXT
コンマ0を付けると、画面が停止し、5分後に復帰し、また続きを実行して、また停止を繰り返します。停止している間、メモリなど極僅かに電気を使う状態になるのでぐっと省エネ、電池の持ちが良くなります。
ただ問題は、CPU付属のタイマーの精度が高くないことです。ぴったり1時間にはならず、ちょっとずつずれていきます。ずれる時間を計測して調整するのもありですが、個体差があるので、たくさん作る時には一工夫必要です。
そこで登場、RTC(リアルタイムクロック)モジュール!
(245円 at aitendo, 3コで960円 at Amazon)
IchigoJamとRTC、VCC/GND/SCL/SDA(IN3)を接続。SQWピンはアラーム割り込みピンとしても設定でき、BTN端子に接続して、1時間毎に起動と設定して、SLEEPコマンドを使っておくと、もっと省エネ。もっと正確に1時間置き実行が実現できます。
(SLEEPコマンドからの復帰は、RESETしてFILE0の自動起動となるので、ピンのI/O設定や、実行中の変数の値は消えることに注意!)
DS3231のデータシートを見て、アラーム設定。指定時間になったらSQW(INT)ピンが0になります。もう一度アラームがくるように、アラームフラグを0に戻しておく必要ありです。
100 POKE#700,0,0,#80,#80:?I2CW(#68,#7,#700,4) 110 POKE#700,`101:?I2CW(#68,#E,#700,1) GOTO 100 10 BEEP 20 POKE#700,0:?I2CW(#68,#F,#700,1) 30 SLEEP SAVE0 SLEEP
100行、110行が初期設定。一度実行すれば、RTCにアラーム設定が書き込まれます。 1時間置きをテストするのは時間がかかるので、1分置きにする場合は、100行を下記のように設定します。
100 POKE#700,0,#80,#80,#80:?I2CW(#68,#7,#700,4)
保存しSLEEPコマンド実行で眠ります。うまく設定できていれば、アラームで起動し、BEEPを鳴らし、20行でアラームフラグをリセットしてて再びSLEEPで眠ります。
100行のアラーム設定には、秒、分、時間、日時や曜日の設定できるので、現在時刻を設定して、オリジナルなスケジュールアラームづくりもいいですね!
非常ベルをつなげば、気づく確率アップ!
この2032電池を接続できるRTCモジュール、充電回路がついているとのことで、充電電池ではない電池を使う場合、この抵抗をニッパーでカットするなど、充電回路を遮断しておく方が安全そうです。(3.3Vで使う分にはリスクは低いらしい?)
links
- 「IchigoJamBASIC」「Lチカ」「カムロボ」「ドローン」……前原小学校が実践したプログラミング授業の全容公開! - バレッドプレス(VALED PRESS)