ESP-WROOM-02 と DHT11 で温湿度センサーを作る

[前回](https://qiita.com/takke/items/8d5e462368d86c11400f)は ESP-WROOM-02 の開発ボードと BT18B20 の温度センサーを使ったが、今回は ESP-WROOM-02 DIP化キットと DHT11 の温湿度センサーで計測してみる。

![2020-11-09 13.14.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39221/a589cea2-6491-7582-5ae3-68d448990360.jpeg)

# やりたいこと

- ESP-WROOM-02 + DHT11 で温度と湿度を計測し、WiFi経由でサーバに送信する
- 開発ボードではなく ESP-WROOM-02 単体(DIP化済み)から組んでみたい
- 電池で駆動させたい
    - 乾電池2本+DCDCコンバータで 3.3V を取り出す


# 購入したもの
秋月電子さんで下記を購入。

|部品|価格(税込)|
|---|---|
|【K-09758】Ｗｉ－Ｆｉモジュール　ＥＳＰ－ＷＲＯＯＭ－０２　ＤＩＰ化キット | ￥650 |
|【M-08461】ＦＴ２３４Ｘ　超小型ＵＳＢシリアル変換モジュール | ￥600 |
| 【P-03647】タクトスイッチ（黒色） | ￥10 |
| 【P-03650】タクトスイッチ（黄色） | ￥10 |
| 【P-02315】ブレッドボード・ジャンパーワイヤ　１４種類×５本 | ￥300 |
| 【I-11577】３ｍｍ赤色ＬＥＤ　７０°　ＯＳＲ５ＪＡ３Ｚ７４Ａ | ￥10 |
| 【P-10196】電池ボックス　単３×２本　リード線・間仕切りあり | ￥50 |
| 【M-07003】温湿度センサ　モジュール　ＤＨＴ１１ | ￥300 |
| 【K-13066】３．３Ｖ出力昇圧ＤＣＤＣコンバーター | ￥300 |
| 【R-16103】カーボン抵抗（炭素皮膜抵抗）　１／６Ｗ１０ｋΩ　（１００本入） | ￥100 |


# 組み立て

- [開発準備と専用電源の製作・ESP\-WROOM\-02](http://marchan.e5.valueserver.jp/cabin/comp/jbox/arc201/doc20101.html) を参考に配線した。

- [DHT11 を用いた温度と湿度の計測 \- Arduino \- 基礎からの IoT 入門](https://iot.keicode.com/arduino/temperature-dht11.php) と [データシート](chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html) を参考に配線した。

- 何回か試作してミニブレッドボード上に載せてみたらこんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39221/9fa83b3a-920c-be7e-4806-fd50e4c36f0d.png)


- [片面ユニバーサル基板（ブレッドボード配線パターンタイプ）](https://akizukidenshi.com/catalog/g/gP-08242/) に配線するならこんな感じ(ESP-WROOM-02は真ん中に接続する)↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39221/d10c80cc-4581-1ffb-38dd-b6c6c30f1c28.png)

- ちょっと抵抗付きLEDがまぶしかったので抵抗をかまして弱めに変更<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39221/8c07fa7a-f982-7acf-c0f5-f128598b93f7.png)







# スケッチ作成、動作確認

- [adafruit/DHT\-sensor\-library: Arduino library for DHT11, DHT22, etc Temperature & Humidity Sensors](https://github.com/adafruit/DHT-sensor-library) と [adafruit/Adafruit\_Sensor: Common sensor library](https://github.com/adafruit/Adafruit_Sensor) をライブラリに追加した。
- 下記のようなコードで計測、サーバ送信まで完了。

```c
/**
 * 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();
  }
}
```