ArduinoでIoTにチャレンジ<その6> Arduino MKR WiFi 1010に接続されたセンサからのデータをWebブラウザに表示する②
温度センサLM75Bは、デフォルトの設定で、特に何も設定することなく温度を読み取ることができます。コンフィグレーション・レジスタのb1を1に設定することで、コンパレータから割り込みに変更できます。割り込み処理を設定すると、O.S.の出力はパルスになります(まだ接続はしていない)。このパルスをArduinoの割り込み入力ポートに接続し、割り込み処理が発生したときはサーモスタットより複雑な処理が必要な場合にも対応できます。
これらは、温度の測定結果をWebブラウザに表示する処理を行った後別途検討します。
●測定結果をWebブラウザに表示する
LM75Bで測定した結果を「ArduinoでIoTにチャレンジ<その4>日付時刻を表示する」
の処理に追加します。
●世界標準時との時差の修正方法
4回目のRTCzeroライブラリを使用して日時を表示しています。この際、時刻表示の時差が9時間なので、次のようにHourの値を求める関数に9を加算して対応しました。
rtc.getHours() + 9 時が得られる時差の補正が必要
この処理では午前零時から9時までの間は、日付と時の値が正しくなりません。前回はこの時間帯にテストをしていなかったので気が付きませんでした。
時差の修正は、ルータから得た現在の日時 epoch(世界標準時)に24×60×60の時差分秒数を加算した値を加算します。
rtc.setEpoch(epoch+24*60*60);
この変更で、日時を得る関数は時差を補正した値になります。修正をお願いします。
●温度の測定
LM75Bの測定結果表示を追加します。また測定データを保存する方法を検討します。LM75Bでは、温度の測定は初期化の設定を特に行うことなくデータ・レジスタより取り出して行うことができます。setup()関数の中でWire.begin()を実行し、次の関数を定義します。
float getlm75tempe(byte adr){
Wire.requestFrom(adr,2);
while(Wire.available()){
int temp_data = Wire.read() << 8; // 温度レジスタの上位8ビット取得
temp_data =temp_data+Wire.read();
}
return (temp_data>>5)*1.25
}
以上の準備をしておくと温度を読み取る場所で、
tdata =getlm75btempe(adr);
と記述すれば、float型の変数tdataに温度をセットします。
●読み出すタイミング
第一ステップは、クライアントのWebブラウザから表示要求があったときに温度を測定して表示をします。日時の表示と同じタイミングです。
日時のデータを表示用の文字列に変換するには、次に示すsprintf()関数に追加します。
sprintf(tary, "%2d/%2d/%2d %2d:%2d:%2d", rtc.getYear(), rtc.getMonth(), rtc.getDay(), \
rtc.getHours() , rtc.getMinutes(), rtc.getSeconds());
この関数の仕様の欄に見出しとフォーマット temp= %5.2fを追加し、引数の最後に温度を呼び出す関数getlm75tempe(adr48)をセットします。
LM75BのI2Cのアドレス、adr48の定数を0x48、temp_dataの変数を定義します。
sesetup()関数にWire.begin()関数を追加しテストしてみます。
●温度表示のテスト結果
テスト結果は次のようなります。任意の時にプログラムの任意の場所でこの関数を呼び出すことで、温度を測定できます。
●温度をバッファのファイルに格納する
測定データの経時変化を調べられるように配列にデータを蓄積します。配列は実数型3000くらいのデータを格納する配列を、次のように定義します。
float ta[3000];
3000は配列の要素の数です。個々の配列を指定する指標は0から始まり2999までとなります。この最大値をENDPとして設定します。setpは配列を指定する指標で初期値は0で順番にカウントアップし最大値に達すると0に戻しています。
ttdata = getlm75tempe(adr48);
ta[setp] = ttdata;
setp = setp + 1;
if (setp > ENDP) {
setp = 0;
}
表示は保存データのうち最新データから10データ遡って表示します。arn[i]は表示する保存データの配列の指標を格納する10個の配列です。そのためarn[i]はint型の配列です。指標が0より小さくなるとENDPから遡るように、次のようにプログラムします。
int wsp = setp - 1;
for (int i = 0; i <= 9; i++) {
arn[i] = wsp;
wsp = wsp - 1;
if ( wsp < 1) {
wsp = ENDP;
}
}
Webブラウザに温度を表示するための文字列の作成は、次のsprintf()関数で作成します。
sprintf(tary2, "%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f%6.2f",ta[arn[0]],
ta[arn[1]], ta[arn[2]], ta[arn[3]], ta[arn[4]], \
ta[arn[5]], ta[arn[6]], ta[arn[7]], ta[arn[8]], ta[arn[9]]);
これらのプログラムを、第4回目に作成したプログラムに下記のように追加します。
作成した文字列をブラウザに表する次の命令も、
client.println(tary2);
前回の作成のプログラムのHTMLのbody部の最後に追加します。
以上修正した結果、次のように温度が表示されます。経時変化ですから時刻が必要になります。
次回は、経時変化を示すための時刻などの追加を検討します。スケッチは、下記からダウンロードできます。
(2022/03/10)
<神崎康宏>