Les 31/31: Temperatuur en luchtvochtigheid meten via Wi-Fi met behulp van DHT11 en ESP01 SunFounder Kit
Deze projectgids leidt je door het bouwen van een draadloos temperatuur- en luchtvochtigheidbewakingssysteem met behulp van een ESP8266 (ESP-01) module en een DHT11-sensor. Aan het einde heb je een apparaat dat zijn eigen webserver creëert, waarmee je real-time sensorwaarden kunt bekijken op elk apparaat dat is verbonden met je lokale netwerk, zoals een smartphone, tablet of computer. Dit is een fundamenteel IoT-project dat laat zien hoe je de fysieke wereld van sensoren kunt overbruggen met de digitale wereld van webinterfaces.
De vaardigheden die je hier leert, zijn zeer overdraagbaar. Deze exacte opstelling kan worden aangepast voor een breed scala aan praktische toepassingen, waaronder:
- Het bouwen van een extern bewakingsstation voor een kas of tuin om optimale groeiomstandigheden te garanderen.
- Het creëren van een eenvoudig domoticasysteem om het klimaat in een specifieke kamer te bewaken, zoals een wijnkelder of een babykamer.
- Het opzetten van een goedkope milieugegevenslogger voor een schoolwetenschapsproject.
- Het ontwikkelen van een basisbeveiligings- of alarmsysteem dat je kan waarschuwen bij plotselinge temperatuurveranderingen.
Hardware en componenten
Om dit project te volgen, heb je de volgende componenten nodig. De primaire componenten zijn de ESP8266-module en de DHT11-sensor, maar de rest is essentieel voor het programmeren en voeden van de module.
- ESP8266 (ESP-01S) module: De kernmicrocontroller met ingebouwde Wi-Fi-mogelijkheid.
- DHT11 temperatuur- en luchtvochtigheidssensor: De sensor die de omgevingsgegevens meet.
- Arduino Uno-bord (voor USB-naar-serieel-conversie): In dit project wordt het hoofd-Arduino-bord niet gebruikt voor zijn verwerkingskracht. In plaats daarvan wordt de USB-naar-serieel-chip gebruikt om de ESP8266-module te programmeren.
- 330-ohm-weerstand: Gebruikt voor de initiële LED-knippertest om de stroom te beperken.
- 1k-ohm tot 10k-ohm-weerstand: Een pull-upweerstand voor de datalijn van de DHT11-sensor.
- LED en jumperdraden: Voor de testfase en het maken van alle benodigde verbindingen.
- Breadboard: Voor het maken van de circuitverbindingen.
Bekabelingsgids
Het bekabelingsproces gebeurt in fasen. Eerst stellen we het basiscircuit op om de ESP-01 te programmeren. Dit omvat het gebruik van de Arduino Uno als programmeur. De video toont deze opstelling duidelijk. De belangrijkste verbindingen zijn als volgt:
Om de programmeermodus te activeren, moet je de IO1 (GPIO1)-pin verbinden met aarde (GND). Dit vertelt de ESP8266 om te wachten op nieuwe firmware. De rest van de verbindingen voor het programmeren zijn:
- VCC (3.3V) naar EN (Enable): Dit schakelt de module in.
- GND naar GND: Gemeenschappelijke aarde voor het circuit.
- VCC (5V) naar VCC (5V): Om het programmeerbord van stroom te voorzien.
- RX (ESP) naar TX (Arduino): Voor seriële communicatie van de programmeur naar de module.
- TX (ESP) naar RX (Arduino): Voor seriële communicatie van de module naar de programmeur.
- RST (Reset) naar GND: Dit is een tijdelijke verbinding die wordt gebruikt om de module na het programmeren te resetten.
Zodra de ESP-01 is geprogrammeerd, is de bekabeling voor de sensor eenvoudig. De DHT11-sensor vereist een pull-upweerstand op zijn datalijn om stabiele communicatie te garanderen.
Voor de sensoropstelling is de bekabeling als volgt:
- DHT11 VCC (pin 1) naar 3.3V: Voeding voor de sensor.
- DHT11 DATA (pin 2) naar GPIO2 (IO2) op ESP-01: De datalijn voor sensorwaarden. Een pull-upweerstand van 1k-ohm tot 10k-ohm moet worden aangesloten tussen deze datalijn en de 3.3V-voedingslijn.
- DHT11 GND (pin 4) naar GND: Gemeenschappelijke aarde voor de sensor.
De Arduino IDE voorbereiden
Om de ESP8266 te programmeren, moet je eerst de bordondersteuning toevoegen aan je Arduino IDE. Dit gebeurt in twee stappen:
- Voeg de Board Manager-URL toe: Ga naar
Bestand > Voorkeuren. Plak in het veld "Extra boards manager-URL's" de volgende URL:http://arduino.esp8266.com/stable/package_esp8266com_index.jsonen klik op "OK". - Installeer het ESP8266-bordpakket: Navigeer naar
Extra > Bord > Boards Manager.... Zoek naar "esp8266", vind "esp8266 door ESP8266 Community" en klik op "Installeren". Na installatie kun je het bord selecteren door naarExtra > Bord > ESP8266 Boards > Generic ESP8266 Modulete gaan.
De DHT-sensorbibliotheek installeren
De code is afhankelijk van een bibliotheek om met de DHT11-sensor te communiceren. Deze bibliotheek moet worden geïnstalleerd in je Arduino IDE.
- Ga naar
Extra > Bibliotheken beheren.... - Zoek naar "DHT sensor library".
- Vind de bibliotheek van Adafruit en klik op "Installeren". Deze bibliotheek vereenvoudigt het proces van het lezen van gegevens van de sensor.
Project 1: LED-knippertest
Voordat we in de sensor duiken, is het cruciaal om te verifiëren dat je de ESP-01 succesvol kunt programmeren. Dit wordt gedaan met het klassieke "Blink"-voorbeeld. De video toont een proces van het exporteren van het gecompileerde binaire bestand en het gebruik van een apart batchbestand om het te flashen, wat een oplossing is voor de specifieke USB-naar-serieel-opstelling. Het doel is om de ingebouwde LED te zien knipperen, wat bevestigt dat de programmeerketen werkt. Om de module na het programmeren te laten draaien, moet je de draad die IO1 met GND verbindt loskoppelen en vervolgens de RST-pin kort met GND verbinden om de module te resetten.
Project 2: DHT11 lezen op de seriële monitor
Zodra het programmeren is bevestigd, is de volgende stap om de DHT11-sensor aan te sluiten en de gegevens ervan te lezen. Dit project gebruikt het DHTtester-voorbeeld uit de Adafruit DHT-sensorbibliotheek. De code is geconfigureerd om de juiste pin en het juiste sensortype te gebruiken. Na het flashen van dit programma kun je de seriële monitor openen (ingesteld op 9600 baud) om de temperatuur- en luchtvochtigheidswaarden te zien.
Project 3: De webserver instellen
Het laatste project combineert alles. De ESP8266 is geprogrammeerd om verbinding te maken met je lokale Wi-Fi-netwerk en een eenvoudige webpagina te hosten. Deze pagina toont de live temperatuur- en luchtvochtigheidswaarden. De code is een aangepaste versie van het ESP8266 "HelloServer"-voorbeeld. De video demonstreert hoe je toegang krijgt tot deze gegevens door het IP-adres van het apparaat of de mDNS-naam (bijv. robojaxDHT.local) in een webbrowser op elk apparaat dat met hetzelfde netwerk is verbonden, in te voeren.
Uitleg van de code
Aangezien het volledige programma beschikbaar is om te downloaden, richt dit gedeelte zich op de belangrijkste door de gebruiker configureerbare variabelen die je moet aanpassen voor je eigen netwerk en voorkeuren. De code is een aangepaste versie van het ESP8266 "HelloServer"-voorbeeld. De kernlogica omvat het lezen van de sensor en het opmaken van een HTML-pagina om de gegevens weer te geven.
Hier zijn de kritieke delen van de code die je moet aanpassen:
// Wi-Fi-inloggegevens - JE MOET DEZE WIJZIGEN
const char* ssid = "YourWiFiSSID"; // Vervang door de naam van je Wi-Fi-netwerk
const char* password = "YourWiFiPassword"; // Vervang door je Wi-Fi-wachtwoord
Dit is het belangrijkste gedeelte om te wijzigen. De variabelen ssid en password moeten exact overeenkomen met je lokale Wi-Fi-netwerk. De Wi-Fi-naam is hoofdlettergevoelig, dus zorg ervoor dat je deze correct invoert.
// DHT11-sensorconfiguratie
#define DHTPIN 2 // Digitale pin verbonden met de DHT-sensor (GPIO2)
#define DHTTYPE DHT11 // DHT 11-sensortype
Deze definities stellen de sensor in. DHTPIN is de GPIO-pin op de ESP8266 waarmee de datalijn van de sensor is verbonden (in deze handleiding is dat GPIO2). DHTTYPE definieert het specifieke sensormodel. Als je een DHT22-sensor zou gebruiken, zou je de regel voor DHT22 uitcommentariëren en die voor DHT11 in commentaar zetten.
// Configureerbare variabelen
const long interval = 3000; // milliseconden tussen sensoruitlezingen
char temperature[] = "00.0";
char humidity[] = "00.0";
De variabele interval bepaalt hoe vaak de sensor wordt uitgelezen en de webpagina wordt bijgewerkt. De standaardwaarde is 3000 milliseconden (3 seconden). Je kunt dit verhogen naar een hogere waarde zoals 5000 of 10000 om de frequentie van updates te verminderen.
De code bevat ook een functie die de temperatuurwaarde opmaakt. Je kunt ervoor kiezen om de temperatuur in Celsius of Fahrenheit weer te geven door de logica in de functie sendTemperature() aan te passen. De video legt uit dat de variabele Tvalue is ingesteld om de Celsius-waarde te bevatten, maar je kunt deze wijzigen om de Fahrenheit-variabele F te gebruiken.
Live projectdemonstratie
In de video wordt het voltooide project gedemonstreerd. Nadat de code is geflasht en de module is gereset, maakt deze verbinding met het Wi-Fi-netwerk. De seriële monitor toont de verbindingsstatus en het IP-adres van het apparaat. Door naar dit IP-adres in een webbrowser te navigeren, kun je een eenvoudige pagina zien met de huidige temperatuur en luchtvochtigheid. De demonstratie toont de waarden die in realtime worden bijgewerkt. Wanneer de DHT11-sensor wordt verwarmd met een heteluchtpistool, neemt de temperatuurwaarde op de webpagina dienovereenkomstig toe. Als de datadraad van de sensor wordt losgekoppeld, toont de pagina "None" voor de sensorwaarden, wat een handige functie is voor probleemoplossing.
Hoofdstukken
- [00:00] Inleiding tot het project
- [01:33] De ESP8266 en webservers begrijpen
- [05:47] De ESP-01 bedraden voor programmeren
- [08:51] ESP8266-bordondersteuning installeren in Arduino IDE
- [11:47] Project 1: Een LED laten knipperen met ESP8266
- [20:28] De DHT11-sensor bedraden
- [22:34] De DHT-sensorbibliotheek installeren
- [23:13] Project 2: DHT11 lezen op de seriële monitor
- [30:10] Uitleg van de code voor het webserverproject
- [36:14] Project 3: De webservercode flashen
- [38:42] Demonstratie: Temperatuur bekijken via Wi-Fi
- [41:43] Conclusie en probleemoplossing
/*
* 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>رطوبت و حرارت توسط دی اچ تی</h1>";
page +="<p style=\"font-size:150px;\">حرارت<br/>";
page +="<span style=\"color:red; font-size:150px;\">";
page += String(tValue, 2);
page +="°C</p>";
page +="<p style=\"font-size:150px;\">رطوبت<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
}
Common Course Links
Common Course Files
Hulpmiddelen en referenties
Nog geen middelen.
Bestanden📁
Arduino-code (.ino)
-
ESP8266_ESP1_DHT111 codes for Lesson 31 of Sunfounder's 3-in-1
ESP8266_ESP1_DHT111_all.zip9.31 MB
Fritzing-bestand
-
DHT11 Humitidy and Temperature Sensor (3 pins)
DHT11 Humitidy and Temperature Sensor (3 pins).fzpz0.20 MB
Gebruikershandleiding
-
DHT11 Gebruikershandleiding
robojax-DHT11_manual.pdf0.82 MB