DIYのWifi温度計 (ESP-WROOM-02, ThingSpeak, DHT22)

DIYのWifi温度計 (ESP-WROOM-02, ThingSpeak, DHT22)
ESP-WROOM-02, ThingSpeak, DHT22を使って、Wifi無線の温度計を作る。

測定データの例は、https://thingspeak.com/channels/97919

追記:自分でデータベースを用意する方法もあります。興味のあるかたは、以下の方を参考にどうぞ。
Raspberry Pi Web ServerRaspberry Pi を使う方法。
INAの日記


材料リスト

Wi−Fiモジュール ESP−WROOM−02 DIP化キット (650円)
http://akizukidenshi.com/catalog/g/gK-09758/

ブレッドボード BB−801 (200円)
http://akizukidenshi.com/catalog/g/gP-05294/

超小型USBシリアル変換モジュール (600円)
http://akizukidenshi.com/catalog/g/gM-08461/

温湿度センサ モジュール AM2302 (950円)
http://akizukidenshi.com/catalog/g/gM-07002/

ブレッドボード・ジャンパーコード(オス−オス)セット (220円)
http://akizukidenshi.com/catalog/g/gC-05159/

USBケーブル Aオス−マイクロBオス 1.5m A−microB (120円)
http://akizukidenshi.com/catalog/g/gC-07607/

低損失三端子レギュレーター 3.3V500mA TA48M033F(S Q) (100円)
http://akizukidenshi.com/catalog/g/gI-00538/

電池ボックス 単3×4本用 (60円)
http://akizukidenshi.com/catalog/g/gP-02678/

□単3形アルカリ乾電池 4本(百均ショップで購入可、〜100円)

タクトスイッチ (10個入) (120円) 必要個数2個
http://akizukidenshi.com/catalog/g/gP-08080/

カーボン抵抗(炭素皮膜抵抗) 1/2W 10kΩ (100本入) 必要個数3本
http://akizukidenshi.com/catalog/g/gR-07838/

はんだ付けに必要なもの:
□はんだゴテ(百均ショップで購入、〜300円)
□はんだ(百均ショップで購入、〜100円)

組立図
[:large]
写真には載っていないが単3を4本が電源。USB供給の電源だけでは電流容量が足りないので注意のこと。

ThingSpeak

Thingskpeakのチャンネルでは、field1が温度
field2が相対湿度

準備編:【IoTをDIY!】ThingSpeakで作る湿温度モニターを参照して、ThingSpeakのアカウントとチャンネルの設定などの前準備を行う。

プログラム
Arduino IDE 1.6.8でプログラムuploadする。
追記:アップロードするときは、”Mechanic Note PILOT神山ラボのブログ”で述べているように、IO0をGNDにつなぎ(写真の上のボタンを押したまま)、そのあとREST(またはRSTと表記、写真の写真のボタンを押して離す)をGNDに一旦落としてリセットしてからUPDOADする手順になります。

セッテイングはとりあえずどんな設定でも動くようだが、、、、一応こんなんでuploadしました。


プログラムは10分毎に温度と相対湿度を計測、計測後はdeep sleepモードになる省エネ運用になっている。

準備:ArduinoにESP-WROOM-02ボードを追加するを参照して、ArduinoIEDでESP-WROOM-02ボードが利用できるように前準備を行う。

準備:ここを参考に、DHTxx SensorのLibraryを入れる。

書き換えるのはプログラム中のXXXXの部分(""は消さない)。
const char* ssid = "XXXXX"; 
const char* password = "XXXXX";

const char* host = "api.thingspeak.com";
const char* thingspeak_key = "XXXX"; 

それぞれ、
自宅のWifiルーターのSSID
自宅のWifiルーターのパスワード
thingspeal.comで発行されたthingspeak_key

/*
    This sketch sends data via HTTP GET requests to thingspeak service every 10 minutes
    You have to set your wifi credentials and your thingspeak key.

*/

#include <ESP8266WiFi.h>
extern "C" {
#include "user_interface.h"
}
#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE, 30);

const char* ssid     = "XXXX";
const char* password = "XXXX";

const char* host = "api.thingspeak.com";
const char* thingspeak_key = "XXXX";

void turnOff(int pin) {
  pinMode(pin, OUTPUT);
  digitalWrite(pin, 1);
}

void setup() {
  Serial.begin(115200);


 turnOff(12);

  dht.begin();
  delay(100);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
//////////////
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

//int value = 0;

void loop() {
 
  delay(2000);
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  Serial.print(t);

  while (isnan(t) || isnan(h)) {
    delay(2000);
    t = dht.readTemperature();
    h = dht.readHumidity();
    Serial.print(t);
  }

  Serial.print("connecting to ");
  Serial.println(host);

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }


  String temp = String(t);
  String humidity = String(h);

  //  String voltage = String(system_get_free_heap_size());
  String url = "/update?key=";
  url += thingspeak_key;
  url += "&field1=";
  url += temp;
  url += "&field2=";
  url += humidity;
  //  url += "&field3=";
  //  url += voltage;

  Serial.print("Requesting URL: ");
  Serial.println(url);

  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  delay(10);

  // Read all the lines of the reply from server and print them to Serial
  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection. going to sleep...");
  delay(1000);
  // go to deepsleep for 10 minutes
  system_deep_sleep_set_option(0);
  system_deep_sleep(10 * 60 * 1000000);
}