ESP32 BME280のデータをスマホでみる


WiFiとMQTTの準備

昨日、突貫工事で室内の湿度を外出先のスマホで見ることができるようになりました。
作業メモを書きます。

  1. センサーを読む (BME280 をSPIで読む)
  2. WiFiにつなぐ
  3. MQTT brokerの用意
  4. MQTT client でpublishする
  5. スマホのMQTT client でsubscribe する
  • ピン配置と接続について図とともに追記しました。(2019/10/12)

BME280のセンサー値を読む

BME280のデータを読む

センサーの仕様

を確認
- BME280の仕様書を入手してしっかり読む。べきだが英語であり、勘所も働かなく、ざっと読む。Bosch Sensortec社のページ にもあるが、それ以外にもいろいろ見つかった。

  • PIN配置を整理する。今どきは?SPI 通信にする。

  • まず購入したHiLetgo のBME280基盤のピン配置でSPI接続に必要なピン機能を確認する。ピンの名前をBME280の仕様書から分かる。ESP32側のSPI接続で使用するピンを確認する。GPIOの番号はプログラミングで使用するので大事。

  • それでそれらをSPI4線接続する。対応関係は以下の通り。slave の時に名前が変わっているので少しわかりにくいが、落ち着いて考えれば分かる。はず。

ESP32でのプログラミング

  • Adafruit のライブラリをインストールする。 you can go to Sketch > Include Library > Manage Libraries and type “adafruit bme280” to search for the library.  実はこんままだとビルドができないので、Adafruit Sensors も入れる
  • サンプルプログラムを開く。  SPIのピン配置の設定をする。
mbe280_mqtt.ino

#define BME_SCK  14
#define BME_MISO 12
#define BME_MOSI 13
#define BME_CS   15
Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);

これでセンサー値を読めるようになりました。

WiFiでネットに接続する

先ほどのプログラムに追加する。

#include <WiFi.h>

  WiFi.begin(ssid, password);

ただし、私の場合WiFi接続で失敗することがある。その場合、WiFi.status() が WL_CONNECTEDにならない。ので、リセットボタンを押す。今のところ、1回は必ず失敗し、2回目ではつながる、というパターン。

MQTT brokers

MQTTとは

  • MQTTはIoTのデータ通信で用いられている。小さなパケットで送れる。publication / subscription モデルで、publish する人と、それをsubscribe する人がいる。データにはトピックというタグ作られていて、これでsubscriber は自分の欲しいtopic のみを受信する。

  • publisher/subscriber は MQTT client でこれを仲介するのがMQTT broker であり、複数のMQTT client と一つのMQTT broker から構成される。ここでは、

    • ESP32+BME280がMQTT clientのpublisher として、センサー値をpublishする。
    • スマホアプリでMQTT client でセンサー値をsubscribe してセンター値を見る。
  • 無料のMQTT brokers

    • 無料のものを調べるとたくさんある。自分でRasPiなどサーバを持っていたら自作してもよいが、
    • 今回は外出先から global IPで通信したい
    • 外に公開するサーバのセキュリティに自信がない
    • 常時接続したい ということで、既存のサービスを利用することにしました。cloudMQTTを利用しました。
    • メールアドレスを登録する。
    • サービスは通信コストの低いコースを選択 (Cat)
    • 必要な情報:URL, ポート番号, ユーザ名, パスワードを確認する。
  • 他にも無料のものの情報がるサイトもあった。

センサーのデータをMQTT broker に上げる。

  • MQTT client を用意する。
WiFiClient espClient;
PubSubClient client(espClient);

を用意して、初期化する。

  client.setServer("", 0);/*!!! SET URL and port number !!! */
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client",usrname, passwd)) {
      Serial.println("connected");
      // Subscribe
      //client.subscribe("esp32/output");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
  • publish するときは、以下のような感じ。
    char tempString[8];
    float temperature = bme.readTemperature();
    dtostrf(temperature, 1, 2, tempString);
    client.publish("esp32/temperature", tempString);

スマホのアプリで利用

MQTT clientでアプリを検索するといろいろ出てきます。自分のスマホで今回動作実績があったのは、以下です。

  • IoT Controler 単純に数字をpublish しているのですが、それをこちらでsubscribe うすると、グラフ表示してくれました。便利だ。
  • MQTT client これは単純にsubscribe した情報をテキストで見るだけですが、確認できました。

  • これをgithub に上げたいのだが、できない。。。(2019/05/04) 

  • github に上げました。Setting の Danger Zone でmake publicにしました。https://github.com/xtkd77/sensor_cloud/blob/master/ESP32/sensor/bme280mqtt/bme280mqtt.ino 何かの役に立てばよいが。サンプルの貼り合わせだが、すこしずつリファクタリングしていきたい、とは思っています。(2019/05/05)