Code zoeken

Les 31/31: Temperatuur en luchtvochtigheid meten via Wi-Fi met behulp van DHT11 en ESP01 SunFounder Kit

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.

ESP8266 ESP01-module

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

ESP8266 ESP01- en DHT11-bekabeling voor les 31 Sunfounder 3-in-1-cursus

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:

  1. 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.json en klik op "OK".
  2. 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 naar Extra > Bord > ESP8266 Boards > Generic ESP8266 Module te 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.

  1. Ga naar Extra > Bibliotheken beheren....
  2. Zoek naar "DHT sensor library".
  3. 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

Afbeeldingen

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
Taal: 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
}

Hulpmiddelen en referenties

Nog geen middelen.

Bestanden📁

Arduino-code (.ino)

Fritzing-bestand

Gebruikershandleiding