Cuprins:

Temperatură și umiditate folosind ESP32-DHT22-MQTT-MySQL-PHP: 7 pași
Temperatură și umiditate folosind ESP32-DHT22-MQTT-MySQL-PHP: 7 pași
Anonim
Temperatură și umiditate folosind ESP32-DHT22-MQTT-MySQL-PHP
Temperatură și umiditate folosind ESP32-DHT22-MQTT-MySQL-PHP

Iubita mea a vrut o seră, așa că i-am făcut una. Dar am vrut un senzor de temperatură și umiditate în interiorul serii. Deci, m-am căutat după exemple și am început să experimentez.

Concluzia mea a fost că toate exemplele pe care le-am găsit nu erau exact ceea ce voiam să construiesc. Am apucat o mulțime de mici părți de cod și le-am combinat. Mi-a luat destul de mult să termin prima mea construcție de lucru, deoarece documentația celor mai multe exemple mi-a fost prea greu de înțeles sau au presupus că ar trebui să știu ?? Dar nu știam nimic (încă) ☹

De aceea construiesc acest instructabil. Un tutorial „de la început până la sfârșit”, pentru ca toată lumea să înțeleagă. (Cel puțin sper?)

Cum functioneaza …

Produsul final este un ESP32-CAM cu un senzor DHT22 atașat la acesta, care îl alimentează de la o baterie 18650. La fiecare trei minute citește temperatura și umiditatea și o trimite prin WiFi către un server extern MQTT și apoi se culcă (timp de trei minute) pentru a utiliza cât mai puțină baterie, după cum este necesar

Pe un server Debian, (care ar putea fi și un raspberry pi, cred) am python3, un server MQTT, un server MySQL și un server web

Scriptul python3 rulează ca un serviciu și ori de câte ori primește un mesaj MQTT, acesta numără numărul anterior de intrări (numărul index) și îl mărește cu unul. Apoi citește valorile temperaturii și umidității din mesajul MQTT. Verifică dacă există valori false și ori de câte ori valorile sunt corecte, trimite valorile împreună cu noul număr de index și data și ora curente către un server MySQL

Serverul web are un script PHP care citește valorile de pe serverul MySQL și face un grafic frumos folosind Google Charts. (exemplu)

Provizii

Părțile pe care le-am folosit sunt următoarele:

  • ESP32-CAM (Motivul pentru care am folosit versiunea cam este pentru că are un conector de antenă extern. Probabil că există și alte ESP32 pe care le-ați putea folosi)
  • Antena externa
  • Senzor AM2302 DHT22 (Acesta are un rezistor încorporat, deci aveți nevoie doar de trei fire)

    https://www.amazon.de/gp/product/B07CM2VLBK/ref=p…

  • 18650 scut baterie v3
  • Baterie 18650 (NCR18650B)
  • Cablu micro USB vechi (pentru conectarea ESP32 la ecranul bateriei)
  • Câteva fire jumper scurte

Extra necesar:

  • Conector USB la TTL (imagine)

    https://www.amazon.de/FT232RL-Seriell-Unterst%C3%…

  • Ciocan de lipit
  • Imprimantă 3D (necesară doar pentru carcasă)

Pasul 1: Încărcați codul Arduino pe ESP32-CAM

Încărcați codul Arduino pe ESP32-CAM
Încărcați codul Arduino pe ESP32-CAM

Deci, să începem!

Pentru a încărca codul Arduino pe ESP32-CAM, trebuie să conectați conectorul USBtoTTL la ESP32 folosind schemele de mai sus.

Codul Arduino este:

/ * Doar un mic program pentru a citi temperatura și umiditatea de la un senzor DHT22 și

trece-l la MQTT. B. Duijnhouwer, 8 iunie 2020 * / #include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // parola wifi #define mqtt_server "*** SERVER_NAME ***" // numele serverului sau IP #define mqtt_user "*** MQTT_USER ***" // nume de utilizator #define mqtt_password "*** MQTT_PASSWORD ***" // parolă #define topic "seră / dhtreadings "#define debug_topic" seră / debug "// Subiect pentru depanare / * definiții pentru deepsleep * / #define uS_TO_S_FACTOR 1000000 / * Factor de conversie pentru micro secunde în secunde * / #define TIME_TO_SLEEP 180 / * Timpul ESP32 va merge în repaus timp de 5 minute (în secunde) * / bool debug = adevărat; // Afișați mesajul jurnal dacă True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; Clientul PubSubClient (espClient); date char [80]; void setup () {Serial.begin (115200); setup_wifi (); // Conectați-vă la rețeaua Wifi client.setServer (mqtt_server, 1883); // Configurați conexiunea MQTT, schimbați portul dacă este necesar. if (! client.connected ()) {reconnect (); } // CITIȚI DATE int chk = DHT.read22 (DHT22_PIN); plutitor t = temperatura DHT; plutitor h = DHT.umiditate; String dhtReadings = "{" temperature / ": \" "+ String (t) +" / ", \" umiditate / ": \" "+ String (h) +" / "}"; dhtReadings.toCharArray (date, (dhtReadings.length () + 1)); if (depanare) {Serial.print ("Temperatura:"); Serial.print (t); Serial.print ("| Umiditate:"); Serial.println (h); } // Publică valori în subiecte MQTT client.publish (subiect, date); // Publică lecturi pe subiect (seră / dhtreadings) if (depanare) {Serial.println ("Lecturi trimise către MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // du-te la culcare Serial.println ("Configurare ESP32 pentru a dormi pentru fiecare" + Șir (TIME_TO_SLEEP) + "Secunde"); Serial.println („Mergem la somn normal ca acum.”); esp_deep_sleep_start (); } // Configurare conexiune la wifi void setup_wifi () {delay (20); Serial.println (); Serial.print („Conectarea la”); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {întârziere (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi este OK"); Serial.print ("=> ESP32 adresa IP nouă este:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Reconectați-vă la wifi dacă conexiunea se pierde, anulați reconectarea () {while (! Client.connected ()) {Serial.print ("Conectarea la brokerul MQTT …"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Eroare] neconectat:"); Serial.print (client.state ()); Serial.println ("Așteptați 5 secunde înainte de a încerca din nou."); întârziere (5000); }}} void loop () {}

Și din nou, nu uitați să înlocuiți acreditările cu propriile acreditări

Pasul 2: conectați-vă

Lega!
Lega!

Pentru alimentare, am folosit un vechi cablu USB din care am întrerupt conectorul USB-A. Există patru fire în cablul USB, avem nevoie doar de cele negre și roșii.

Deci, conectați totul conform programului de mai sus.

Pasul 3: Script Python3

Scriptul Python3 merge într-un loc unde este accesibil utilizatorului root.

Am folosit /root/scripts/glasshouse/glasshouse.py pentru acest script. Conținutul scriptului python este:

# Script Python3 pentru a vă conecta la MQTT, a citi valorile și a le scrie în MySQL

# # B. Duijnhouwer # 8 iunie 2020 # # versiune: 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", "seră", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") cursor = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Broker port user = "** * MQTT_USERNAME *** "#Connection username password =" *** MQTT_PASSWORD *** "#Connection password def on_connect (client, date utilizator, steaguri, rc): # Apelarea pentru momentul în care clientul se conectează la imprimarea brokerului (" Conectat cu codul de rezultat {0} ". format (str (rc))) # Imprimați rezultatul încercării de conectare client.subscribe (" seră / dhtreadings / # ") def on_message (client, userdata, msg): # Apelarea pentru un Mesajul PUBLICARE este primit de la server. 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 ') sarcină utilă = json.loads (msg.payload.decode (' utf-8 ')) print ("Rând nou:" + str (newrow)) temperature = float (sarcină utilă ["temperature"]) umiditate = float (sarcină utilă ["umiditate")) print ("Temperatură:" + str (temperatură)) print ("Umiditate:" + str (umiditate)) print ("DateTime:" + str (format_date)) if ((temperature > -20) și (temperatura = 0) și (umiditate <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, temperature, umiditate, timestamp) VALORI (" + str (newrow) + "," + str (temperature) + "," + str (umiditate) + ",% s)", (format_date)) db.commit () print ("date primite și importate în MySQL") altceva: print ("datele au depășit limitele și NU sunt importate în MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (user, password = password) client.on_connect = on_connect # Define callback function pentru conexiune de succes client.on_message = on_message # Definiți funcția de apelare pentru primirea unui mesaj client.connect (broker_address, port = port) #connect to broker client.loop_forever () # Start demon de rețea

Nu uitați să înlocuiți numele de utilizator și parola MySQL și numele de utilizator și parola MQTT la propriile acreditări

Puteți face scriptul să ruleze ca serviciu prin crearea a două fișiere.

Primul este „/etc/init/glasshouse.conf” cu următorul conținut:

începe pe runlevel [2345]

stop on runlevel [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Al doilea este „/etc/systemd/system/multi-user.target.wants/glasshouse.service” cu următorul conținut:

[Unitate]

Descriere = Glasshouse Monitoring Service After = multi-user.target [Service] Type = simple Restart = always RestartSec = 1 ExecStart = / usr / bin / python3 /root/scripts/glasshouse/glasshouse.py [Install] WantedBy = multi-user.ţintă

Puteți face acest lucru să ruleze ca serviciu folosind următoarea comandă:

systemctl activate sere

și începeți-l folosind:

systemctl start seră

Pasul 4: Server MySQL

Trebuie să creați o nouă bază de date MySQL cu un singur tabel.

Codul pentru crearea tabelului este:

CREAȚI TABELUL `sensordata` (`idx` int (11) DEFAULT NULL,` temperature` float DEFAULT NULL, `umiditate` float DEFAULT NULL,` timestamp` datetime DEFAULT NULL) MOTOR = InnoDB DEFAULT CHARSET = utf8;

Pasul 5: Webserver

Serverul web are două fișiere, fișierul index.php și un fișier config.ini

Conținutul fișierului config.ini este:

[Bază de date]

db_host = "localhost" db_name = "seră" db_table = "sensordata" db_user = "*** DATABASE_USER ***" db_password = "*** DATABASE_PASSWORD ***"

În cazul în care, desigur, înlocuiți *** DATABASE_USER *** și *** DATABASE_PASSWORD *** cu propriile acreditări.

google.charts.load ('current', {'packages': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Timestamp', 'Temperature', 'Umiditate', 'Index de căldură'], ['Timestamp', 'Temperatură', 'Umiditate'], interogare ($ sql); # This while - loop formează și pune toate datele recuperate în modul ['timestamp', 'temperature', 'umiditate']. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ rând ["timestamp"], 10, 6); ecou "['". $ timestamp_rest. "',". $ rând ['temperatura']. ",". $ rând ['umiditate']. "],"; // echo "['". $ timestamp_rest. "',". $ rând ['temperatura']. ",". $ rând ['umiditate']. ",". $ rând ['heatindex ']. "],";}?>]); // Opțiuni var linie curbată = {title: 'Temperatură și umiditate', curveType: 'funcție', legendă: {poziție: 'jos'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Diagrama curbată var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (date, opțiuni); } // Închide paranteză din drawChart //

Pasul 6: Carcasă imprimată 3D

Pentru carcasă, am folosit două carcase separate, una pentru ESP32-CAM și DHT22 împreună și una pentru ecranul bateriei 18650.

Pasul 7: Rezultatul final

Rezultatul final!
Rezultatul final!
Rezultatul final!
Rezultatul final!
Rezultatul final!
Rezultatul final!
Rezultatul final!
Rezultatul final!

Rezultatul final este prezentat și în imaginile de mai sus.

Și ori de câte ori bateria este descărcată, o puteți încărca cu un cablu mini USB.

Recomandat: