LoginSignup
0
0

ESP32-DevKitCによる温湿度測定(Wi-Fi機能の使用)

Last updated at Posted at 2024-01-17

はじめに

最近、趣味と勉強のためマイコンボードを使い始めました。
今回は、ESP32-DevKitC(以下ESP32)というマイコンボードでWi-Fi機能を使って温湿度測定を行いました。

ESP32のWi-Fi機能について

ESP32のWi-Fi機能にはステーション(STA)モードとアクセスポイント(AP)モードがあります。これらは次のように使い分けます。

  • STAモード
    ESP32を既存のWi-Fiネットワークのアクセスポイントに接続する場合に使います。PC等とESP32を無線LANルータを経由して接続するため、PC等でインターネットに接続しながらESP32に接続できます。
  • APモード
    ESP32自身をアクセスポイントとして、PCやスマホからアクセスする場合に使います。無線LANルータが無くてもPC等とESP32を接続できます。

ESP32のWi-Fi機能を使った温湿度測定

温湿度センサDHT11を用いて、Wi-Fi機能のSTAおよびAPモードを使った温湿度の測定を行いました。

温湿度センサとESP32の接続

温湿度センサにはDHT11を用いて、DHT11とESP32は以下のように接続しました。

  • DHT11のVDDをESP32の5Vへ接続
  • DHT11のGNDをESP32のGNDへ接続
  • DHT11のSIGをESP32の14ピンへ接続

マイコンボードESP32への温湿度センサDHT11の接続
20240115_205651.jpg

センサ裏面に書かれた電極名
20240115_205854_1.jpg

作成したArduino IDEのスケッチです。

STAモード

#include <WiFi.h>
#include <DHT.h>

const char* ssid = "Buffalo-G-1028"; //Wi-FiルータのSSID
const char* password = "************"; //Wi-FiルータのPASSWORD

const int PIN_DHT = 14;
DHT dht(PIN_DHT,DHT11);
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(100);
  WiFi.mode(WIFI_STA);
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to ");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    if (WiFi.status() == WL_CONNECT_FAILED) {
      Serial.println("Can't connect");
    }
  }
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
  dht.begin();
}

void loop() {
  WiFiClient client = server.available();
  if (client) {
    String currentLine = "";
    Serial.println("New Client.");
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n') {
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html; charset=utf-8;");
            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<head><meta http-equiv=\"refresh\" content=\"5\"></head><body><h1>ESP32とDHT11による温度・湿度の測定</h1><h2>温度 : ");
            client.println(dht.readTemperature(), 1);
            client.println("℃<br>湿度 : ");
            client.println(dht.readHumidity(), 1);
            client.println("%RH</h2></body></html>");
            client.println();
            Serial.println("温度 湿度");
            Serial.println(dht.readTemperature(), 1);
            Serial.println(dht.readHumidity(), 1);
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
      }               
    }
    client.stop();
    Serial.println("Client Disconnected.");
  }
}

APモード

#include <WiFi.h>
#include <DHT.h>

const char *ssid = "ESP32ap"; //任意の名前
const char *password = "12345678"; //任意のパスワード
const IPAddress ip(192,168,30,3);
const IPAddress subnet(255,255,255,0);

const int PIN_DHT = 14;
DHT dht(PIN_DHT,DHT11);
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  dht.begin();
  WiFi.softAP(ssid, password);
  delay(100);
  WiFi.softAPConfig(ip,ip,subnet);
  IPAddress myIP = WiFi.softAPIP();
  server.begin();
  Serial.print("SSID: ");
  Serial.println(ssid);
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  Serial.println("Server start!");
}

void loop() {
  WiFiClient client = server.available();
  if (client) {
    String currentLine = "";
    Serial.println("New Client.");
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n') {
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html; charset=utf-8;");
            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<head><meta http-equiv=\"refresh\" content=\"5\"></head><body><h1>ESP32とDHT11による温度・湿度の測定</h1><h2>温度 : "); 
            client.println(dht.readTemperature(), 1);
            client.println("℃<br>湿度 : ");
            client.println(dht.readHumidity(), 1);
            client.println("%RH</h2></body></html>");
            client.println();
            Serial.println("温度 湿度");
            Serial.println(dht.readTemperature(), 1);
            Serial.println(dht.readHumidity(), 1);
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
      }               
    }
    client.stop();
    Serial.println("Client Disconnected.");
  }
}

これら二つのスケッチにおいて、void loop()関数は全く同じです。
各スケッチを実行後、次の操作が必要になります。

  • STAモード
    Arduino IDEのシリアルモニタにIP adressが表示されるので、そのアドレスをスマホやPCのブラウザに打ち込むと温度と湿度が測定され表示されます。表示は5秒ごとに更新されます。
  • APモード
    スマホやPCをスケッチのssidで定義したアクセスポイントにWi-Fi接続します。passwordの入力を求められたら、それも入力します。
    スケッチで定義したIP adress 「192,168,30,3」をスマホやPCのブラウザに打ち込むと温度と湿度が測定され表示されます(表示は5秒ごとに更新されます)。私のPCでは、APモードでWi-Fi接続すると次のような表示になりました。
    Wifi.jpg
    ブラウザに温度と湿度が表示されている様子です。
    測定状態.jpg

開発環境

終わりに

何かのご参考になれば幸いです。

参考記事

  • M5StackでWifiをAPとSTAとで使い分ける

  • WIFI環境でESP32を使ったサーバーを立ててみよう!

  • ESP32 Arduino: ウェブサーバ上で温湿度センサの情報表示

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0