INHOUDSOPGAWE:
- Voorrade
- Stap 1: Laai die Arduino-kode op na die ESP32-CAM
- Stap 2: Maak gereed
- Stap 3: Python3 Script
- Stap 4: MySQL -bediener
- Stap 5: Webbediener
- Stap 6: Behuising met 3D -drukwerk
- Stap 7: Die finale resultaat
Video: Temperatuur en humiditeit met behulp van ESP32-DHT22-MQTT-MySQL-PHP: 7 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:24
My vriendin wou 'n glashuis hê, so ek het vir haar een gemaak. Maar ek wou 'n temperatuur- en humiditeitsensor in die kas hê. So, ek het gegoogle vir voorbeelde en begin eksperimenteer.
My gevolgtrekking was dat al die voorbeelde wat ek gevind het, nie presies was wat ek wou bou nie. Ek het baie klein dele van die kode gegryp en dit gekombineer. Dit het my 'n hele rukkie geneem om my eerste werkopmaak klaar te maak, want die dokumentasie van die meeste voorbeelde was vir my te moeilik om te verstaan, of hulle het 'n deel aangeneem wat ek moet weet ?? Maar ek het (nog) niks geweet nie ☹
Daarom bou ek hierdie instruksies. 'N "Begin tot die einde" handleiding vir letterlik almal om te verstaan. (Ten minste hoop ek?)
Hoe dit werk …
Die eindproduk is 'n ESP32-CAM met 'n DHT22-sensor daaraan, wat krag kry van 'n 18650-battery. Elke drie minute lees dit die temperatuur en humiditeit en stuur dit via WiFi na 'n eksterne MQTT -bediener en gaan slaap dan (vir drie minute) om minder battery te gebruik as wat nodig is
Op 'n Debian -bediener, (wat ek ook 'n framboos -pi kan wees), het ek python3, 'n MQTT -bediener, 'n MySQL -bediener en 'n webserver
Die python3 -skrif loop as 'n diens, en telkens as dit 'n MQTT -boodskap ontvang, tel dit die vorige aantal inskrywings (indeksnommer) en verhoog dit met een. Dan lees dit die waardes van die temperatuur en die humiditeit uit die MQTT -boodskap. Dit kyk na vals waardes en wanneer die waardes korrek is, stuur dit die waardes saam met die nuwe indeksnommer en die huidige datum en tyd na 'n MySQL -bediener
Die webserver het 'n PHP -script wat die waardes van die MySQL -bediener lees en 'n goeie grafiek daaruit maak met behulp van Google Charts. (voorbeeld)
Voorrade
Die onderdele wat ek gebruik het, is die volgende:
- ESP32-CAM (Die rede waarom ek die nokweergawe gebruik het, is omdat dit 'n eksterne antenna-aansluiting het. Daar is waarskynlik ook ander ESP32's wat u kan gebruik)
- Eksterne antenna
-
AM2302 DHT22-sensor (hierdie een het 'n ingeboude weerstand, dus u benodig slegs drie drade)
https://www.amazon.de/gp/product/B07CM2VLBK/ref=p…
- 18650 battery skild v3
- 18650 battery (NCR18650B)
- Ou mikro -USB -kabel (vir die aansluiting van die ESP32 op die batteryskerm)
- 'N Paar kort springdrade
Ekstra benodig:
-
USB na TTL -aansluiting (foto)
https://www.amazon.de/FT232RL-Seriell-Unterst%C3%…
- Soldeerbout
- 3D -drukker (slegs nodig vir behuisingskas)
Stap 1: Laai die Arduino-kode op na die ESP32-CAM
So laat ons begin!
Om die Arduino-kode na die ESP32-CAM op te laai, moet u die USBtoTTL-aansluiting aan die ESP32 koppel met behulp van die skemas hierbo.
Die Arduino -kode is:
/*Net 'n klein program om die temperatuur en humiditeit van 'n DHT22 -sensor en
stuur dit na MQTT. B. Duijnhouwer Junie, 8ste 2020*/#include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // wifi password #define mqtt_server "*** SERVER_NAME ***" // bedienernaam of IP #define mqtt_user "*** MQTT_USER ***" // gebruikersnaam #define mqtt_password "*** MQTT_PASSWORD ***" // wagwoord #define topic "glashuis /dhtreadings "#define debug_topic" glashuis /debug "// Onderwerp vir ontfouting /* definisies vir deepsleep* /#define uS_TO_S_FACTOR 1000000 /* Omskakelingsfaktor vir mikrosekondes na sekondes* /#define TIME_TO_SLEEP 180 /* Tyd ESP32 gaan slaap vir 5 minute (in sekondes) */ bool debug = true; // Wys logboodskap as True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient -kliënt (espClient); char data [80]; ongeldige opstelling () {Serial.begin (115200); setup_wifi (); // Koppel aan Wifi -netwerk client.setServer (mqtt_server, 1883); // Stel die MQTT -verbinding op, verander die poort indien nodig. as (! client.connected ()) {heraansluit (); } // LEES DATA int chk = DHT.read22 (DHT22_PIN); dryf t = DHT.temperatuur; dryf h = DHT.vochtigheid; String dhtReadings = "{" temperatuur / ": \" " + String (t) +" / ", \" humiditeit / ": \" " + String (h) +" / "}"; dhtReadings.toCharArray (data, (dhtReadings.length () + 1)); as (ontfout) {Serial.print ("Temperatuur:"); Reeks.afdruk (t); Serial.print ("| Humiditeit:"); Serial.println (h); } // Publiseer waardes aan MQTT -onderwerpe client.publish (onderwerp, data); // Publiseer lesings oor die onderwerp (glashuis/dhtreadings) as (ontfout) {Serial.println ("Lesings gestuur na MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // gaan slaap Serial.println ("Stel ESP32 in om te slaap vir elke" + snaar (TIME_TO_SLEEP) + "sekondes"); Serial.println ("Gaan nou soos normaal aan die slaap."); esp_deep_sleep_start (); } // Stel verbinding op met wifi void setup_wifi () {vertraging (20); Serial.println (); Serial.print ("Koppel aan"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); terwyl (WiFi.status ()! = WL_CONNECTED) {vertraging (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi is OK"); Serial.print ("=> ESP32 nuwe IP -adres is:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Koppel weer aan wifi as die verbinding verlore gaan, herroep verbinding () {terwyl (! Client.connected ()) {Serial.print ("Koppel aan MQTT -makelaar …"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } anders {Serial.print ("[Fout] Nie gekoppel nie:"); Serial.print (client.state ()); Serial.println ("Wag 5 sekondes voordat u weer probeer."); vertraging (5000); }}} leemte -lus () {}
En weer, moenie vergeet om die geloofsbriewe met u eie geloofsbriewe te vervang nie
Stap 2: Maak gereed
Vir die krag gebruik ek 'n ou USB-kabel waarvan ek die USB-A-aansluiting afgesny het. Daar is vier drade in die USB -kabel, ons benodig net die swart en die rooi.
Verbind dus alles volgens die skedule hierbo.
Stap 3: Python3 Script
Die Python3 -script gaan na 'n plek waar dit toeganklik is vir die wortelgebruiker.
Ek het /root/scripts/glasshouse/glasshouse.py vir hierdie script gebruik. Die inhoud van die python script is:
# Python3 -script om aan te sluit op MQTT, lees waardes en skryf dit in MySQL
# # B. Duijnhouwer # Junie, 8ste 2020 # # weergawe: 1.0 # # import paho.mqtt.client as mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb from datetime import datetime db = MySQLdb.connect ("localhost", "glashuis", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") cursor = db.cursor () broker_address = "localhost" #Broker adres poort = 1883 #Broker poort gebruiker = "** *MQTT_USERNAME *** " #Connection gebruikersnaam wagwoord =" *** MQTT_PASSWORD *** " #Connection password def on_connect (client, userdata, flags, rc): #The callback for when the client connect to the broker print (" Connected met resultaatkode {0} ". formaat (str (rc))) # Drukresultaat van verbindingspoging client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # The callback for when a PUBLISH boodskap word vanaf die bediener ontvang. cursor.execute ("select * from sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 now = datetime.now () formatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') payload = json.loads (msg.payload.decode (' utf-8 ')) print ("Nuwe ry:"+str (newrow)) temperatuur = float (payload ["temperatuur"]) humiditeit = float (loonvrag ["humiditeit"]) druk ("Temperatuur:"+str (temperatuur)) druk ("Humiditeit:"+str (humiditeit)) druk ("DateTime:"+str (opgemaakte datum)) if ((temperatuur > -20) en (temperatuur = 0) en (humiditeit <= 100)): cur = db.cursor () cur.execute ("INVOER IN glashuis.sensordata (idx, temperatuur, humiditeit, tydstempel) WAARDES ("+str (newrow)+","+str (temperatuur)+","+str (humiditeit)+", %s)", (opgemaakte datum)) db.commit () print ("data ontvang en ingevoer in MySQL") anders: print ("data het perke oorskry en word NIE in MySQL ingevoer nie") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (gebruiker, wagwoord = wagwoord) client.on_connect = on_connect # Definieer terugbelfunksie vir suksesvolle verbinding client.on_message = on_message # Definieer terugbelfunksie vir ontvangs van 'n boodskap client.connect (broker_address, port = port) #connect to broker client.loop_forever () # Begin netwerk daemon
Moenie vergeet om die MySQL gebruikersnaam en wagwoord en die MQTT gebruikersnaam en wagwoord in u eie geloofsbriewe te vervang nie
U kan die script as 'n diens laat loop deur twee lêers te skep.
Die eerste een is “/etc/init/glasshouse.conf” met die volgende inhoud:
begin op runlevel [2345]
stop op runlevel [! 2345] exec /root/scripts/glasshouse/glasshouse.py
Die tweede een is “/etc/systemd/system/multi-user.target.wants/glasshouse.service” met die volgende inhoud:
[Eenheid]
Beskrywing = Glasshouse Monitoring Service After = multi-user.target [Service] Type = simple Restart = always RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Installeer] WantedBy = multi-user.doelwit
U kan hierdie funksie as 'n diens laat loop met behulp van die volgende opdrag:
systemctl maak glashuis moontlik
en begin dit met:
systemctl begin kweekhuis
Stap 4: MySQL -bediener
U moet 'n nuwe MySQL -databasis skep met slegs een tabel daarin.
Die kode vir die skep van die tabel is:
SKEP TAFEL `sensordata` (`idx` int (11) DEFAULT NULL,` temperatuur` float DEFAULT NULL, `humiditeit` float DEFAULT NULL,` tydstempel` datetime DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8;
Stap 5: Webbediener
Die webserver het twee lêers, die index.php -lêer en een config.ini -lêer
Die inhoud van die config.ini -lêer is:
[databasis]
db_host = "localhost" db_name = "glashuis" db_table = "sensordata" db_user = "*** DATABASE_USER ***" db_password = "*** DATABASE_PASSWORD ***"
U vervang natuurlik DATABASE_USER *** en *** DATABASE_PASSWORD *** met u eie geloofsbriewe.
google.charts.load ('current', {'packages': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Timestamp', 'Temperature', 'Humidity', 'Heat Index'], ['Timestamp', 'Temperature', 'Humidity'], navraag ($ sql); # This while - lus formateer en plaas al die opgesoekte data op ['tydstempel', 'temperatuur', 'humiditeit'] manier. terwyl ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substraat ($ ry ["tydstempel"], 10, 6); eggo "['". $ tydstempel_rest. "',". $ ry ['temperatuur']. ",". $ ry ['humiditeit']. "],"; // echo "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['humiditeit']. ",". $ row ['heatindex ']. "],";}?>]); // Geboë lyn var options = {title: 'Temperatuur en humiditeit', curveType: 'function', legende: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Geboë grafiek var chart = nuwe google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (data, opsies); } // Eindbeugel van drawChart //
Stap 6: Behuising met 3D -drukwerk
Vir die behuising het ek twee afsonderlike behuise gebruik, een vir die ESP32-CAM en DHT22 saam en een vir die 18650 batteryskerm.
Stap 7: Die finale resultaat
Die finale uitslag word ook op die foto's hierbo getoon.
En as die battery leeg is, kan u dit laai met 'n mini -USB -kabel.
Aanbeveel:
DHT -monitering van temperatuur en humiditeit met behulp van die ESP8266 en die AskSensors IoT -platform: 8 stappe
DHT -monitering van temperatuur en humiditeit met behulp van die ESP8266 en die AskSensors IoT -platform: In 'n vorige instruksie het ek 'n stap -vir -stap -gids aangebied om aan die gang te kom met die ESP8266 -nodeMCU en die AskSensors IoT -platform. In hierdie tutoriaal verbind ek 'n DHT11 -sensor na die nodus MCU. Die DHT11 is 'n algemeen gebruikte temperatuur en humidi
Meting van humiditeit en temperatuur met behulp van HIH6130 en Arduino Nano: 4 stappe
Meting van humiditeit en temperatuur met behulp van HIH6130 en Arduino Nano: HIH6130 is 'n humiditeits- en temperatuursensor met digitale uitset. Hierdie sensors bied 'n akkuraatheidsvlak van ± 4% RH. Met die toonaangewende langtermynstabiliteit, ware temperatuurgekompenseerde digitale I2C, toonaangewende betroubaarheid in die bedryf, energie-doeltreffendheid
Meting van temperatuur en humiditeit met behulp van HDC1000 en Arduino Nano: 4 stappe
Meting van temperatuur en humiditeit met behulp van HDC1000 en Arduino Nano: Die HDC1000 is 'n digitale humiditeitsensor met 'n geïntegreerde temperatuursensor wat uitstekende meetnauwkeurigheid bied by baie lae krag. Die toestel meet humiditeit op grond van 'n nuwe kapasitiewe sensor. Die humiditeits- en temperatuursensors is
Meting van humiditeit en temperatuur met behulp van HTS221 en Arduino Nano: 4 stappe
Meting van humiditeit en temperatuur met behulp van HTS221 en Arduino Nano: HTS221 is 'n ultra kompakte kapasitiewe digitale sensor vir relatiewe humiditeit en temperatuur. Dit bevat 'n waarnemingselement en 'n gemengde seintoepassingspesifieke geïntegreerde stroombaan (ASIC) om die meetinligting deur middel van digitale reeks
Meting van humiditeit en temperatuur met behulp van HTS221 en Framboos Pi: 4 stappe
Meting van humiditeit en temperatuur met behulp van HTS221 en Framboos Pi: HTS221 is 'n ultra kompakte kapasitiewe digitale sensor vir relatiewe humiditeit en temperatuur. Dit bevat 'n waarnemingselement en 'n gemengde seintoepassingspesifieke geïntegreerde stroombaan (ASIC) om die meetinligting deur middel van digitale reeks