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


前回は 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

組み立て

  • ちょっと抵抗付きLEDがまぶしかったので抵抗をかまして弱めに変更

スケッチ作成、動作確認

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