前回は ESP-WROOM-02 の開発ボードと BT18B20 の温度センサーを使ったが、今回は ESP-WROOM-02 DIP化キットと DHT11 の温湿度センサーで計測してみる。
やりたいこと
- ESP-WROOM-02 + DHT11 で温度と湿度を計測し、WiFi経由でサーバに送信する
- 開発ボードではなく ESP-WROOM-02 単体(DIP化済み)から組んでみたい
- 電池で駆動させたい
- 乾電池2本+DCDCコンバータで 3.3V を取り出す
購入したもの
秋月電子さんで下記を購入。
部品 | 価格(税込) |
---|---|
【K-09758】Wi-Fiモジュール ESP-WROOM-02 DIP化キット | ¥650 |
【M-08461】FT234X 超小型USBシリアル変換モジュール | ¥600 |
【P-03647】タクトスイッチ(黒色) | ¥10 |
【P-03650】タクトスイッチ(黄色) | ¥10 |
【P-02315】ブレッドボード・ジャンパーワイヤ 14種類×5本 | ¥300 |
【I-11577】3mm赤色LED 70° OSR5JA3Z74A | ¥10 |
【P-10196】電池ボックス 単3×2本 リード線・間仕切りあり | ¥50 |
【M-07003】温湿度センサ モジュール DHT11 | ¥300 |
【K-13066】3.3V出力昇圧DCDCコンバーター | ¥300 |
【R-16103】カーボン抵抗(炭素皮膜抵抗) 1/6W10kΩ (100本入) | ¥100 |
組み立て
-
開発準備と専用電源の製作・ESP-WROOM-02 を参考に配線した。
-
DHT11 を用いた温度と湿度の計測 - Arduino - 基礎からの IoT 入門 と データシート を参考に配線した。
-
片面ユニバーサル基板(ブレッドボード配線パターンタイプ) に配線するならこんな感じ(ESP-WROOM-02は真ん中に接続する)↓
スケッチ作成、動作確認
- adafruit/DHT-sensor-library: Arduino library for DHT11, DHT22, etc Temperature & Humidity Sensors と adafruit/Adafruit_Sensor: Common sensor library をライブラリに追加した。
- 下記のようなコードで計測、サーバ送信まで完了。
/**
* ESP-WROOM-02 + DHT11 で計測した温度・湿度を WiFi 経由で送信する
*/
# include <ESP8266WiFi.h>
# include <DHT.h>
# include "credencials.h"
# define READ_BUF_SIZE 4096
const int LED_PIN = 13;
const int PIN_DHT = 14;
DHT dht( PIN_DHT, DHT11 );
// API用パラメータ id : センサーを識別するID
const char* api_room_id = "dht11b";
// Server
const char* host = "IPアドレスなど";
const int httpPort = 80;
const char* path = "/hoge/fuga.php";
WiFiClient client;
char buf[READ_BUF_SIZE];
void setup() {
Serial.begin(115200);
Serial.println("");
// DHT11開始
dht.begin();
// LED 初期化
pinMode( LED_PIN, OUTPUT );
// WiFi 接続
setupWiFiConnection();
Serial.println("setup done");
}
void loop() {
digitalWrite( LED_PIN, HIGH );
delay(200);
digitalWrite( LED_PIN, LOW );
delay(200);
float percentHumidity = dht.readHumidity();
bool isFahrenheit = false;
float temperature = dht.readTemperature( isFahrenheit );
if (isnan(percentHumidity) || isnan(temperature)) {
Serial.println("ERROR");
return;
}
String s = "Temp: " + String(temperature, 1) + "℃ Humidity: " + String(percentHumidity, 0) + "%";
Serial.println(s);
// Serial.println(temperature);
// Serial.println(percentHumidity);
requestToServer(temperature, percentHumidity);
delay(5 * 60 * 1000);
}
void setupWiFiConnection() {
// 省電力化のために WiFi 接続を遅延する
Serial.println("Waiting...");
delay(2000);
Serial.println("OK");
WiFi.mode(WIFI_STA);
WiFi.begin(ap_ssid, ap_password, ap_channel);
Serial.print("Connecting to ");
Serial.println(ap_ssid);
// 接続中を表すLEDを付ける
digitalWrite( LED_PIN, HIGH );
int status = WL_IDLE_STATUS;
while ((status=WiFi.status()) != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
digitalWrite( LED_PIN, LOW );
Serial.println("");
Serial.println("WiFiに接続しました。");
Serial.print( "IPアドレス: ");
Serial.println( WiFi.localIP());
Serial.print( "ゲートウェイ: ");
Serial.println(WiFi.gatewayIP());
Serial.print( "サブネットマスク: ");
Serial.println(WiFi.subnetMask());
}
void requestToServer(float temp, float percentHumidity) {
if (!client.connect(host, httpPort)) {
Serial.println("接続に失敗しました。");
return;
}
client.print(String("GET ") + path + "?id=" + api_room_id + "&temp=" + temp + "&humid=" + percentHumidity + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 10000) {
Serial.println(">>> タイムアウトしました。");
client.stop();
return;
}
}
while (client.available()) {
char c = client.read();
}
}