ゆるく楽しむプログラミング

計測データをサーバーに送信 ~IoTデータ可視化サービスを使ってみる~

M5Stampで温湿度を計測し、計測値をインターネット上のサーバーに送信するIoT作成テスト
サーバーはIoTデータ可視化サービスAmbientを利用



DHT-11を使った温湿度計は 【温湿度センサー DHT11 (1-Wire接続)】のPaspberryPi PICO用のスケッチを流用出来ます。
※ピン番号を変更すればそのまま使えます。

M5Stumpに合わせた回路は▼


LEDはOLEDを使用しない場合に起動状態を確認する用です。
電源ONで点灯、WiFiに接続したら点滅、データをサーバーに送信したら消灯します。

データ送信の基本形

WiFi接続はボードライブラリのWiFiクラスを使用
Ambientへのデータ送信はAmbientからArduino(ESP32)用のライブラリが提供されています
  Ambientライブラリーのインストール
  Arduinoライブラリーリファレンス

主要な部分の処理がライブラリで提供されているので基本形はとても単純です

-- Ambientサーバーにデータを送信する基本形 --
※ <>を全角<>に置き換えています。コピペの際は注意してください。
/*
 * M5Stamp PICO IoT実験:最小構成
 */
#include <WiFi.h>
#include "Ambient.h"
DHT11 dht11 ;   // DHT11

// ----- NetWork Data ---
const char* ssid     = "****";
const char* password = "****";

WiFiClient client;
Ambient ambient;
unsigned int channelId = 12345 ;  // AmbientのチャネルID
const char* writeKey = "*******"; // ライトキー

void setup() {
  // Netwaorkに接続
  WiFi.begin(ssid, password);
  // 接続できるまで待つ
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  // チャネルIDとライトキーを指定してAmbientの初期化
  ambient.begin(channelId, writeKey, &client);
}

void loop() {
  // 温湿度読み取り
  dht11.readDTH11( );
  // 読み取った温湿度を浮動小数点型に変換
  float humid = (float)dht11.getHumidityN();
  float temp  = dht11.getTemperatureN() + dht11.getTemperatureD() / 10.0 ; 
  // 温度、湿度の値をAmbientに送信する
  ambient.set(1, String(temp).c_str()); // 温度を文字列に変換
  ambient.set(2, String(humid).c_str());// 湿度を文字列に変換
  ambient.send(); // サーバーに送信
  delay(5*60*1000) ; // 5分間待機
}

長期観測のための改良 ~WiFi再接続~

長時間継続して感想データを送信し続けるのでWiFiが切断した場合を想定しておきます。
送信前にWiFiの接続状態をチェックし、接続していない場合には再接続を行います
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.reconnect( ) ;
    int i = 0 ;
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      i++ ;
      if (i > 20) {
        delay(30000);
        return  ;
      }
    }
  }

NTPから現在時刻を取得

観測データの送信タイミングを一定(毎時00/05/10/15/20/25/30/35/40/45/50/55分)の5分おきにしたいので現在時刻を確認する時計が必要になります。
RTCを使用するのも一つの方法ですが、ESP32(M5Stack/M5Stamp)のボードライブラリにインターネットの時報(NTP:Network Time Protocol)を利用する機能が組み込まれていますのでコレを使用します。
configTime(long 時差 , int 夏時間 , char *NTP1 , char *NTP2=nullptr,char *NTP3=nullptr) で取得元を設定
getLocalTime(struct tm timeInfo *timeInfo) で。ローカルタイムを取得
  connectWiFi() ;
  configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp");
  struct tm timeInfo;
  getLocalTime(&timeInfo) ;
  int sendTime = timeInfo.tm_min ;

IoT温湿度センサーのスケッチ

DHT-11とSSD1307の操作をクラス化しています
WiFiのSSID/パスワード、AmbientのChannelID/Writecodeはご自分のモノを設定してくだ

M5Stamp-DHT11-Client.zip

解説動画