MQTTでデータが送信できるようになりましたので、何かデータを送ってみます。
ここではとりあえずBME280を接続して温湿度気圧のデータを送ってみることにします。
すでにたくさんの方が行われているのですが、今回はこちらのページを参考にさせていただきました。回路としても使用したセンサの基板は異なりますが、センサ自体はBME280ですので、同じ結線です。
次にソフトウェアですが、こちらも同ページを参考にさせていただきました。よって、ライブラリはこちらのものを利用させてもらいました。
前回のソースコードをベースに、BME280のコードを追加していきます。
まずは、ライブラリをダウンロードしてきて、
BME280_MOD-1022.cpp BME280_MOD-1022.h
の2つのファイルをプロジェクトのディレクトリに放り込みます。そして、冒頭の部分に
#include <Wire.h> #include "BME280_MOD-1022.h"
の2行を追加します。BME280の初期化関数として、以下の関数を追加します。
void BME280_setup(){ // I2Cの通信を開始 // SDA: GPIO4 // SCL: GPIO5 Wire.begin(4, 5); Serial.println("I2C start."); // BME280を初期化 BME280.readCompensationParams(); // オーバーサンプリングの回数を設定 BME280.writeOversamplingTemperature(os16x); BME280.writeOversamplingHumidity(os16x); BME280.writeOversamplingPressure(os16x); Serial.println("BME280 start."); }
この関数を呼び出す部分を setup() の最後に追加します。
void setup() { (中略) BME280_setup(); }
BME280で測定する関数を用意します。結果はグローバル変数で保持しています。
float temperature = 0.0; float humidity = 0.0; float pressure = 0.0; void BME280_loop(){ // BME280を1度だけ測定を行うモードに設定し計測が終わるまで待機 BME280.writeMode(smForced); while (BME280.isMeasuring()) { delay(1); } // BME280から測定値を読み取る BME280.readMeasurements(); temperature = BME280.getTemperature(); humidity = BME280.getHumidity(); pressure = BME280.getPressure(); }
JSONで出力するデータを生成する部分を修正します。
void buildmsg(){ (中略) char bufT[10],bufH[10],bufP[10]; dtostrf(temperature, 4, 2, bufT); dtostrf(humidity , 4, 2, bufH); dtostrf(pressure , 4, 2, bufP); snprintf(msg, MSG_BUFFER_SIZE, "{'date':'%04d/%02d/%02d'," "'time':'%02d:%02d:%02d'," "'utime':'%ld'," "'mac':'%s'," "'rssi':'%ld'," "'temp':'%s'," ← 追加部分 "'humidity':'%s'," ← 追加部分 "'pressure':'%s'" ← 追加部分 "}", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (long)t,MacStr,rssi, bufT,bufH,bufP ← 追加部分 ); }
ループ処理の中で、1分間に1回呼び出してデータを publish するように変更します。
void loop() { static unsigned char lastMinute = 99; : unsigned long now = millis(); if (now - lastMsg > 1000) { lastMsg = now; // 1秒間に1回の処理 // 1分間に1回の処理 time_t t = time(NULL); struct tm *tm = localtime(&t); unsigned char minute = tm->tm_min; if((minute != lastMinute) && (tm->tm_year+1900 > 2000)){ lastMinute = minute; ※NTPで時刻が設定できてから1分間に1回処理を行う BME280_loop(); buildmsg(); Serial.print("Publish message: "); Serial.println(msg); client.publish("outTopic", msg); } } }
これで以下のような感じで、1分間に1度、温湿度と気圧データが送信されます。
{'date':'2020/08/06','time':'17:36:00','utime':'1596702960','mac':'18FE34xxxxxx','rssi':'-49','temp':'31.70','humidity':'58.03','pressure':'1009.59'} {'date':'2020/08/06','time':'17:37:00','utime':'1596703020','mac':'18FE34xxxxxx','rssi':'-43','temp':'31.70','humidity':'58.86','pressure':'1009.49'}
ちょっと温度が高めに出ていますが、これはどうもESP-WROOM-02の自己発熱と、基板上の三端子レギュレータの発熱によるもののようです。