ESP8266でWebリクエストを送るサンプルとして、安価な温度・湿度センサのDHT11を使ってIFTTT経由で温度と湿度をツイートするスケッチを作ってみました。
DHT11はGrooveコネクタで接続するだけのお手軽品を調達しました。
これならWio Nodeだとブレッドボード要らずで付属のケーブルで繋げるだけです。
ライブラリの追加
DHT11のライブラリはAdafruit社のものを使いました。
Arduino IDEのライブラリマネージャで次の2つのライブラリを追加します。
IFTTTのアプレット
長くなってしまうのでIFTTTの利用方法は割愛させてください。ごめんなさい。
作ったアプレット(スケッチ)はこんな感じです。
ツイートサンプル
スケッチは長いので、先にツイート例をお見せします。
HDT11は精度が低く、温度で±2℃も誤差があるので27℃なんていう温度になってます...
スケッチ
#include <ESP8266WiFi.h>
#include "DHT.h"
// DHT11の設定
#define DHTPIN 5 // 使用するGPIOピン
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
// WiFiアクセスポイントの設定
const char *WIFI_SSID = "<SSID>";
const char *WIFI_PASSWORD = "<PASSWORD>";
// ITFFFの設定
const char *IFTTT_HOST = "maker.ifttt.com";
const char *IFTTT_URI = "/trigger/dht_read/with/key/<自分のMaker keyを設定>";
// DeepSleepのインターバル
const unsigned long DEEP_SLEEP_INTERVAL = 60 * 60 * 1000 * 1000; // 1時間
void setup() {
// Wio Nodeを使う場合は以下の2行をコメントアウト(センサーに電源を供給)
// pinMode(15, OUTPUT);
// digitalWrite(15,HIGH);
dht.begin();
// WiFiに接続
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Waiting for Wi-Fi connection");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\r\nConnected!");
}
void loop() {
// DHT11から温度と湿度を読み込む
delay(2000);
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.println("Temperature: " + String(t) + "C Humidity: " + String(h) + "%");
// IFTTTに温度と湿度を送る
RequestToIFTTT("?value1=my%20room&value2=" + String(round(t)) + "&value3=" + String(round(h)));
// DeepSleepに入る
Serial.println("Go to sleep...");
ESP.deepSleep(DEEP_SLEEP_INTERVAL, WAKE_RF_DEFAULT);
}
// IFTTTにリクエストを送る
void RequestToIFTTT(String param) {
WiFiClientSecure client;
while (!client.connect(IFTTT_HOST, 443)) {
delay(10);
}
client.print(String("GET ") + IFTTT_URI + param +
" HTTP/1.1\r\n" +
"Host: " + IFTTT_HOST + "\r\n" +
"User-Agent: ESP8266\r\n" +
"Connection: close\r\n\r\n");
while (!client.available()) {
delay(10);
}
Serial.println(client.readStringUntil('\r'));
client.flush();
client.stop();
}