ESP8266でMQTTクライアントを動かす(3)

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)