ESP-WROOM-02 で POST リクエストして ThingSpeak へクラウド保存

手段を問わず ThingSpeak へ POST リクエストさえすればクラウドへ蓄積できること、ESP-WROOM-02 で Wi-Fi 経由でインターネットに繋がること、また、センサーの値を取得できることがわかったので、ESP-WROOM-02 で ThingSpeak へデータを蓄積してみます。

HTTPS プロトコルで POST リクエストする処理はソースコードの後半部分です。

#include <ESP8266HTTPClient.h> // HTTPClient
#include <TickerScheduler.h>

const int UPDATE_SENSOR_INTERVAL_MSECS = 1 * 60 * 1000; // センサー更新間隔(ミリ秒)

// ThingSpeak
const char* THING_SPEAK_HOST = "api.thingspeak.com";
const char* THING_SPEAK_WRITE_API_KEY = "THING_SPEAK_WRITE_API_KEY_IS_HERE"; // 各自取得したキーに差し替え

TickerScheduler ts(1);
ESP8266WiFiMulti wifiMulti;

float temperature;  // 温度(セ氏℃)
float humidity;     // 湿度(%)

void updateSensor();

void setup() {
  // ESP-WROOM-02 は 115200
  Serial.begin(115200); // このシリアル通信はモニター用
  delay(10);

  //// Wi-Fi 接続 https://www.sglabs.jp/esp-wroom-02-wi-fi/

  //// 温湿度センサー初期化 https://www.sglabs.jp/esp-wroom-02-sensor/

  // タスク ID 0 として 60 秒ごとにセンサーの値を取得して ThingSpeak へ送信
  ts.add(0, UPDATE_SENSOR_INTERVAL_MSECS, updateSensor, true);
}

void loop() {
  ts.update();
}

void updateSensor() {
  temperature = dht.readTemperature();
  humidity = dht.readHumidity();

  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  if (wifiMulti.run() == WL_CONNECTED) {
    // Wi-Fi 接続できてたら ThingSpeak へ送信
    HTTPClient http;

    char url[128];
    sprintf(url, "https://%s/update/", THING_SPEAK_HOST);
    http.begin(url);

    // ThingSpeak API キーはヘッダーに
    http.addHeader("X-THINGSPEAKAPIKEY", THING_SPEAK_WRITE_API_KEY);
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");

    // POST パラメータ作る
    char params[128];
    char tempstr[4];
    char humistr[4];
    sprintf(params, "field1=%s&field2=%s", dtostrf(temperature, 1, 0, tempstr), dtostrf(humidity, 1, 0, humistr));
    // POST リクエストする
    int httpCode = http.POST(params);

    if (httpCode > 0) {
      // HTTP レスポンスコードが返ってくる
      Serial.printf("[HTTPS] POST... code: %d\n", httpCode);
    } else {
      // コネクションエラーになるとマイナスが返る
      // see https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h
      // HTTP client errors
      Serial.println("[HTTPS] no connection or no HTTP server.");
    }

    http.end();
  }
}

次は、 GET リクエストして JSON をパースしてみます。