Search Code

Lekcja 31/31: Pomiar temperatury i wilgotności przez Wi-Fi za pomocą DHT11 i ESP01 SunFounder Kit

Lekcja 31/31: Pomiar temperatury i wilgotności przez Wi-Fi za pomocą DHT11 i ESP01 SunFounder Kit

Ten przewodnik projektowy przeprowadzi Cię przez budowę bezprzewodowego systemu monitorowania temperatury i wilgotności z użyciem modułu ESP8266 (ESP-01) oraz czujnika DHT11. Po ukończeniu projektu będziesz mieć urządzenie, które tworzy własny serwer internetowy, umożliwiający podgląd odczytów czujników w czasie rzeczywistym na dowolnym urządzeniu podłączonym do Twojej sieci lokalnej, takim jak smartfon, tablet czy komputer. To podstawowy projekt IoT, który pokazuje, jak połączyć fizyczny świat czujników z cyfrowym światem interfejsów internetowych.

Moduł ESP8266 ESP01

Umiejętności zdobyte podczas tego projektu są w dużym stopniu przenośne. Ta dokładna konfiguracja może być dostosowana do szerokiego zakresu praktycznych zastosowań, w tym:

  • Budowa zdalnej stacji monitorującej dla szklarni lub ogrodu w celu zapewnienia optymalnych warunków wzrostu.
  • Tworzenie prostego systemu automatyki domowej do monitorowania klimatu w konkretnym pomieszczeniu, takim jak piwnica na wino czy pokój dziecięcy.
  • Konfiguracja niskokosztowego rejestratora danych środowiskowych dla szkolnego projektu naukowego.
  • Opracowanie podstawowego systemu bezpieczeństwa lub alarmowego, który może powiadamiać o nagłych zmianach temperatury.

Sprzęt i komponenty

Aby śledzić ten projekt, będziesz potrzebować następujących komponentów. Głównymi elementami są moduł ESP8266 i czujnik DHT11, ale pozostałe są niezbędne do programowania i zasilania modułu.

  • Moduł ESP8266 (ESP-01S): Główny mikrokontroler z wbudowaną funkcją Wi-Fi.
  • Czujnik temperatury i wilgotności DHT11: Czujnik mierzący dane środowiskowe.
  • Płytka Arduino Uno (do konwersji USB-na-szeregowy): W tym projekcie główna płytka Arduino nie jest używana ze względu na jej moc obliczeniową. Zamiast tego jej układ USB-na-szeregowy służy do programowania modułu ESP8266.
  • Rezystor 330 omów: Używany do wstępnego testu migania diody LED w celu ograniczenia prądu.
  • Rezystor od 1k do 10k omów: Rezystor podciągający dla linii danych czujnika DHT11.
  • Dioda LED i przewody połączeniowe: Do fazy testowania i wykonania wszystkich niezbędnych połączeń.
  • Płytka stykowa (breadboard): Do tworzenia połączeń obwodu.

Schemat połączeń

Połączenia ESP8266 ESP01 i DHT11 do lekcji 31 kursu Sunfounder 3-w-1

Proces podłączania odbywa się etapami. Najpierw zbudujemy podstawowy obwód do programowania ESP-01. Wiąże się to z użyciem Arduino Uno jako programatora. Film wyraźnie pokazuje tę konfigurację. Kluczowe połączenia są następujące:

Aby wejść w tryb programowania, należy podłączyć pin IO1 (GPIO1) do masy (GND). To informuje ESP8266, że ma oczekiwać na nowe oprogramowanie układowe. Pozostałe połączenia do programowania to:

  • VCC (3.3V) do EN (Enable): To włącza moduł.
  • GND do GND: Wspólna masa dla obwodu.
  • VCC (5V) do VCC (5V): Do zasilania płytki programatora.
  • RX (ESP) do TX (Arduino): Do komunikacji szeregowej z programatora do modułu.
  • TX (ESP) do RX (Arduino): Do komunikacji szeregowej z modułu do programatora.
  • RST (Reset) do GND: To tymczasowe połączenie używane do zresetowania modułu po programowaniu.

Po zaprogramowaniu ESP-01 podłączenie czujnika jest proste. Czujnik DHT11 wymaga rezystora podciągającego na linii danych, aby zapewnić stabilną komunikację.

Dla konfiguracji czujnika połączenia są następujące:

  • DHT11 VCC (Pin 1) do 3.3V: Zasilanie czujnika.
  • DHT11 DATA (Pin 2) do GPIO2 (IO2) na ESP-01: Linia danych do odczytów czujnika. Rezystor podciągający od 1k do 10k omów powinien być podłączony między tą linią danych a linią zasilania 3.3V.
  • DHT11 GND (Pin 4) do GND: Wspólna masa dla czujnika.

Przygotowanie Arduino IDE

Aby zaprogramować ESP8266, musisz najpierw dodać obsługę tej płytki do swojego Arduino IDE. Odbywa się to w dwóch krokach:

  1. Dodaj URL Menedżera Płytek: Przejdź do Plik > Preferencje. W polu "Dodatkowe URL-e Menedżera Płytek" wklej następujący URL: http://arduino.esp8266.com/stable/package_esp8266com_index.json i kliknij "OK".
  2. Zainstaluj pakiet płytek ESP8266: Przejdź do Narzędzia > Płytka > Menedżer płytek.... Wyszukaj "esp8266", znajdź "esp8266 by ESP8266 Community" i kliknij "Zainstaluj". Po instalacji możesz wybrać płytkę, przechodząc do Narzędzia > Płytka > Płytki ESP8266 > Generic ESP8266 Module.

Instalacja biblioteki czujnika DHT

Kod opiera się na bibliotece do komunikacji z czujnikiem DHT11. Ta biblioteka musi być zainstalowana w Twoim Arduino IDE.

  1. Przejdź do Narzędzia > Zarządzaj bibliotekami....
  2. Wyszukaj "DHT sensor library".
  3. Znajdź bibliotekę autorstwa Adafruit i kliknij "Zainstaluj". Ta biblioteka upraszcza proces odczytywania danych z czujnika.

Projekt 1: Test migania diody LED

Zanim zagłębisz się w czujnik, kluczowe jest sprawdzenie, czy możesz z powodzeniem zaprogramować ESP-01. Robi się to za pomocą klasycznego przykładu „Blink”. Film pokazuje proces eksportowania skompilowanego pliku binarnego i użycia osobnego pliku wsadowego do jego wgrania, co jest obejściem dla konkretnej konfiguracji USB-szeregowy. Celem jest zobaczenie migającej wbudowanej diody LED, co potwierdza, że łańcuch programowania działa. Aby uruchomić moduł po zaprogramowaniu, musisz odłączyć przewód łączący IO1 z GND, a następnie chwilowo połączyć pin RST z GND, aby zresetować moduł.

Projekt 2: Odczyt DHT11 na monitorze szeregowym

Po potwierdzeniu programowania kolejnym krokiem jest podłączenie czujnika DHT11 i odczyt jego danych. Ten projekt używa przykładu DHTtester z biblioteki czujników DHT Adafruit. Kod jest skonfigurowany do użycia właściwego pinu i typu czujnika. Po wgraniu tego programu możesz otworzyć monitor szeregowy (ustawiony na 9600 bodów), aby zobaczyć odczyty temperatury i wilgotności.

Projekt 3: Konfiguracja serwera WWW

Ostatni projekt łączy wszystko. ESP8266 jest zaprogramowany tak, aby połączyć się z lokalną siecią Wi-Fi i hostować prostą stronę internetową. Ta strona wyświetla bieżące odczyty temperatury i wilgotności. Kod jest zmodyfikowaną wersją przykładu ESP8266 „HelloServer”. Film pokazuje, jak uzyskać dostęp do tych danych, wpisując adres IP urządzenia lub jego nazwę mDNS (np. robojaxDHT.local) w przeglądarce internetowej na dowolnym urządzeniu podłączonym do tej samej sieci.

Wyjaśnienie kodu

Ponieważ pełny program jest dostępny do pobrania, ta sekcja skupia się na kluczowych zmiennych konfigurowalnych przez użytkownika, które będziesz musiał dostosować do własnej sieci i preferencji. Kod jest zmodyfikowaną wersją przykładu ESP8266 „HelloServer”. Podstawowa logika obejmuje odczyt czujnika i formatowanie strony HTML w celu wyświetlenia danych.

Oto krytyczne części kodu, które będziesz musiał zmodyfikować:

// Dane logowania do Wi-Fi - MUSISZ JE ZMIENIĆ
const char* ssid = "TwojaNazwaWiFi"; // Zastąp nazwą swojej sieci Wi-Fi
const char* password = "TwojeHasloWiFi"; // Zastąp hasłem do swojej sieci Wi-Fi

To najważniejsza sekcja do zmiany. Zmienne ssid i password muszą dokładnie odpowiadać Twojej lokalnej sieci Wi-Fi. Nazwa Wi-Fi jest rozróżniana pod względem wielkości liter, więc upewnij się, że wpisujesz ją poprawnie.

// Konfiguracja czujnika DHT11
#define DHTPIN 2     // Cyfrowy pin podłączony do czujnika DHT (GPIO2)
#define DHTTYPE DHT11   // Typ czujnika DHT 11

Te definicje konfigurują czujnik. DHTPIN to pin GPIO na ESP8266, do którego podłączona jest linia danych czujnika (w tym przewodniku jest to GPIO2). DHTTYPE definiuje konkretny model czujnika. Gdybyś używał czujnika DHT22, należałoby odkomentować linię dla DHT22 i zakomentować tę dla DHT11.

// Zmienne konfigurowalne
const long interval = 3000; // milisekundy między odczytami czujnika
char temperature[] = "00.0";
char humidity[] = "00.0";

Zmienna interval kontroluje, jak często czujnik jest odczytywany, a strona internetowa aktualizowana. Domyślnie wynosi 3000 milisekund (3 sekundy). Możesz zwiększyć ją do wyższej wartości, np. 5000 lub 10000, aby zmniejszyć częstotliwość aktualizacji.

Kod zawiera również funkcję, która formatuje odczyt temperatury. Możesz wybrać wyświetlanie temperatury w stopniach Celsjusza lub Fahrenheita, modyfikując logikę w funkcji sendTemperature(). Film wyjaśnia, że zmienna Tvalue jest ustawiona tak, aby przechowywać odczyt w Celsjuszach, ale możesz ją zmienić, aby używać zmiennej Fahrenheita F.

Demonstracja projektu na żywo

Na filmie zaprezentowano ukończony projekt. Po wgraniu kodu i zresetowaniu modułu łączy się on z siecią Wi-Fi. Monitor szeregowy wyświetla status połączenia i adres IP urządzenia. Po przejściu na ten adres IP w przeglądarce internetowej można zobaczyć prostą stronę pokazującą bieżącą temperaturę i wilgotność. Demonstracja pokazuje odczyty aktualizowane w czasie rzeczywistym. Gdy czujnik DHT11 jest podgrzewany opalarką, odczyt temperatury na stronie internetowej odpowiednio wzrasta. Jeśli przewód danych czujnika zostanie odłączony, strona wyświetla „None” dla wartości czujnika, co jest przydatną funkcją do rozwiązywania problemów.

Rozdziały

  • [00:00] Wprowadzenie do projektu
  • [01:33] Zrozumienie ESP8266 i serwerów WWW
  • [05:47] Podłączanie ESP-01 do programowania
  • [08:51] Instalacja obsługi płytek ESP8266 w Arduino IDE
  • [11:47] Projekt 1: Miganie diodą LED za pomocą ESP8266
  • [20:28] Podłączanie czujnika DHT11
  • [22:34] Instalacja biblioteki czujnika DHT
  • [23:13] Projekt 2: Odczyt DHT11 na monitorze szeregowym
  • [30:10] Wyjaśnienie kodu dla projektu serwera WWW
  • [36:14] Projekt 3: Wgrywanie kodu serwera WWW
  • [38:42] Demonstracja: Wyświetlanie temperatury przez Wi-Fi
  • [41:43] Podsumowanie i rozwiązywanie problemów

Obrazy

ESP8266 ESP01 module
ESP8266 ESP01 module
esp8266 ESP01 and DHT11 wiring for lesson 31 Sunfounder 3-in-1 course
esp8266 ESP01 and DHT11 wiring for lesson 31 Sunfounder 3-in-1 course
895-Lesson 31/31: DHT11 and ESP01 over WiFi code
Język: C++

 /*
 * Display temperature using DHT11, DHT22 with NodeMCU ESP8266 
 * over WiFi in local network on computer o mobile devices
 * 
 * Written by Ahmad Shamshiri on Sep 27, 2019
 * in Ajax, Ontario, Canada
 * Watch video instruciton for this video: https://youtu.be/1A4-6hDARQc
 * 
 * I have combined DHT library of Adafruit with ESP8266 WebServer both links 
 * Adafruit DHT library on GitHub: https://github.com/adafruit/DHT-sensor-library
 * and 
 * ESP8266 on GitHub : https://github.com/esp8266/Arduino
 * Download and resource page https://robojax.com/RJT614

 * 
Get this code and other Arduono codes from Robojax.com


 * Code is available at https://robojax.com/RJT614
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>. 

*/

const int refresh=3;//3 seconds
// DHT settings starts
#include "DHT.h"
#define DHTPIN 2     // what digital pin we're connected to
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
float tValue, hValue;// 
char *simipleName="robojaxDHT";//android
// ****** DHT settings end (Robojax.com )


#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

#ifndef STASSID
#define STASSID "Robojax" // Your WiFi SSID
#define STAPSK  "100%Right" //Your WiFi password
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

ESP8266WebServer server(80);


void sendTemp() {

  String page = "<!DOCTYPE html>";
  page +="    <meta http-equiv='refresh' content='";
  page += String(refresh);// how often temperature is read
  page +="'/>";  
  page +="<html dir=\"rtl\">";
  page +="<body>"; 
  page +="<h1>&#1585;&#1591;&#1608;&#1576;&#1578; &#1608; &#1581;&#1585;&#1575;&#1585;&#1578; &#1578;&#1608;&#1587;&#1591; &#1583;&#1740; &#1575;&#1670; &#1578;&#1740;</h1>";
      
  page +="<p style=\"font-size:150px;\">&#1581;&#1585;&#1575;&#1585;&#1578;<br/>";  
  page +="<span style=\"color:red; font-size:150px;\">";
  page += String(tValue, 2);
  page +="&#176C</p>";

  page +="<p style=\"font-size:150px;\">&#1585;&#1591;&#1608;&#1576;&#1578;<br/>";  
  page +="<span style=\"color:red; font-size:150px;\">";
  page += String(hValue, 2);
  page +="%</p>";  
      
  page +="</body>";  
  page +="</html>";  
 server.send(200,  "text/html",page);

}

void handleNotFound() {
 
  String message = "File Not Found";
  message += "URI: ";
  message += server.uri();
  message += "Method: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "Arguments: ";
  message += server.args();
  message += "";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "";
  }
  server.send(404, "text/plain", message);

}

void setup(void) {
  // Robojax.com code for ESP8266 and DHT11 DHT22
   dht.begin();
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  if (WiFi.status() == WL_CONNECTED)
  {
    uint8_t macAddr[6];
    WiFi.macAddress(macAddr);
    Serial.printf("Connected, mac address: %02x:%02x:%02x:%02x:%02x:%02x", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
  }  
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin(simipleName)) {
    Serial.print("or view http://");
    Serial.println(simipleName);
  }

  server.on("/", sendTemp);

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  // Robojax.com code for ESP8266 and DHT11 DHT22
  server.handleClient();
  MDNS.update();//multicast DNS
  float c = dht.readTemperature();// Read temperature as Celsius (the default)
  float h = dht.readHumidity();// Reading humidity 
  float f = dht.readTemperature(true);// Read temperature as Fahrenheit (isFahrenheit = true)
    Serial.print(c);
    Serial.println(F("°C "));
 tValue =c;//save temperature for display
 hValue =h;//save humidity for display
  delay(300);// change this to larger value (1000 or more) if you don't need very often reading
  // Robojax.com code for ESP8266 and DHT11 DHT22
}

Zasoby i odniesienia

Brak zasobów.

Pliki📁

Kod Arduino (.ino)

Plik Fritzing

Instrukcja obsługi