ESP32でBME280から取得したデータをAmbientに送信する

BME280から取得したデータをESP32を使ってAmbientに送信する

Ambientとは

Ambientとは、IoTデータを簡単に可視化してくれるサービスです。こちらからアクセスできます。

今回はこのサービスを使い、BME280という温度・湿度・気圧が取得可能なセンサーをESP32で読み取り、リアルタイムにグラフ化して見てみようと思います。


実際に半日測定してみた様子↑

Ambientへの登録

Ambientを使うには

  1. アカウント作成
  2. チャンネルの作成
  3. チャンネルの鍵を取得
  4. 鍵の情報をプログラムに組み込む

の手順が必要です。順に解説します。

  1. Ambientにアクセスしてユーザー登録を行う
  2. ログイン後、チャネルを作るをクリック
  3. 新たにチャネルが生成されるので、ライトキーをメモしておく

    これで鍵が取得できました。試しにチャネルをクリックして中を見てみましょう。

完全に空の状態ですね。この後ライトキーを使ってデータを送信することで、自動でグラフが描かれるようになります。

事前準備

今回使う部品および回路はESP32で温度・湿度・気圧センサー「BME280」を使う(I2C)に記載している通りですので、これに従ってください。

また、今回は追加でAmbientのライブラリインストールが必要です。ライブラリマネージャでAmbientと調べて追加しましょう。

プログラム

#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "Ambient.h"
#define PERIOD 300
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
WiFiClient client;
Ambient ambient;

unsigned long delayTime;
float temp;
float pressure;
float humid;

const char* ssid = "yourssid";
const char* password = "yourpassword";

unsigned int channelId = *****; // AmbientのチャネルID(数字)
const char* writeKey = "exa3p1eke7"; // ライトキー

void setup() {
  Serial.begin(115200);
  bool status;
  status = bme.begin(0x76);  
  while (!status) {
    Serial.println("BME280 sensorが使えません");
    delay(1000);
  }
  delayTime = 1000;
  WiFi.begin(ssid, password);  //  Wi-Fi APに接続
    while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち
        delay(100);
    }

  Serial.print("WiFi connected\r\nIP address: ");
  Serial.println(WiFi.localIP());
  ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
}
void loop() { 
  temp=bme.readTemperature();
  pressure=bme.readPressure() / 100.0F;
  humid=bme.readHumidity();
  Serial.print("温度 ;");
  Serial.print(temp);
  Serial.println(" °C");
   
  Serial.print("気圧 ;");
  Serial.print(pressure);
  Serial.println(" hPa");
  Serial.print("湿度 ;");
  Serial.print(humid);
  Serial.println(" %");
  Serial.println();
  delay(delayTime);
  ambient.set(1, temp); // 温度をデータ1にセット
  ambient.set(2, humid); // 湿度をデータ2にセット
  ambient.set(3, pressure); // 気圧をデータ3にセット

  ambient.send(); // データをAmbientに送信

  delay(PERIOD * 1000);
}

解説

Ambientの動作部分のみ抜き出したのが以下のソースコードです。

#include "Ambient.h"
unsigned int channelId = *****; // AmbientのチャネルID(数字)
const char* writeKey = "exa3p1eke7"; // ライトキー

void setup(){
    ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
}
void loop(){
    ambient.set(1, temp); // 温度をデータ1にセット
    ambient.set(2, humid); // 湿度をデータ2にセット
    ambient.set(3, pressure); // 気圧をデータ3にセット

    ambient.send(); // データをAmbientに送信
}

上記のうち

  • チャネルID
  • ライトキー
  • WiFiのSSID
  • Wi-Fiのパスワード

はご自分の値で置き換えてください。

ambientのみ抜き出すと機能が明快ですね!
まずsetupでambient.beginにチャネルIDとライトキー、そしてWi-Fi接続したクライアントのオブジェクトを渡して、ambientとの通信を初期化します。

あとはloop内で.set()を呼び出すだけ。.set()の第一引数は何番目のデータ(グラフ)にデータを追加するかを指定します。第二引数にはその値を入れましょう。

最後に.send()を呼び出せば、送信完了です。

ここまで終わったら作成したチャネルを見に行ってみましょう。こんな感じのグラフが出ているはずです!

まとめ

便利な環境センサBME280とESP32のWi-Fi機能を使って、どこからでもセンサーの値が監視できるIoTシステムをAmbientの力を借りて構築しました。

もちろんBME280でなくても、値であれば何でも送信できます。赤外線センサーを付けて人の出入りをグラフから確認できたりするかもしれませんね!

「ESP32でBME280から取得したデータをAmbientに送信する」に4件のコメントがあります

  1. 吉島信哉

    済みませんうまくwifiに繋がらないようなので
    質問させて下さい。
    スケッチのssid,password,ambientのch-ID
    ライトキーは変更し自分のものを書き込みました。
    コンパイル、書き込みもOKです。
    がAMBIENTのグラフには何も表示されません。
    WIFIが接続されたという、確認はなにかの方法で出来るのでしょうか。
    済みません、教えて下さい。

    1. 吉島信哉

      今回wifi接続はNTTの光のルーターに
      PR-400MIにwifiの子機を差し込んで
      テストしていましたが、従来使っていたバファローのWZR-300HPをセットアップして接続した所直ぐに接続できました。
      原因は分かりません。
      すみません、お手間を取らせる事にならなくて良かったです。
      事後報告を致します。
      今後とも宜しくお願い致します。

      1. わくてく

        コメントありがとうございます。
        返信が遅くなりすみません。無事繋げたようでよかったです。

吉田 純造 へ返信する 返信をキャンセル

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