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の自己発熱と、基板上の三端子レギュレータの発熱によるもののようです。
