データを定期的に記録するものをデータロガーといいます。これをIchigoJam単体でつくってみます。
まずはセンサー、人感センサー(焦電型赤外線センサーモジュール)を使うと、使って、居るか居ないかを記録してみます。 今回は便利なモジュールを使いましたが、「焦電センサ | マルツオンライン」を見るとセンサー単体で作るのも難しくないかも?
EEPROMを使えばどんどんデータを書き込むことができますが、今回はEEPROMを使わず、裏ワザ的にプログラム領域を使ってデータを記録してみます。
メモリマップを見ると#C00-#1000の1KBにプログラムが書かれることが分かります。FREE()コマンドで空き領域がわかるので、使っていない後ろの空き部分にデータを書き込みます。 IchigoJamのSAVE/LOAD、実はこの1KBの領域をまるっとそのまま書き込むのでデータの保存にも使えます。
?PEEK(#FFF) 0 POKE#FFF,15 ?PEEK(#FFF) 15 SAVE3 NEW ?PEEK(#FFF) 0 LOAD3 ?PEEK(#FFF) 15
このようにデータが保存できていることが分かります。ハイスコアの記録などにも使えますね!
ただしうっかりプログラム部分を書き換えてしまうと、プログラムが壊れてしまうので注意が必要です。
データ保存に使える場所は、#1000-FREE()-2 〜 #FFF までです(プログラム終端として別途2byte必要)
人感センサーを長いコードでつなぎ、単3電池x4を電源として使いました。
居るか居ないかという1bitの記録は、測定間隔30秒(D=3600/2)だと、33時間分記録できます。
今回は画面表示の都合上、1行30データとして、30bitを4byteデータして、#FFFから埋めています。
プログラム内部でSAVEコマンドを読んでおくことで、データ保存を実現!
1 'LOGGER 10 CLS:CLV:D=3600/2:L=(FREE()-2)/4 12 ?D/360*L/20;"HOURS" 15 ?HEX$(H,1);" ";:CLT 20 P=0:LED0 30 IF P=0 AND IN(1) LED1:BEEP:P=1 40 IF TICK()<=D GOTO 30 50 CLT:[M]=P:IF P ?"*"; ELSE ?"."; 60 M=M+1:IF M<30 GOTO20 80 FOR I=0 TO 31 STEP 8:N=0:FOR J=0 TO 7:N=N+[I+J]*1<<(7-J):NEXT:POKE#1000-H*4-I/8,N:NEXT 90 SAVE 95 H=H+1:H=H%L:M=0 98 GOTO 15 100 CLS:FOR H=0 TO L 120 FOR I=0 TO 31 STEP 8:N=PEEK(#1000-H*4-I/8):?BIN$(N,8);:NEXT 125 IF H%23=22 INPUT N 130 NEXT
5行にVIDEO0を加えると画面表示がなくなり省電力になります。
GOTO 100 で、保存されたデータを簡易的に表示します。
FREE()で300byte空いていたとして、自由に書き込める量は298*8bit=2384bit、1bit1分として39.7時間分!
とりあえず、実験用にテープで人感センサーを設置してみて、一晩置いてみました。
結果がこちら、夜中にネコはトイレにはいかなかったことがわかりました。
下の方1が朝、ちゃんと反応した時の記録。
イノシシシシステムはイノシシを扱いますが、こちらはネコ。
生身と対峙するものづくり、おもしろい!
今回は時間ごとの0か1かを書き込んでいますが、反応した時間を記録するのも手です。
いろんなものをセンシングして、インターネットにつなげばIoT、更に自由に使えるオープンデータにするときっと生まれる新しい価値。 誰もが手軽に使えるモジュールにして、カジュアルなリアルタイムオープンデータが増えるとますますおもしろいまちになりそうです! (参考、5つ星リアルタイムオープンデータ SPARQLを使った鯖江市論手川排水機場の水位表示アプリ)