ESP-01とDHT11を使ったサーバー

ESP-01の使い方が分かったので、温度センサーDHT11を組み合わせて、部屋の温度をサーバーから確認できるようにします。

回路図

f:id:ryuuseigo:20210222153442p:plain
回路図

DHT11は3.3V〜5.5Vの間で使えるそうなので、5Vで使うことにしました。
DHT11のデータピンはESP-01のRXに接続することで、ウェブサーバー上からDHT11の値を確認できるようになります。
ESP-01のTXとFTDIのRXを接続することで、シリアルモニタからも値を確認できます。

プログラム

#include <stdio.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <DHT.h>

#ifndef APSSID
#define APSSID "ESP01"
#define APPSK  "123456789"
#define DHTPIN 3 //DHTのDATAピンはESP-01のRXに接続
#define DHTTYPE DHT11
#endif

/* Set these to your desired credentials. */
const char *ssid = APSSID;
const char *password = APPSK;

DHT dht(DHTPIN, DHTTYPE);

ESP8266WebServer server(80);

/* Just a little test message.  Go to http://192.168.4.1 in a web browser
   connected to this access point to see it.
*/

float h; //湿度
float t; //気温(摂氏)
float f; //気温(華氏)

String form; //htmlを書き込む変数

/* プロトタイプ宣言 */
void handleRoot();
void dht_sensor();
void get_form();

void setup() {
  delay(1000);
  Serial.begin(115200);
  Serial.println();
  Serial.print("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.softAP(ssid, password);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.on("/", handleRoot);
 
  server.begin();
  Serial.println("HTTP server started");

  dht.begin();
  Serial.println("DHT11 started");
  
}

void dht_sensor() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}

/*formにhtml文を書き込む*/
void get_form() {
  form = 
  "<!doctype html>"
  "<html><head><meta charset=\"UTF-8\"/>"
  "<meta name=\"viewport\" content=\"width=device-width\"/>"
  "</head><body>"
  "湿度:"
  + String(h) +"%"
  "<br>"
  "気温:"
  + String(t) + "°C"
  "</body></html>";
}

void handleRoot() {
  dht_sensor();
  get_form();
  server.send(200, "text/html", form);
}

void loop() {
  dht_sensor();
  server.handleClient();
}

iPhoneからサーバーにアクセスすると非常にシンプルな画面が表示されます。

f:id:ryuuseigo:20210222154530j:plain
iPhoneの画面

このプログラムはブラウザの更新ボタンを押さないと値が更新されません。次は自動更新のプログラムを追加したいと思います。