知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

ESP8266(ESP-WROOM-02)とDHT11でIFTTT経由で温度と湿度をツイートする

ESP8266でWebリクエストを送るサンプルとして、安価な温度・湿度センサのDHT11を使ってIFTTT経由で温度と湿度をツイートするスケッチを作ってみました。

DHT11はGrooveコネクタで接続するだけのお手軽品を調達しました。

これならWio Nodeだとブレッドボード要らずで付属のケーブルで繋げるだけです。

 

ライブラリの追加

DHT11のライブラリはAdafruit社のものを使いました。

Arduino IDEのライブラリマネージャで次の2つのライブラリを追加します。

f:id:IntellectualCuriosity:20170316031341p:plain

f:id:IntellectualCuriosity:20170316031358p:plain

 

IFTTTのアプレット

長くなってしまうのでIFTTTの利用方法は割愛させてください。ごめんなさい。

作ったアプレット(スケッチ)はこんな感じです。

f:id:IntellectualCuriosity:20170316031718p:plain

 

ツイートサンプル

スケッチは長いので、先にツイート例をお見せします。

HDT11は精度が低く、温度で±2℃も誤差があるので27℃なんていう温度になってます...

f:id:IntellectualCuriosity:20170316031935p:plain

 

スケッチ

#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();
}