ものづくり

【簡単IoT】AmbientでM5Stackから送信したCO2濃度をグラフ化する

n-mukineer
前の記事
【LINEで換気を注意喚起!】M5StackからWiFi通信でLINE通知する
【LINEで換気を注意喚起!】M5StackからWiFi通信でLINE通知する

こんにちは、えぬ(@nmukineer)です!

前回はM5StackをWiFiに接続できるようにしました。今回はAmbientというデータ可視化サービスを使ってCO2濃度をグラフ化してみたいと思います!

えぬ
えぬ

Ambientの始め方は以下の記事を参考にして下さい。

あわせて読みたい
クラウドIoTデータ可視化サービスAmbientの始めるための4ステップ
クラウドIoTデータ可視化サービスAmbientの始めるための4ステップ

プログラミング

ライブラリのインストール

今回はAmbient.hというライブラリを使用します。

インストール方法についてはAmbientのチュートリアルページに載っていますので参照してください。

Ambientの制約

Ambientは無料で使用できる分、アップロードできるデータレート(一定時間あたりにアップロードできるデータ数)には制限があります。

Ambientのページには以下のように書いてあります。

1チャネルあたり1日3,000件までデーターを登録できます。平均すると28.8秒に1回のペースです。

つまり、30秒に1回程度のデータ数であれば問題ないということになります。

今回は1分に1回としていますので、問題なしです。

えぬ
えぬ

ソースコード

今回作成したソースコードはこちらです。

#include <M5Stack.h>
#include <MHZ19_uart.h>
#include <HTTPClient.h>
#include "Ambient.h"

#define ARDUINO_ARCH_ESP32
#define PERIOD 60
#define THPPM 1000

WiFiClient client;
const char* ssid = "WiFiのSSIDを入れてください";
const char* password = "WiFiのパスワードを入れてください";

Ambient ambient;
unsigned int channelId = チャネルIDを入れてください; // AmbientのチャネルID
const char* writeKey = "ライトキーを入れてください"; // ライトキー

const int rx_pin = 16;	//Serial rx pin no
const int tx_pin = 17;	//Serial tx pin no

MHZ19_uart mhz19;

/*----------------------------------------------------------
    MH-Z19 CO2 sensor  setup
  ----------------------------------------------------------*/
void setup() {
  M5.begin();
  delay(100);
  Serial.println("Hello");
  mhz19.begin(rx_pin, tx_pin);
  mhz19.setAutoCalibration(false);

  int  i = 500;
  WiFi.begin(ssid, password);  //  Wi-Fi APに接続
  while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち
      M5.Lcd.setTextSize(3);
      M5.Lcd.setCursor(20,120);
      M5.Lcd.printf("Connecting...");
      i--;
      if(i<0){
        delay(250);
        M5.Power.reset();
      }
  }

  M5.Lcd.setTextSize(3);
  M5.Lcd.setCursor(20,120);
  M5.Lcd.printf("Connected!\n");
  M5.Lcd.clear();
  M5.Lcd.setBrightness(50);
  
  ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
}

/*----------------------------------------------------------
    MH-Z19 CO2 sensor  loop
  ----------------------------------------------------------*/
void loop() {
  unsigned long startt = millis(); // loopの開始時刻を記録
  int co2ppm = mhz19.getPPM();
  int temp = mhz19.getTemperature();
  ambient.set(1, co2ppm);
  ambient.set(2, temp);
  ambient.send();
  Serial.print("co2: "); Serial.println(co2ppm);
  Serial.print("temp: "); Serial.println(temp);
  M5.Lcd.clear();
  M5.Lcd.setTextSize(10);
  M5.Lcd.setCursor(20,120);
  M5.Lcd.printf("%dppm\n", (int)co2ppm);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(20,0);
  M5.Lcd.printf("RSSI:%d dBm", WiFi.RSSI());
  delay(PERIOD*1000);
  if(int(co2ppm) >= THPPM){
    send("CO2:"+String(co2ppm)+"ppm.");
    send("Please_do_ventilation_right_now!!");
  }
  delay(PERIOD*1000);
  wifi_lan_check();
}

/*
 * LINE Notifyにメッセージを送る
 *
 */
void send(String value1) {
  HTTPClient http;
  http.begin("https://notify-api.line.me/api/notify?message=" + value1);
  http.addHeader("Authorization", "Bearer トークンを入れてください");  //リクエストヘッダに先ほ>ど控えたトークンをセット
  int httpResponseCode = http.POST("POSTING from M5stack");
}

/*
 * void wifi_lan_check()
 *   WiFi Lan の監視をします。
 *   WiFi.status() で判断するよりも、ping で応答をチェックした方が、早いかも。
 */
void wifi_lan_check(){
  int i;
  if(WiFi.status() != WL_CONNECTED){
    M5.Lcd.clear();
    M5.Lcd.setTextSize(3);
    M5.Lcd.setCursor(20,120);
    M5.Lcd.printf("Connecting...");
    WiFi.disconnect();
    delay(50);
    WiFi.begin(ssid, password);
    i=50;
    while (WiFi.status() != WL_CONNECTED) {
      delay(250);
      i--;
      if(i<0){
        delay(250);
        M5.Power.reset();
      }
    }
  }
}

動作確認

M5Stackにプログラムを書き込んで動作確認してみます。

Ambientのボードのページにアクセスします。ボードの設定を行い、アップロードされたデータを見てみます。

こちらのように、CO2濃度(と温度)が折れ線グラフで可視化できてます!

Ambientで可視化したCO2濃度
ついでに温度も可視化

まとめ

M5StackとAmbientを連携して、測定したCO2データを可視化することができました。

次回は、GASにAPIを立ててM5StackからPOSTする、に挑戦したいと思います!

次の記事
GASで作ったAPIにM5StackからPOSTする方法
GASで作ったAPIにM5StackからPOSTする方法
前の記事
【LINEで換気を注意喚起!】M5StackからWiFi通信でLINE通知する
【LINEで換気を注意喚起!】M5StackからWiFi通信でLINE通知する
このブログを書いている人
えぬ
えぬ
N日後にムキムキになるエンジニア
WebアプリエンジニアとしてIoTシステムを開発中。30代折り返し。 趣味(モノづくり、プログラミング、筋トレ)や子育てのことを主に記事にします。 TOEIC: 900点/第一級陸上無線技術士/第3種電気主任技術者/技術士一次試験合格/基本情報技術者/第2種電気工事士/デジタル技術検定2級(情報・制御)
記事URLをコピーしました