Satura rādītājs:

Temperatūra un mitrums, izmantojot ESP32-DHT22-MQTT-MySQL-PHP: 7 soļi
Temperatūra un mitrums, izmantojot ESP32-DHT22-MQTT-MySQL-PHP: 7 soļi

Video: Temperatūra un mitrums, izmantojot ESP32-DHT22-MQTT-MySQL-PHP: 7 soļi

Video: Temperatūra un mitrums, izmantojot ESP32-DHT22-MQTT-MySQL-PHP: 7 soļi
Video: Temperatūra un mitrums zem BioAgri plēves 2024, Novembris
Anonim
Temperatūra un mitrums, izmantojot ESP32-DHT22-MQTT-MySQL-PHP
Temperatūra un mitrums, izmantojot ESP32-DHT22-MQTT-MySQL-PHP

Mana draudzene gribēja siltumnīcu, tāpēc es viņai uztaisīju. Bet es gribēju temperatūras un mitruma sensoru siltumnīcas iekšpusē. Tātad, es googlē meklēju piemērus un sāku eksperimentēt.

Mans secinājums bija tāds, ka visi atrastie piemēri nebija gluži tādi, kādus es gribēju izveidot. Es paķēru daudz mazu koda daļu un apvienoju tās. Pagāja diezgan ilgs laiks, lai pabeigtu savu pirmo darba uzbūvi, jo vairuma piemēru dokumentācija man bija pārāk grūti saprotama, vai arī viņi pieņēma daļu, kas man būtu jāzina? Bet es neko nezināju (vēl)

Tāpēc es izveidoju šo pamācību. Apmācība “no sākuma līdz beigām” burtiski visiem saprotama. (Vismaz es ceru?)

Kā tas strādā …

Galaprodukts ir ESP32-CAM ar tam piestiprinātu DHT22 sensoru, kas saņem enerģiju no 18650 akumulatora. Ik pēc trim minūtēm tas nolasa temperatūru un mitrumu un nosūta to, izmantojot WiFi, uz ārēju MQTT serveri un pēc tam iet gulēt (trīs minūtes), lai pēc vajadzības izmantotu pēc iespējas mazāk akumulatora

Debian serverī (kas, manuprāt, varētu būt arī aveņu pi), man ir python3, MQTT serveris, MySQL serveris un tīmekļa serveris

Python3 skripts darbojas kā pakalpojums, un ikreiz, kad tas saņem MQTT ziņojumu, tas saskaita iepriekšējo ierakstu skaitu (indeksa numuru) un palielina to par vienu. Pēc tam tas nolasa temperatūras un mitruma vērtības no ziņojuma MQTT. Tā pārbauda nepatiesas vērtības un, ja vērtības ir pareizas, tās nosūta vērtības kopā ar jauno indeksa numuru un pašreizējo datumu un laiku uz MySQL serveri

Tīmekļa serverim ir PHP skripts, kas nolasa vērtības no MySQL servera un no tā izveido jauku grafiku, izmantojot Google diagrammas. (piemērs)

Piegādes

Daļas, kuras izmantoju, ir šādas:

  • ESP32-CAM (Iemesls, kāpēc es izmantoju kameras versiju, ir tas, ka tam ir ārējās antenas savienotājs. Iespējams, ir arī citi ESP32, kurus varētu izmantot)
  • Ārējā antena
  • AM2302 DHT22 sensors (šim ir iebūvēts rezistors, tāpēc jums ir nepieciešami tikai trīs vadi)

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

  • 18650 akumulatora vairogs v3
  • 18650 akumulators (NCR18650B)
  • Vecs mikro USB kabelis (ESP32 savienošanai ar akumulatora pārsegu)
  • Daži īsi džemperu vadi

Nepieciešams papildus:

  • USB - TTL savienotājs (attēls)

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

  • Lodāmurs
  • 3D printeris (nepieciešams tikai korpusam)

1. darbība: augšupielādējiet Arduino kodu ESP32-CAM

Augšupielādējiet Arduino kodu ESP32-CAM
Augšupielādējiet Arduino kodu ESP32-CAM

Tātad sāksim!

Lai augšupielādētu Arduino kodu ESP32-CAM, jums ir jāpievieno USBtoTTL savienotājs ESP32, izmantojot iepriekš minētās shēmas.

Arduino kods ir šāds:

/*Tikai neliela programma temperatūras un mitruma nolasīšanai no DHT22 sensora un

nododiet to MQTT. B. Duijnhouwer, 2020. gada 8. jūnijs*/#include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // wifi parole #define mqtt_server "*** SERVER_NAME ***" // servera nosaukums vai IP #define mqtt_user "*** MQTT_USER ***" // lietotājvārds #define mqtt_password "*** MQTT_PASSWORD ***" // parole #define topic "siltumnīca /dhtreadings "#define debug_topic" glasshouse /debug "// Atkļūdošanas tēma /* deepsleep definīcijas* /#define uS_TO_S_FACTOR 1000000 /* Reklāmguvuma koeficients mikrosekundēm līdz sekundēm* /#define TIME_TO_SLEEP 180 /* Laiks ESP32 pāries miega režīmā 5 minūtes (sekundēs) */ bool debug = true; // Parādīt žurnāla ziņojumu, ja True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient klients (espClient); char dati [80]; void setup () {Serial.begin (115200); setup_wifi (); // Savienojuma izveide ar Wifi tīkla client.setServer (mqtt_server, 1883); // Konfigurējiet MQTT savienojumu, ja nepieciešams, nomainiet portu. ja (! client.connected ()) {reconnect (); } // LASĪT DATUS int chk = DHT.read22 (DHT22_PIN); pludiņš t = DHT.temperatūra; pludiņš h = DHT.mitrums; String dhtReadings = "{" temperatūra / ": \" " + String (t) +" / ", \" mitrums / ": \" " + String (h) +" / "}"; dhtReadings.toCharArray (dati, (dhtReadings.length () + 1)); if (atkļūdošana) {Serial.print ("Temperatūra:"); Sērijas nospiedums (t); Serial.print ("| Mitrums:"); Sērijas.println (h); } // Publicēt vērtības MQTT tēmām client.publish (tēma, dati); // Publicēt lasījumus par tēmu (siltumnīca/dhtreadings), ja (atkļūdošana) {Serial.println ("Lasījumi nosūtīti MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // iet gulēt Serial.println ("Iestatiet ESP32 gulēt uz katru" + virkne (TIME_TO_SLEEP) + "Sekundes"); Serial.println ("Tagad eju gulēt kā parasti."); esp_deep_sleep_start (); } // Iestatīt savienojumu ar wifi void setup_wifi () {delay (20); Sērijas.println (); Serial.print ("Savienojuma izveide"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {kavēšanās (100); Sērijas nospiedums ("."); } Serial.println (""); Serial.println ("WiFi ir OK"); Serial.print ("=> ESP32 jaunā IP adrese ir:"); Sērijas nospiedums (WiFi.localIP ()); Serial.println (""); } // Atkārtoti izveidojiet savienojumu ar wifi, ja tiek zaudēts savienojums void atjaunojiet savienojumu () {while (! Client.connected ()) {Serial.print ("Savienojuma izveide ar MQTT brokeri…"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("Labi"); } else {Serial.print ("[Kļūda] Nav savienots:"); Sērijas nospiedums (client.state ()); Serial.println ("Pagaidiet 5 sekundes, pirms mēģināt vēlreiz."); kavēšanās (5000); }}} void loop () {}

Un atkal, neaizmirstiet aizstāt akreditācijas datus ar saviem akreditācijas datiem

2. solis: izveidojiet vadu

Vadu!
Vadu!

Jaudai es izmantoju veco USB kabeli, no kura es pārtraucu USB-A savienotāju. USB vadā ir četri vadi, mums vajag tikai melno un sarkano.

Tātad, savienojiet visu saskaņā ar iepriekš minēto grafiku.

3. darbība: Python3 skripts

Python3 skripts nonāk vietā, kur tas ir pieejams saknes lietotājam.

Šim skriptam es izmantoju /root/scripts/glasshouse/glasshouse.py. Python skripta saturs ir šāds:

# Python3 skripts, lai izveidotu savienojumu ar MQTT, nolasītu vērtības un ierakstītu tās MySQL

# # B. Duijnhouwer # 2020. gada 8. jūnijs # # versija: 1.0 # # importēt paho.mqtt.client as mqtt import json import pymysql pymysql.install_as_MySQLdb () importēt MySQLdb no datetime import datetime db = MySQLdb.connect ("localhost", "siltumnīca", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") kursors = db.cursor () broker_address = "localhost" #Brokera adreses ports = 1883 #Broker port user = "** *MQTT_USERNAME *** "#Connection username password =" *** MQTT_PASSWORD *** " #Savienojuma parole def on_connect (klients, lietotāja dati, karodziņi, rc): #Atzvanīšana, kad klients izveido savienojumu ar brokeri print (" Savienots ar rezultāta kodu {0} ". formāts (str (rc))) # Savienojuma mēģinājuma drukāšanas rezultāts client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (klients, lietotāja dati, ziņa): # Atzvanīšana, kad PUBLISH ziņojums ir saņemts no servera. cursor.execute ("izvēlieties * no sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 tagad = datuma laiks. tagad () formatēts_datums = tagad.strftime ('%Y-%m-%d%H:% M:%S ') lietderīgā slodze = json.loads (msg.payload.decode (' utf-8 ')) print ("Jauna rinda:"+str (newrow)) temperatūra = pludiņš (kravnesība ["temperatūra"]) mitrums = float (payload ["mitrums"]) print ("Temperatūra:"+str (temperatūra)) print ("Mitrums:"+str (mitrums)) drukāt ("DateTime:"+str (formatēts_datums)) if ((temperatūra > -20) un (temperatūra = 0) un (mitrums <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, temperatūra, mitrums, laika zīmogs) VALUES ("+str. (newrow)+","+str (temperatūra)+","+str (mitrums)+", %s)", (formatēts_datums)) db.commit () print ("dati saņemti un importēti MySQL") cits: print ("dati pārsniedza ierobežojumus un NAV importēti MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (lietotājs, parole = parole) client.on_connect = on_connect # Definējiet atzvanīšanas funkciju priekš veiksmīgs savienojums client.on_message = on_message # Nosakiet atzvanīšanas funkciju ziņojuma saņemšanai.

Neaizmirstiet nomainīt MySQL lietotājvārdu un paroli un MQTT lietotājvārdu un paroli pret saviem akreditācijas datiem

Varat izveidot skriptu kā pakalpojumu, izveidojot divus failus.

Pirmais ir “/etc/init/glasshouse.conf” ar šādu saturu:

sākt no skrējiena līmeņa [2345]

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

Otrais ir “/etc/systemd/system/multi-user.target.wants/glasshouse.service” ar šādu saturu:

[Vienība]

Apraksts = Siltumnīcas uzraudzības pakalpojums Pēc = multi-user.target [Service] Tips = vienkārša Restart = vienmēr RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Install] WantedBy = multi-user.mērķis

Šo darbību var veikt kā pakalpojumu, izmantojot šādu komandu:

sistēma ļauj ieslēgt siltumnīcu

un sāciet to, izmantojot:

systemctl start siltumnīca

4. solis: MySQL serveris

Jums ir jāizveido jauna MySQL datu bāze, kurā ir tikai viena tabula.

Tabulas izveides kods ir šāds:

IZVEIDOT TABULU "sensordata" (`idx` int (11) DEFAULT NULL,` temperatūras `pludiņš DEFAULT NULL,` mitruma` pludiņš DEFAULT NULL, `timestamp` datetime DEFAULT NULL) DZINĒJS = InnoDB DEFAULT CHARSET = utf8;

5. darbība: tīmekļa serveris

Tīmekļa serverim ir divi faili, fails index.php un viens config.ini fails

Faila config.ini saturs ir šāds:

[datu bāze]

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

Kur jūs, protams, aizstājat *** DATABASE_USER *** un *** DATABASE_PASSWORD *** ar saviem akreditācijas datiem.

google.charts.load ('pašreizējais', {'paketes': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Laika zīmogs', 'Temperatūra', 'Mitrums', 'Siltuma indekss'], ['Laika zīmogs', 'Temperatūra', 'Mitrums'], query ($ sql); # This while - cilpa formatē un visus izgūtos datus ievieto formātā ['timestamp', 'temperature', 'mitrums']. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = apakšstruktūra ($ rinda ["laika zīmogs"], 10, 6); atbalss "['". $ timestamp_rest. "", ". $ rinda [' temperatūra '].", ". $ rinda [' mitrums ']. "],"; // echo "['". $ timestamp_rest. "", ". $ rinda [' temperatūra '].", ". $ rinda [' mitrums '].", ". $ rinda [' heatindex ']. "],";}?>])); // Liekto līniju var options = {title: 'Temperatūra un mitrums', curveType: 'function', legend: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Izliekta diagramma var diagramma = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (dati, opcijas); } // Beigu kronšteins no drawChart //

6. solis: 3D drukāts korpuss

Korpusam es izmantoju divus atsevišķus korpusus, vienu ESP32-CAM un DHT22 kopā un otru akumulatora vairogam 18650.

7. solis: gala rezultāts

Galarezultāts!
Galarezultāts!
Galarezultāts!
Galarezultāts!
Galarezultāts!
Galarezultāts!
Galarezultāts!
Galarezultāts!

Gala rezultāts ir redzams arī iepriekš redzamajos attēlos.

Un vienmēr, kad akumulators ir tukšs, varat to uzlādēt, izmantojot mini USB kabeli.

Ieteicams: