高精度な温湿度計、SHT31の値を、IchigoJamで使える安価な外部ストレージ、EEPROMに記録し続けるデバイスを作ってみました。
秋月EEPROM「IchigoROM」の自由に使える64kbyteにデータをどんどん記録していくプログラム。
'EEPROM push (L:length) 500 @EPUSH:N=0:?I2CR(81,#8E6,2,#8E4,2),M 510 M=M+1:N=M*L*2:N=N<<8|N>>8&#FF:?I2CW(81,#8E6,2,#800,L*2):N=0:?I2CW(81,#8E6,2,#8E4,2):RTN 'EEPROM show data (L:length) 550 @ELIST:N=0:?I2CR(81,#8E6,2,#8E4,2),M 560 IF M FOR I=1 TO M:N=I*L*2:N=N<<8|N>>8&#FF:?I2CR(81,#8E6,2,#800,L*2);",";I;",";:FOR J=0 TO L-1:?[J];",";:NEXT:?:NEXT 570 RTN 'EEPROM reset 580 @ECL:N=0:M=0:?I2CW(81,#8E6,2,#8E4,2):RTN
記録する配列の長さL、L*2byteをブロックの単位として使う。EEPROMの境界があるので、Lは2の乗数で設定してください。
先頭ブロックには、データの格納数が入れ、その後ろにデータを順次書き足していきます。途中でデータサイズ(L)が変わることは想定していません。
* EEPROMの書き出しアドレスのエンディアン指定が間違っていました。正しくはビッグエンディアンです。
* EEPROMの書き込み境界を意識しないプログラムになっていました。先頭の長さを含め、Lを2の乗数にしての利用する必要があります。
使い方は、このように対応するサブルーチンを呼び出します。
GSB@ECL L=2 LET[0],3500,5000 GSB@EPUSH LET[0],3600,5100 GSB@EPUSH GSB@ELIST 0,0,3500,5000, 0,1,3600,5100,
SHT31を使った温度、湿度を計測するプログラムと組み合わせたものがこちら(5秒おきに計測して、記録する)
100 L=2 110 GSB@TH:?T,H 120 LET[0],T,H:GSB@EPUSH 130 WAIT 60*5 140 GOTO110 400 @TH:U=96:LET[U],#4401,#8808,#884A,#4350,#0C00,#4770:U=#800+U*2 410 POKE#700,#2C,#06:R=I2CR(#45,#700,2,#700,6) 420 [0]=17500:[1]=PEEK(#700)<<8|PEEK(#701):T=USR(U,#800)-4500 430 [0]=10000:[1]=PEEK(#703)<<8|PEEK(#704):H=USR(U,#800):RTN 500 @EPUSH:N=0:?I2CR(81,#8E6,2,#8E4,2),M 510 M=M+1:N=M*L*2:N=N<<8|N>>8&#FF:?I2CW(81,#8E6,2,#800,L*2):N=0:?I2CW(81,#8E6,2,#8E4,2):RTN 550 @ELIST:N=0:?I2CR(81,#8E6,2,#8E4,2),M 560 IF M FOR I=1 TO M:N=I*L*2:N=N<<8|N>>8&#FF:?I2CR(81,#8E6,2,#800,L*2);",";I;",";:FOR J=0 TO L-1:?[J];",";:NEXT:?:NEXT 570 RTN 580 @ECL:N=0:M=0:?I2CW(81,#8E6,2,#8E4,2):RTN
64kbyte(=65536byte)を、1データ4byteずつ書き込んでいくと、16383回で埋まる(埋まる判定はプログラムしていない)。時間にして23時間弱、計測間隔を伸ばせばその分長く記録できます。 GSB@ELISTで、記録したものをチェックしてみましょう!
特定温度で、警告を出したり、赤外線リモコンと組み合わせてエアコンを起動したり、IoTと連携して通知するなど活用ください。 グラフ化して考察するなど、夏休みの実験にもどうぞ!
links
- 秋月電子からIchigoJam用外部記憶キット「IchigoROM」登場!EEPROM活用テクニック
- 自分で創ったモノを売ってみよう!はじめてのしょうばい - 高性能温湿度計のつくりかた(SHT31編)