Cuprins:
- Provizii
- Pasul 1: Încărcați codul Arduino pe ESP32-CAM
- Pasul 2: conectați-vă
- Pasul 3: Script Python3
- Pasul 4: Server MySQL
- Pasul 5: Webserver
- Pasul 6: Carcasă imprimată 3D
- Pasul 7: Rezultatul final
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:42
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
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ă
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 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:
Observator de umiditate și temperatură folosind Raspberry Pi cu SHT25 în Python: 6 pași
Observator de umiditate și temperatură folosind Raspberry Pi cu SHT25 în Python: Fiind un entuziast pentru Raspberry Pi, ne-am gândit la câteva experimente mai spectaculoase cu acesta. În această campanie, vom realiza un Observator de umiditate și temperatură care măsoară umiditatea relativă și temperatura folosind Raspberry Pi și SHT25, Humidi
Alertă de temperatură și umiditate folosind AWS și ESP32: 11 pași
Alertă de temperatură și umiditate folosind AWS și ESP32: În acest tutorial, vom măsura diferite date de temperatură și umiditate folosind senzorul de temperatură și umiditate. De asemenea, veți afla cum să trimiteți aceste date către AWS
Automatizarea unei sere cu LoRa! (Partea 1) -- Senzori (temperatură, umiditate, umiditate a solului): 5 pași
Automatizarea unei sere cu LoRa! (Partea 1) || Senzori (temperatură, umiditate, umiditate a solului): În acest proiect vă voi arăta cum am automatizat o seră. Asta înseamnă că vă voi arăta cum am construit sera și cum am conectat electronica de putere și automatizare. De asemenea, vă voi arăta cum să programați o placă Arduino care utilizează L
Contor de temperatură și umiditate folosind afișajul OLED: 5 pași
Contor de temperatură și umiditate folosind afișaj OLED: COMPONENTE NECESARE- 1. Arduino NANO: https://amzn.to/2HfX5PH 2. Senzor DHT11: https://amzn.to/2HfX5PH 3. Afișaj OLED: https: // amzn. la / 2HfX5PH 4. Panou de calcul: https://amzn.to/2HfX5PH 5. Sârme jumper: https://amzn.to/2HfX5PH Achiziționați linkuri
Stația meteo Arduino folosind BMP280-DHT11 - Temperatură, umiditate și presiune: 8 pași
Stația meteo Arduino folosind BMP280-DHT11 - Temperatură, umiditate și presiune: În acest tutorial vom învăța cum să realizăm o stație meteo care să afișeze TEMPERATURĂ, UMIDITATE ȘI PRESIUNE pe ecranul LCD TFT 7735 Urmăriți un videoclip demonstrativ