
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 をパースしてみます。