Turinys:

Temperatūra ir drėgmė naudojant ESP32-DHT22-MQTT-MySQL-PHP: 7 žingsniai
Temperatūra ir drėgmė naudojant ESP32-DHT22-MQTT-MySQL-PHP: 7 žingsniai

Video: Temperatūra ir drėgmė naudojant ESP32-DHT22-MQTT-MySQL-PHP: 7 žingsniai

Video: Temperatūra ir drėgmė naudojant ESP32-DHT22-MQTT-MySQL-PHP: 7 žingsniai
Video: Kaip pasirinkti oro sausintuvą - drėgmės surinkėją? | OROsprendimai 2024, Liepa
Anonim
Temperatūra ir drėgmė naudojant ESP32-DHT22-MQTT-MySQL-PHP
Temperatūra ir drėgmė naudojant ESP32-DHT22-MQTT-MySQL-PHP

Mano mergina norėjo šiltnamio, todėl aš ją padariau. Bet aš norėjau temperatūros ir drėgmės jutiklio šiltnamyje. Taigi, ieškojau pavyzdžių ir pradėjau eksperimentuoti.

Mano išvada buvo ta, kad visi mano rasti pavyzdžiai nebuvo tokie, kokių norėjau sukurti. Pagriebiau daug mažų kodo dalių ir jas sujungiau. Prireikė nemažai laiko, kol baigiau savo pirmąjį darbinį darbą, nes daugumos pavyzdžių dokumentaciją man buvo per sunku suprasti arba jie manė, kad turėčiau žinoti ?? Bet aš nieko nežinojau (dar)

Štai kodėl aš kuriu tai pamokomą. Pamoka „nuo pradžios iki pabaigos“, kurią pažodžiui supranta visi. (Bent jau aš tikiuosi?)

Kaip tai veikia …

Galutinis produktas yra ESP32-CAM su DHT22 jutikliu, kuris gauna maitinimą iš 18650 baterijos. Kas tris minutes jis nuskaito temperatūrą ir drėgmę ir siunčia tai per „WiFi“į išorinį MQTT serverį, tada eina miegoti (trims minutėms), kad prireikus sunaudotų mažiau akumuliatoriaus

„Debian“serveryje (kuris, manau, taip pat gali būti „aviečių pi“), turiu „python3“, MQTT serverį, „MySQL“serverį ir žiniatinklio serverį

„Python3“scenarijus veikia kaip paslauga ir kaskart, kai gauna MQTT pranešimą, skaičiuoja ankstesnį įrašų skaičių (indekso numerį) ir padidina jį vienu. Tada jis nuskaito temperatūros ir drėgmės vertes iš pranešimo MQTT. Ji tikrina klaidingas vertes ir, kai vertės yra teisingos, siunčia vertes kartu su nauju indekso numeriu ir dabartine data bei laiku į „MySQL“serverį

Tinklalapio serveris turi PHP scenarijų, kuris skaito vertes iš „MySQL“serverio ir sukuria gražų grafiką iš jo, naudodamas „Google“diagramas. (pavyzdys)

Prekės

Mano naudojamos dalys yra šios:

  • ESP32-CAM (Priežastis, kodėl naudojau kumštelio versiją, yra ta, kad joje yra išorinė antenos jungtis. Tikriausiai yra ir kitų ESP32, kuriuos galėtumėte naudoti)
  • Išorinė antena
  • AM2302 DHT22 jutiklis (šis turi įmontuotą rezistorių, todėl jums reikia tik trijų laidų)

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

  • 18650 akumuliatoriaus skydas v3
  • 18650 baterija (NCR18650B)
  • Senas mikro USB kabelis (skirtas ESP32 prijungti prie akumuliatoriaus skydo)
  • Keletas trumpų jungiamųjų laidų

Papildomai reikia:

  • USB į TTL jungtis (nuotrauka)

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

  • Lituoklis
  • 3D spausdintuvas (reikalingas tik korpusui)

1 veiksmas: įkelkite „Arduino“kodą į ESP32-CAM

Įkelkite „Arduino“kodą į ESP32-CAM
Įkelkite „Arduino“kodą į ESP32-CAM

Taigi pradėkime!

Norėdami įkelti „Arduino“kodą į ESP32-CAM, turite prijungti USBtoTTL jungtį prie ESP32 naudodami aukščiau pateiktas schemas.

„Arduino“kodas yra:

/*Tik nedidelė programa, skirta nuskaityti temperatūrą ir drėgmę iš DHT22 jutiklio ir

perduoti jį MQTT. B. Duijnhouwer 2020 m. Birželio 8 d.*/#Include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // wifi slaptažodis #define mqtt_server "*** SERVER_NAME ***" // serverio pavadinimas arba IP #define mqtt_user "*** MQTT_USER ***" // naudotojo vardas #define mqtt_password "*** MQTT_PASSWORD ***" // slaptažodis #define topic "šiltnamis /dhtreadings "#define debug_topic" glasshouse /debug "// Derinimo tema /* gilaus miego apibrėžimai* /#define uS_TO_S_FACTOR 1000000 /* Konversijos koeficientas mikro sekundėms iki sekundžių* /#define TIME_TO_SLEEP 180 /* Laikas ESP32 užmigs 5 minutes (sekundėmis) */ bool debug = true; // Rodyti žurnalo pranešimą, jei tiesa #define DHT22_PIN 14 dht DHT; „WiFiClient espClient“; „PubSubClient“klientas (espClient); char duomenys [80]; void setup () {Serial.begin (115200); „setup_wifi“(); // Prisijunkite prie „Wifi“tinklo kliento.setServer (mqtt_server, 1883); // Konfigūruokite MQTT ryšį, jei reikia, pakeiskite prievadą. if (! client.connected ()) {reconnect (); } // SKAITYTI DUOMENIS int chk = DHT.read22 (DHT22_PIN); plūdė t = DHT.temperatūra; plūdė h = DHT. drėgmė; Styga dhtReadings = "{" temperatūra / ": \" " + Eilutė (t) +" / ", \" drėgmė / ": \" " + Eilutė (h) +" / "}"; dhtReadings.toCharArray (duomenys, (dhtReadings.length () + 1)); if (derinimas) {Serial.print ("Temperature:"); Serijinis atspaudas (t); Serial.print ("| Drėgmė:"); Serijinis.println (h); } // Skelbti vertes MQTT temose client.publish (tema, duomenys); // Skelbti skaitymus tema (šiltnamis/dhtreadings) if (derinimas) {Serial.println ("Skaitymai išsiųsti MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // eiti miegoti Serial.println ("Nustatykite ESP32 miegoti už kiekvieną" + eilutė (TIME_TO_SLEEP) + "Sekundės"); Serial.println ("Dabar einu miegoti kaip įprasta."); esp_deep_sleep_start (); } // Nustatyti ryšį su „wifi“void setup_wifi () {delay (20); Serial.println (); Serial.print („Prisijungimas prie“); Serial.println (wifi_ssid); „WiFi.begin“(„wifi_ssid“, „wifi_password“); while (WiFi.status ()! = WL_CONNECTED) {delay (100); Serijinis atspaudas ("."); } Serial.println (""); Serial.println („WiFi yra gerai“); Serial.print ("=> ESP32 naujas IP adresas yra:"); Serial.print („WiFi.localIP ()“); Serial.println (""); } // Prisijunkite iš naujo prie „wifi“, jei ryšys prarastas void reconnect () {while (! Client.connected ()) {Serial.print ("Prisijungimas prie MQTT brokerio …"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println („Gerai“); } else {Serial.print ("[Klaida] Neprisijungta:"); Serial.print (client.state ()); Serial.println („Palaukite 5 sekundes prieš bandydami iš naujo“); vėlavimas (5000); }}} void loop () {}

Ir dar kartą, nepamirškite pakeisti įgaliojimų savo kredencialais

2 žingsnis: prijunkite laidą

Laidai!
Laidai!

Maitinimui naudoju seną USB kabelį, iš kurio nutraukiau USB-A jungtį. USB laide yra keturi laidai, mums reikia tik juodos ir raudonos.

Taigi, prijunkite viską pagal aukščiau pateiktą tvarkaraštį.

3 žingsnis: „Python3“scenarijus

„Python3“scenarijus patenka į vietą, kur jis yra prieinamas pagrindiniam vartotojui.

Šiam scenarijui naudojau /root/scripts/glasshouse/glasshouse.py. „Python“scenarijaus turinys yra:

# „Python3“scenarijus, skirtas prisijungti prie MQTT, skaityti vertes ir įrašyti jas į „MySQL“

# # B. Duijnhouwer # 2020 m. Birželio 8 d. # # Versija: 1.0 # # importuoti paho.mqtt.client as mqtt import json import pymysql pymysql.install_as_MySQLdb () importuoti MySQLdb iš datetime import datetime db = MySQLdb.connect ("localhost", "šiltnamis", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") žymeklis = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Broker port user = "** *MQTT_USERNAME *** "#Connection username password =" *** MQTT_PASSWORD *** "#Connection password def on_connect (klientas, vartotojo duomenys, vėliavos, rc): #Atšaukimas, kai klientas prisijungia prie tarpininko spaudinio (" Prisijungta su rezultato kodu {0} ". format (str (rc))) # Spausdinimo bandymo prisijungti rezultatas client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (klientas, vartotojo duomenys, žinutė): # Atšaukimas, kai PUBLISH pranešimas gautas iš serverio. cursor.execute ("pasirinkite * iš sensorinių duomenų") numrows = int (cursor.rowcount) newrow = numrows + 1 dabar = datetime.now () formatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') naudingoji apkrova = json.loads (msg.payload.decode (' utf-8 ')) print ("Nauja eilutė:"+str (newrow)) temperatūra = plūdė (naudingoji apkrova ["temperatūra"]) drėgmė = float (naudingoji apkrova ["drėgmė"]) print ("Temperatūra:"+str (temperatūra)) print ("Drėgmė:"+str (drėgmė)) print ("DateTime:"+str (formatuota data)) if ((temperatūra > -20) ir (temperatūra = 0) ir (drėgmė <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, temperatūra, drėgmė, laiko žyma) VALUES ("+str. (newrow)+","+str (temperatūra)+","+str (drėgmė)+", %s)", (formatuota data)) db.commit () print ("gauti ir importuoti MySQL duomenys") else: print ("duomenys viršijo ribas ir NĖRA importuojami į MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (vartotojas, slaptažodis = slaptažodis) client.on_connect = on_connect # Apibrėžkite atgalinio ryšio funkciją dėl sėkmingas prisijungimas client.on_message = on_message # Apibrėžkite atgalinio ryšio funkciją, kad gautumėte pranešimą.

Nepamirškite pakeisti „MySQL“vartotojo vardo ir slaptažodžio bei „MQTT“vartotojo vardo ir slaptažodžio į savo kredencialus

Galite sukurti scenarijų kaip paslaugą sukurdami du failus.

Pirmasis yra „/etc/init/glasshouse.conf“, kurio turinys yra toks:

pradėti nuo lygio [2345]

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

Antrasis yra „/etc/systemd/system/multi-user.target.wants/glasshouse.service”, kurio turinys yra toks:

[Vienetas]

Aprašymas = Glasshouse Monitoring Service After = multi-user.target [Service] Tipas = simple Restart = Always RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Install] WantedBy = multi-user.tikslą

Tai galite atlikti kaip paslaugą naudodami šią komandą:

sistema įgalina šiltnamį

ir pradėkite jį naudodami:

systemctl start šiltnamis

4 žingsnis: „MySQL Server“

Turite sukurti naują „MySQL“duomenų bazę, kurioje būtų tik viena lentelė.

Lentelės kūrimo kodas yra:

KURTI LENTELĘ „sensordata“(`idx` int (11) Numatytasis NULL,` temperatūros `plūdis Numatytasis NULL,` drėgmės` plūdė Numatytasis NULL, `laiko žymė` datetime DEFAULT NULL) VARIKLIS = „InnoDB DEFAULT CHARSET“= utf8;

5 veiksmas: tinklalapio serveris

Tinklalapio serveryje yra du failai: index.php failas ir vienas config.ini failas

Failo config.ini turinys yra toks:

[duomenų bazė]

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

Kur nekeičiate *** DATABASE_USER *** ir *** DATABASE_PASSWORD *** savo kredencialais.

google.charts.load ('dabartinis', {'paketai': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Laiko žyma', 'Temperatūra', 'Drėgmė', 'Šilumos indeksas'], ['Laiko žyma', 'Temperatūra', 'Drėgmė'], query ($ sql); # This while - ciklas formuoja ir visus gautus duomenis įdeda į ['timestamp', 'temperature', 'drėgmė'] būdą. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ eilutė ["laiko žymė"], 10, 6); echo "['". $ timestamp_rest. "", ". $ eilutė [' temperatūra '].", ". $ eilutė [' drėgmė ']. "],"; // aidas "['". $ timestamp_rest. "", ". $ row [' temperature '].", ". $ row [' drėgmė '].", ". $ row [' heatindex ']. "],";}?>])); // Išlenktos linijos var options = {title: 'Temperatūra ir drėgmė', curveType: 'function', legend: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Kreivės diagramos var diagrama = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (duomenys, parinktys); } // Pabaigos skliaustas iš drawChart //

6 žingsnis: 3D spausdintas korpusas

Korpusui naudoju du atskirus korpusus, vieną ESP32-CAM ir DHT22 kartu, o kitą-18650 akumuliatoriaus skydui.

7 žingsnis: galutinis rezultatas

Galutinis rezultatas!
Galutinis rezultatas!
Galutinis rezultatas!
Galutinis rezultatas!
Galutinis rezultatas!
Galutinis rezultatas!
Galutinis rezultatas!
Galutinis rezultatas!

Galutinis rezultatas taip pat parodytas aukščiau esančiose nuotraukose.

Ir kai akumuliatorius yra tuščias, galite jį įkrauti naudodami mini USB kabelį.

Rekomenduojamas: