INHOUDSOPGAWE:

Temperatuur en humiditeit met behulp van ESP32-DHT22-MQTT-MySQL-PHP: 7 stappe
Temperatuur en humiditeit met behulp van ESP32-DHT22-MQTT-MySQL-PHP: 7 stappe

Video: Temperatuur en humiditeit met behulp van ESP32-DHT22-MQTT-MySQL-PHP: 7 stappe

Video: Temperatuur en humiditeit met behulp van ESP32-DHT22-MQTT-MySQL-PHP: 7 stappe
Video: Measure Temperature and Humidity WiFi with ESP32 DHT11 and DHT22 - Robojax 2024, Julie
Anonim
Temperatuur en humiditeit met behulp van ESP32-DHT22-MQTT-MySQL-PHP
Temperatuur en humiditeit met behulp van ESP32-DHT22-MQTT-MySQL-PHP

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

Laai die Arduino-kode op na die ESP32-CAM
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

Draai op!
Draai op!

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 eindresultaat!
Die eindresultaat!
Die eindresultaat!
Die eindresultaat!
Die eindresultaat!
Die eindresultaat!
Die eindresultaat!
Die eindresultaat!

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: