でじたる百葉箱2(温度+紫外線ロガー)

昨年の「でじたる百葉箱」の温度センサーに紫外線センサーを追加し、LCD表示、LED×3、データ記録専用のEEPROMメモリーを、1枚のシールド基板にまとめたオリジナルのNEWでじたる百葉箱ができました。

手づくりのシールド基板を使って、あたらしいデータロガーを作りましょう。

目次


【1.ぶひん】

  1. IchigoJam-S ×1(PCN等
  2. IchigoSencersシールド基板 ×1(NextDayにて配布)
  3. 5Vバッテリー(単3×2本)×1(100円ショップ等)
  4. USB電源ケーブル ×1(100円ショップ等)

【IchigoSencersシールド基板】

  1. 温度センサーIC MCP9700A 秋月電子通商
  2. 紫外線センサーモジュール ML8511 秋月電子通商
  3. LCDモジュール16×2行 AQM1602Y 秋月電子通商
  4. LED1,2,3 (青、黄、赤)
  5. 512Kbit EEPROM

【使用するIchigoJamポート】

  1. ANA2:温度センサー
  2. ANA8:紫外線センサー(OUT4をモード変更して使用)
  3. OUT1:LED1(青色)
  4. OUT2:LED2(黄色)
  5. OUT3:LED3(赤色)
  6. I2C(#62):LCDモジュール
  7. I2C(#82):EEPROM

【2.しくみ】

【2-1 温度センサー】

IchigoJamのアナログポートに温度センサーの出力をつないで使うのですが、IchigoJamはどのようにして温度を知るのでしょうか。

温度センサーMCP9700のデータシート(部品を扱うための決まりごとを書いた説明書)には、次のように書かれています。

・温度0℃のとき、0.5Vを出力する。
・温度係数は、0.01V/℃(10.0mV/℃)。
・精度は、25℃のときは±1℃(0〜70℃範囲で最大±4℃)

一方、IchigoJamのアナログポートの値と入力電圧には、次の関係があります。
この関係は、基本的にどのセンサーと繋いでも変わることはありません。

・入力が0Vのとき、ANA命令の値は0になる(最小値)。
・入力が3.3Vのとき、ANA命令の値は1023になる(最大値)。
・入力0.5Vは、ANA命令の値は155です。

つまり、温度センサーが0℃を測定したときは、0.5Vの電圧をIchigoJamのアナログポートに出力しているのです。
ここでANA命令を実行すると、IchigoJamは155の値であることを人間に教えてくれます。

温度センサーは、1℃毎に出力電圧が0.01V変化する決まりを持っています。
温度が0℃から10℃に変わると、出力電圧も0.5Vから0.6Vに変化します。
ここでIchigoJamのANA命令を実行すると、0.6Vの電圧に応じた、186の値であることを教えてくれます。

つまり、直接「温度」をやり取りしているのではなく、

センサーもIchigoJamも「電圧」を共通の「ことば」として扱っている

のです。

温度とANA命令の値(測定値)の関係を表にすると、次のようになります。

温度(℃)-50-49.680400.971025.25070280*
電圧(V)00.0032260.50.510.60.751.01.23.3*
測定値011551581862333103721023*

*注意:実際に280℃(測定値1023)は測ることはできません。あくまでも計算上の値です。

横軸x:アナログポートの値(測定値)、縦軸y:温度(℃)

※注意:MCP9700センサーが測定できる温度は-40~70℃です。また、IchigoJamの動作保証温度範囲も-65~150℃です。しかし、電源(電池)の条件や精度を考えると、0~30℃(測定値155~248)くらいが、実用上の使用範囲になります。
マイナス温度も測れますが、冷蔵庫などで試すときは、結露や氷結に十分注意(特に電池や基板)しなければなりません(大人の方に判断してもらいましょう)。

さて、
コンピュータの世界では、0〜3.3Vの電圧値を、0から1023までの値にすることを、AD変換(アナログデジタルへんかん)と言います。
そして、この機能のことをADコンバータと呼んでいます。
さらに、1024通りの表現ができることを、「10bitの分解能がある」と言います。

【測定した温度の計算方法】

IchigoJamがセンサーの値(電圧)をデジタル値(測定値)をして認識していることはわかりました。
しかし、デジタル値を見ても私たちには、すぐには何度なのかがわかりません。
もちろん、IchigoJamが人間様の書いたデータシートを都合よく理解して、わかるようには変換してくれません。

そこで、IchigoJamに、温度を求める式を教えてあげる必要があります。

まず初めに、測定値から電圧を求めます。
次に、その電圧から温度を求めれば完成です。

測定値 × 3.3V ÷ 1023  = センサーの出力電圧(V)
(センサーの出力電圧 - 0.5V) ÷ 0.01V = 温度(℃)


これを合わせると、

((測定値 × 3.3V ÷ 1023) - 0.5V) ÷ 0.01V = 温度(℃)

となります。
整理すると・・・

(測定値 × 0.003226 - 0.5V) ÷ 0.01V = 温度(℃)

電卓やエクセル等で、正しい結果が出る式になっているか確かめてみましょう。

【IchigoJamで計算する方法】

温度を求める式はわかりました。
これで、プログラミングできるでしょうか。

残念ながらIchigoJamのBASICでは、整数の計算しかできません。

IchigoJamは小数計算ができません!

試しに、 10℃を求める式で確かめてみてください。
先の表から、10℃は測定値186になりますので、

A=186
T=(A*0.003226-0.5)/0.001
PRINT A,T

あれれ?な結果ですよね。
そもそも、計算できないと言っていそうです。

IchigoJamでプログラムするには、ちょっと工夫が必要なのです。
小数計算ができないなら、整数で計算するしかありません。
整数にするためには、式の中で使われている一番小さい数を10倍や100倍にして、整数になるようにすればよいのです。

今回の式で最小の数は、0.003226ですので、これを整数にするには・・・

元の値:0.003226
10倍:0.03226 小数点を切り捨てると 0 ・・計算には使えない
100倍:0.3226 小数点を切り捨てると 0 ・・計算には使えない

1000倍:3.226 小数点以下を切り捨てると 3
10000倍:32.26 小数点以下を切り捨てると 32

10000倍の32が計算に似合いそうです。
他の数も10000倍します。

(ANA命令の値 × 32 - 5000) ÷ 100 = 温度

これでIchigoJamで計算ができるようになりました。
IchigoJamおよび、電卓やエクセル等で検算して確かめてみましょう。

A=186
T=(A*32-5000)/100
PRINT A,T

186 9

結果はどうでしょう。
10(℃)の結果を期待しましたが、9(℃)の表示になっていますよね。
これは、元の式にて3.3V÷1023=0.0032としたことに生じた誤差と、IchigoJamBASICで整数除算をするので、小数点以下を切り捨てるための影響です。
3.3V÷1023の値は、本当は0.0032258・・・と続きます。

それでは、100000倍以上にして、322や3225で計算すればよいでしょうか。
実は、もう一つ限界があって、

IchigoJamは最大32767までしか数えられません(最小は-32768)

そのため、A=186のとき、PRINT A*322 は、本当は 59892 になるはずですが、IchigoJamは数えられらない値で計算しようとするので、おかしな結果を答えてしまいます。
どんな結果になるかは、自分自身で試してみてください。

IchigoJamに限らず、コンピュータの計算には、必ず誤差と限界があるのです。

では、でじたる百様箱で使うプログラムを書きましょう。

T=(ANA(2)*32-5000)/100
PRINT T;”゜C “

※もうひとつの計算方法※
わかりやすいように、電圧を基準に式を説明してきましたが、「温度センサーの使い方」に掲載したグラフを見てください。
このグラフは、測定値と温度の直接の関係です。
式は、(x-155)*0.3226 となります。
であれば、この式をIchigoJamBASICで計算可能な式として使ってもよいはずです。
その場合の式(整数計算)は、「(x-155)*323/1000」となります。
ただし、IchigoJamは32767までしか数えられないので、1000分の1したときの32℃までしか測れません。

T=(ANA(2)-155)*323/1000

当然、33℃以上はおかしな答えなので、そのときは、「暑すぎると IchigoJamは計算を怠けるんだよねー」と言って、IchigoJamの限界を友達に教えてあげましょう。


【2-2 紫外線センサーの使い方】

紫外線センサーも、温度センサーと同じく、測定値を電圧で出力します。
でも条件が違います。
ML8511のデータシートには、次の説明がありました。

・紫外線センサーは、UV-A(400~315nm)およびUV-B(315~280nm)に反応する。
・紫外線強度を電圧で出力する(単位はmW/cm2)。
 感度は波長365nm 10mW/平方cm時、2.2V出力です(0mW/平方cm時、1.0V出力)。
・係数は、0.12V/mW(120mV/mW)。

紫外線強度と測定値の、関係はつぎのとおりです。

紫外線(mW/㎝2)01357101519*
電圧(V)00.0032261.01.121.361.61.82.22.73.3*
測定値013103474224965706828731023*
横軸x:アナログポートの値(測定値)、縦軸y:紫外線強度(mW/cm2)

【測定した紫外線強度の計算方法】

温度測定の式と同じように、測定値から電圧を求めてから紫外線強度を計算します。

(測定値 × 0.003226 – 1.0V) ÷ 0.12V = 紫外線強度(mW/cm2)

IchigoJamで計算できるよう、10000倍します。

(測定値 × 33 - 10000) ÷ 1200 = 紫外線強度(mW/cm2)

A=682
U=(A*33-10000)/1200
? A,U

682 10

紫外線強度では、温度の時と異なり33を乗算しています。
これは、センサーの係数が大きいため、32だと計算誤差が大きくなってしまうための措置です。
センサの能力や測定範囲によっては、計算方法を変えていく必要があります。

では、 でじたる百様箱で使うプログラムを完成させましょう。
紫外線センサーのアナログポートは8番を使っています。
そのため、プログラムの最初に、AOUT 4,-1 命令を実行して、 アナログポート8番を使えるようにしてあげます。

実は、 IchigoJamはOUT4とANA8を同じICピンを使っていて、電源がONになったときは、初期値としてOUT4として使う約束がるのです。

OUT4,-1
U=(ANA(8)*33-10000)/1200
? U;”mW/cm2 “

代替式として、(測定値-310)*0.027 とすることもできます。
これは「」のグラフの式です。
IchigoJamのプログラムでは、1000倍するのではなく、除算で計算したほうがシンプルな式になります。
OUT4,-1
U=(ANA(8)-310)/37
? U;”mW/cm2″


※UVインデックス(UV指数)について※

紫外線強度とは別に、紫外線量を表すためにUVインデックスというのをよく使います。
センサーのデータシートを見ると、0〜2.7Vあたりが、UVインデックスの0〜15にだいたい対応しているようなので、IchigoJamでは、「(x-310)/33」の概算式で求めることができそうです。

10 OUT4,-1
20 ?”UV:”;(ANA(8)-310)/33:WAIT10:CONT


UVインデックスが3を超えたら日焼け止めを、8を超えたら外出はできるだけ控えたほうがよさそうですね。
なお、UVインデックスには単位はありません。


【2-3 LEDとLCDモジュールの表示】

でじたる百葉箱には、3個のLEDと文字表示ができるLCDモジュールがあります。

【LED】

IchigoJamのOUTポートに次のように繋がっています。

【LCDモジュール(AQM1602Y)】

IchigoJamのLCモジュールは、 16 × 2行のキャラクタ表示ができる出力装置になります。


【2-4 外部メモリ(EEPROM)への記録(保存)】


【3.プログラム】

【3-1 メインプログラム( SAVE0)

1 ‘デジタルヒャクヨウバコ2020 by NEXTDAY
5 CLT:OUT4,-1:L=4:P=1
10 CLS:?”No”;P;” キオン シガイセン”
20 T=(ANA(2)*32-5000)/100
30 U=(ANA(8)*33-10000)/1200
40 ?”     “;T;”゚C “;U;”mW”
50 BEEP100
60 IF T>20 OUT 1: BEEP 40
70 IF T>25 OUT 2: BEEP 20
80 IF T>30 OUT 4: BEEP 10
90 LET [0],T,U,P,TICK()/60
99   LRUN1  :’EEPROMカキコミ&LCDヒョウジ
100  @continu
110 LED1
120 WAIT 60*10
130 LED0
140 P=P+1
150 IF P<=60 GOTO 10
160 END

※別の等価式の例
20 T=(ANA(2)-155)*323/1000
30 U=(ANA(8)-310)/37

【プログラム説明】
・温度と紫外線強度を測定し記録するメインプログラムです。
・プログラムエリア0にSAVE0で保存して使用します。
・10秒間隔で10分間、60回(60プロット)の測定します。
・IchigoJamBASIC 1.4.x以降にて動作します

5行目
 初期設定(経過時間のリセット、ANA8ポートの準備、プロットNO、データ数)
10,40行目
 表示画面の作成(LCDへの表示を兼用)
20行目
 温度の測定。
 アナログポート(2)の値から温度(℃)を計算します。
 結果を変数Tに格納します。
30行目
 紫外線の測定
 アナログポート(8)の値から紫外線強度(mW/cm2)を計算します。
 結果を変数Uに格納します。
50~80行目
 測定した温度によって、指定のLEDを点灯します。
 21~25℃のときは青LEDを点灯。
 26~30℃のときは黄LEDを点灯。
 31℃以上のときは赤LEDを点灯。
 20℃以下は、どのLEDも点灯しない。
 同時にBEEP音も変えています。
90行目
 測定結果をメモリ(EEPROM)へ保存するデータの整理します。
 配列[0]に温度、[1]に紫外線、
 [2]に現在のプロット番号、[3]に経過時間(秒)を代入します。
99,100行目
 プログラムエリア1を実行します。
 ここで、90行目で配列に整理した内容を、実際にEEPROMへ保存し、
 LCDディスプレイへの表示を行います。
 プログラムエリア1の実行後、自動でこのプログラムの100行目に戻ってきますので、
 この100行目を削除しないように注意してください。
110,130行目
 IchigoJam基板上のLEDを、120行目のWAITの前後間だけ点灯します。
 LEDが点灯していれば、プログラムは動作中です。
 もし、エラーなどでプログラムが停止したり、電源が落ちてしまった場合、
 ほとんどの場合、LEDは消えたままの状態になります。
 プログラムが測定を終えて終了しても、LEDは消灯します。
 このようなしくみのことを、コンピュータ用語で「ウォッチドッグ」と言います。
120行目
 測定間隔を空けます。
140行目
 プロット番号(変数P)をカウントアップします。
 次の測定準備です。
150行目
 プロット番号(変数P)の値から、測定終了するかどうかを判断します。
 測定を続けるときは、10行目へジャンプします。
160行目
 プログラムを終了します。

【ポート】
ANA2 温度センサ
ANA8 紫外線センサ(OUT4をモード変更して使用)
OUT1 青LED
OUT2 黄LED
OUT3 赤LED

【変数】
L :1プロットにて記録するデータ個数(かならず1つ以上:このプログラムでは4固定)。
P :記録中のプロット番号
T :温度値の計算用
U :紫外線強度値の計算用
[0]:EEPROMに保存する温度 ℃ (0~70℃)
[1]: EEPROMに保存する 紫外線強度 mW/cm2 (0~19mW)
[2]: EEPROMに保存する プロットNo(1~ )
[3]: EEPROMに保存する 測定時間(経過秒:0~546秒まで(約9分間))


【3-2  ◆SAVE1 EEPROM データ書き込み(初期化)

1000 @EWRIT2:’Write(Init) to EEPROM
1010 N=0:IF !L ? “EEPROM Undefined L!”:BEEP100,50:LOAD0
1020 IF I2CR(82,#8E6,2,#8E4,2) ?”EEPROM I2C ERR!”:GOTO@ERR
1030 M=M+1
1035 IF M>16383/L*2 ?”EEPROM OverFlow M=”;M,N:GOTO@ERR
1040 N=M*L*2
1050 N=N<<8|N>>8&#FF
1060 IF I2CW(82,#8E6,2,#800,L*2) ?”EEPROM Write Error WP?”:GOTO@ERR
1070 N=0
1080 Z=I2CW(82,#8E6,2,#8E4,2)
1090 @END1:GOSUB @LCD
1100 IF FILE()=1 LRUN0,100 ELSE RTN

1111 @EINIT2:N=0:M=0

1112 IF I2CW(82,#8E6,2,#8E4,2) ?”EEPROM I2CW ERROR!”:GOTO@ERR
1113 IF I2CR(82,#8E6,2,#8E4,2) ?”EEPROM I2CR ERROR!”:GOTO@ERR
1114 IF M ?”EEPROM ライトプロテクト?”:GOTO@ERR
1115 ?”EEPROM ヲ ショキカ シマシタ”
1116 IF FILE()=1 LOAD0
1117 RTN
1900 @ERR:BEEP1,1000:CONT

9010 @LCD

9020 LET[96],640,64,#5639,#C6C,#C080,64
9030 Z=I2CW(62,#8C3,5)
9040 Z=I2CW(62,#8C0,3,#900,16)
9050 Z=I2CW(62,#8C8,3,#920,16)
9060 RTN

【プログラム説明】
LRUN1     EEPROMへデータを追加して書き込みし、LCDへの表示を実行します。
LRUN1,1111   EEPROMに保存されているデータを初期化します。


◆SAVE2 EEPROM データ表示
LRUN2 記録データの表示 (1画面ごと停止 表示)

2000 @EREAD:’Read from EEPROM
2010 CLS:N=0:Q=0
2020 IF I2CR(82,#8E6,2,#8E4,2) ?”EEPROM I2C ERROR!”:GOTO@ERR
2030 IF !M ?”EEPROM   NOT DATA”:BEEP100,50:GOTO @END2
2040 IF !L L=4:’INPUT”DATA length?”,L
2050 FOR I=1 TO M
2060  N=I*L*2
2070  N=N<<8|N>>8&#FF
2080  Z=I2CR(82,#8E6,2,#800,L*2)
2090  Q=Q+1
2100  ?”No”;DEC$(I,4);”  ,”;
2110  FOR J=0 TO L-1
2120   ?[J];”,”;
2130  NEXT
2140  ?
2150  IF Q<23 GOTO @L4
2160  IF !INKEY() AND !BTN() CONT ELSE Q=0
2170 @L4:NEXT
2180 @END2:LC0,POS(2),1
2190 IF !INKEY() AND !BTN() CONT
2200 IF FILE()=2 LOAD0
2210 RTN
2900 @ERR:BEEP1,1000:CONT

【プログラム説明】
LRUN2     EEPROMからデータを読んで、ディスプレイへ表示します。
       データが多いときは、1画面毎に表示が停止しますが、タクトSWかキーボドを押すと、
       次のデータを表示します。



サンプルプログラム
計測したデータをリアルタイムにグラフ表示します

・温度
1 ‘オンド_グラフ by NEXTDAY
10 CLS
20 A=ANA(2)
30 V=A*32/10
40 T=(V-610)/10
50 FOR Y=0 TO 20
51 C=30-Y
53 LOCATE 0,Y
54 PRINT C,CHR$(T>=C) ‘T<0 :0
55 NEXT
56 PRINT “———————–“
60 PRINT ” “;T;”゚C”
70 WAIT 60
80 GOTO 20


・温度と紫外線
1 ‘オンド+シガイセン_グラフ by NEXTDAY
10 CLS:OUT4,-1
20 A=ANA(2):U=(ANA(8)-310)/33
30 V=A*32/10
40 T=(V-610)/10
50 FOR Y=0 TO 20
51 C=30-Y
53 LOCATE 0,Y
54 ? C,CHR$(T>=C),” “,CHR$(U>=C/4) ,C/4
55 NEXT
56 PRINT “———————-“
60 PRINT ” “;T;”゚C “;”UV”;U
70 WAIT 60
80 GOTO 20


・温度(5回測定の平均)
1 ‘IchigoTemp(MPC9700) by NEXTDAY
10 CLS:CLV:CLT
15 INPUT “Max(30-40) :”,Q
20 [5]=[4]:[4]=[3]:[3]=[2]:[2]=[1]
22 A=ANA(2)
30 V=A*32/10
40 T=(V-610)/10
42 [1]=T
45 T=([1]+[2]+[3]+[4]+[5])/5
50 FOR Y=0 TO 20
51 C=Q-Y
53 LOCATE 0,Y
54 ? C,CHR$([1]>=C),” “;CHR$([2]>=C),” “;CHR$([3]>=C),” “;CHR$([4]>=C),” “ ;CHR$([5]>=C)
55 NEXT
56 PRINT “———————–“
60 PRINT ” “;[1],[2],[3],[4],[5];”゚C AVR=”;T;” “;TICK()/60;”sec”
70 WAIT 60
80 GOTO 20



この教材のプログラムは、福野氏が公開してくれたソースコードを元に修正を加えて再利用させていただきました。
2018-07-28 成層圏では地上より日焼けする?しない?
2018-08-08 IchigoJamでとことん計測!

この教材は「Creative Commons — CC BY-SA 4.0」の下に提供されています。