Obsah:

Teplota a vlhkosť pomocou ESP32-DHT22-MQTT-MySQL-PHP: 7 krokov
Teplota a vlhkosť pomocou ESP32-DHT22-MQTT-MySQL-PHP: 7 krokov

Video: Teplota a vlhkosť pomocou ESP32-DHT22-MQTT-MySQL-PHP: 7 krokov

Video: Teplota a vlhkosť pomocou ESP32-DHT22-MQTT-MySQL-PHP: 7 krokov
Video: Meranie teploty a vlhkosti v domácnosti 2024, November
Anonim
Teplota a vlhkosť pomocou ESP32-DHT22-MQTT-MySQL-PHP
Teplota a vlhkosť pomocou ESP32-DHT22-MQTT-MySQL-PHP

Moja priateľka chcela skleník, tak som jej ho vyrobil. Ale chcel som snímač teploty a vlhkosti vo vnútri skleníka. Vygooglil som preto príklady a začal experimentovať.

Môj záver bol, že všetky príklady, ktoré som našiel, nie sú presne to, čo som chcel postaviť. Chytil som veľa malých častí kódu a skombinoval ich. Trvalo mi dlho, kým som dokončil svoju prvú pracovnú zostavu, pretože dokumentácia väčšiny príkladov bola pre mňa príliš ťažká na pochopenie alebo predpokladali časť, ktorú by som mal vedieť? Ale nič som (zatiaľ) nevedel ☹

Preto zostavujem tento návod. Výučba „od začiatku do konca“, ktorej porozumie doslova každý. (Aspoň dúfam?)

Ako to funguje …

Konečným výrobkom je ESP32-CAM so snímačom DHT22, ktorý je k nemu napájaný z batérie 18650. Každé tri minúty odčíta teplotu a vlhkosť a odošle ich prostredníctvom WiFi na externý server MQTT a potom prejde do režimu spánku (na tri minúty), aby podľa potreby použil menej batérie

Na serveri Debian (čo môže byť hádam aj malinový pi) mám python3, server MQTT, server MySQL a webový server

Skript python3 beží ako služba a vždy, keď dostane správu MQTT, spočíta predchádzajúci počet záznamov (indexové číslo) a zvýši ho o jednu. Potom prečíta hodnoty teploty a vlhkosti zo správy MQTT. Kontroluje falošné hodnoty a vždy, keď sú hodnoty správne, odošle hodnoty spolu s novým číslom indexu a aktuálnym dátumom a časom na server MySQL

Webový server má skript PHP, ktorý číta hodnoty zo servera MySQL a vytvára z neho pekný graf pomocou grafov Google. (príklad)

Zásoby

Časti, ktoré som použil, sú nasledujúce:

  • ESP32-CAM (Dôvod, prečo som použil verziu pre kameru, je ten, že je na nej konektor externej antény. Pravdepodobne existujú aj ďalšie typy ESP32, ktoré by ste mohli použiť)
  • Externá anténa
  • Senzor AM2302 DHT22 (Tento má vstavaný odpor, takže potrebujete iba tri vodiče)

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

  • Štítok batérie 18650 v3
  • Batéria 18650 (NCR18650B)
  • Starý kábel micro USB (na pripojenie ESP32 k krytu batérie)
  • Niektoré krátke prepojovacie vodiče

Potrebné navyše:

  • Konektor USB na TTL (obrázok)

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

  • Spájkovačka
  • 3D tlačiareň (potrebná iba pre puzdro)

Krok 1: Nahrajte kód Arduino do ESP32-CAM

Nahrajte kód Arduino do ESP32-CAM
Nahrajte kód Arduino do ESP32-CAM

Začnime teda!

Ak chcete nahrať kód Arduino do ESP32-CAM, musíte pripojiť konektor USBtoTTL k ESP32 pomocou vyššie uvedených schém.

Kód Arduino je:

/*Len malý program na čítanie teploty a vlhkosti zo snímača DHT22 a

odovzdajte to MQTT. B. Duijnhouwer, 8. júna 2020*/#include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // wifi heslo #define mqtt_server "*** SERVER_NAME ***" // názov servera alebo IP #define mqtt_user "*** MQTT_USER ***" // užívateľské meno #define mqtt_password "*** MQTT_PASSWORD ***" // heslo #definovať tému "skleník /dhtreadings "#define debug_topic" glasshouse /debug "// Téma pre ladenie /* definície pre hlboký spánok* /#define uS_TO_S_FACTOR 1000000 /* Prevodný faktor na mikro sekundy až sekundy* /#define TIME_TO_SLEEP 180 /* Čas, kedy ESP32 prejde do režimu spánku na 5 minút (v sekundách) */ bool debug = true; // Zobraziť správu denníka, ak je True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; Klient PubSubClient (espClient); údaje o znakoch [80]; void setup () {Serial.begin (115200); setup_wifi (); // Pripojenie k sieti Wi -Fi client.setServer (mqtt_server, 1883); // Konfigurujte pripojenie MQTT, v prípade potreby zmeňte port. if (! client.connected ()) {reconnect (); } // READ DATA int chk = DHT.read22 (DHT22_PIN); float t = DHT.teplota; plavák h = DHT.vlhkosť; Reťazec dhtReadings = "{" teplota / ": \" " + Reťazec (t) +" / ", \" vlhkosť / ": \" " + Reťazec (h) +" / "}"; dhtReadings.toCharArray (údaje, (dhtReadings.length () + 1)); if (ladenie) {Serial.print ("Teplota:"); Serial.print (t); Serial.print ("| Vlhkosť:"); Serial.println (h); } // Publikovanie hodnôt do tém MQTT client.publish (téma, údaje); // Publikovanie čítaní na tému (skleník/dhtreadings) if (ladenie) {Serial.println ("Čítania odoslané do MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // ísť do režimu spánku Serial.println ("Nastaviť ESP32, aby spal pre všetky" + reťazce (TIME_TO_SLEEP) + "sekundy"); Serial.println („Teraz budem normálne spať.“); esp_deep_sleep_start (); } // Nastavenie pripojenia k wifi neplatné setup_wifi () {oneskorenie (20); Serial.println (); Serial.print („Pripojenie k“); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {oneskorenie (100); Serial.print ("."); } Serial.println (""); Serial.println („WiFi je v poriadku“); Serial.print ("=> Nová adresa IP ESP32 je:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Znova sa pripojte k sieti Wi -Fi, ak dôjde k strate pripojenia, neplatí, znova pripojiť () {while (! Client.connected ()) {Serial.print ("Pripojenie k maklérovi MQTT …"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Chyba] Nepripojené:"); Serial.print (client.state ()); Serial.println ("Počkajte 5 sekúnd, než to skúsite znova."); oneskorenie (5 000); }}} prázdna slučka () {}

A znova nezabudnite nahradiť poverenia svojimi vlastnými povereniami

Krok 2: Pripojte sa

Prepájať!
Prepájať!

Na napájanie som použil starý USB kábel, z ktorého som prerušil konektor USB-A. V kábli USB sú štyri vodiče, potrebujeme iba čierny a červený.

Pripojte teda všetko podľa vyššie uvedeného plánu.

Krok 3: Skript Python3

Skript Python3 prejde na miesto, kde je prístupný používateľovi root.

Pre tento skript som použil /root/scripts/glasshouse/glasshouse.py. Obsah skriptu python je:

# Skript Python3 na pripojenie k MQTT, čítanie hodnôt a ich zapisovanie do MySQL

# # B. Duijnhouwer # June, 8th 2020 # # version: 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", "glasshouse", "*** 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, userdata, flags, rc): #The callback for when the client appears to the broker print (" Connected s kódom výsledku {0} ". formát (str (rc))) # Vytlačí výsledok pokusu o pripojenie client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (klient, užívateľské údaje, správa): # Spätné volanie, keď PUBLIKOVANÁ správa je prijatá zo servera. 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 ') užitočné zaťaženie = json.loads (msg.payload.decode (' utf-8 ')) print ("Nový riadok:"+str (newrow)) teplota = plávajúca (užitočné zaťaženie ["teplota"]) vlhkosť = float (užitočné zaťaženie ["vlhkosť"]) print ("Teplota:"+str (teplota)) vytlačiť ("Vlhkosť:"+str (vlhkosť)) vytlačiť ("DateTime:"+str (formatted_date)) if ((teplota > -20) a (teplota = 0) a (vlhkosť <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, teplota, vlhkosť, timestamp) VALUES ("+str (newrow)+","+str (teplota)+","+str (vlhkosť)+", %s)", (formatted_date)) db.commit () print ("údaje prijaté a importované v MySQL") iné: print ("údaje prekročili limity a NIE sú importované do MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (užívateľ, heslo = heslo) client.on_connect = on_connect # definovať funkciu spätného volania pre úspešné pripojenie client.on_message = on_message # Definujte funkciu spätného volania pre prijatie správy client.connect (broker_address, port = port) #connect to broker client.loop_forever () # Start networking daemon

Nezabudnite nahradiť používateľské meno a heslo MySQL a používateľské meno a heslo MQTT za svoje vlastné poverenia

Skript môžete spustiť ako službu vytvorením dvoch súborov.

Prvý z nich je „/etc/init/glasshouse.conf“s nasledujúcim obsahom:

začať na úrovni behu [2345]

zastaviť sa na úrovni behu [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Ten druhý je „/etc/systemd/system/multi-user.target.wants/glasshouse.service nerozumie sa s týmto obsahom:

[Jednotka]

Popis = Služba monitorovania skleníka Po = multi-user.target [Služba] Typ = jednoduchý Reštart = vždy RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Inštalovať] WantedBy = viac užívateľov.cieľ

Môžete to spustiť ako službu pomocou nasledujúceho príkazu:

systemctl povoliť skleník

a spustite ho pomocou:

systemctl start glasshouse

Krok 4: Server MySQL

Musíte vytvoriť novú databázu MySQL s jedinou tabuľkou.

Kód na vytvorenie tabuľky je:

VYTVORIŤ TABUĽKU `sensordata` (`idx` int (11) DEFAULT NULL,` teplota` float DEFAULT NULL, `vlhkosť` float DEFAULT NULL,` timestamp` datetime DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Krok 5: Webový server

Webový server má dva súbory, súbor index.php a jeden súbor config.ini

Obsah súboru config.ini je:

[databáza]

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

Kde mimo kurzu nahradíte *** DATABASE_USER *** a *** DATABASE_PASSWORD *** svojimi vlastnými povereniami.

google.charts.load ('aktuálny', {'balíčky': ['corechart']}); google.charts.setOnLoadCallback (drawChart); funkcia drawChart () {var data = google.visualization.arrayToDataTable ([// ['Časová pečiatka', 'Teplota', 'Vlhkosť', 'Tepelný index'], ['Časová pečiatka', 'Teplota', 'Vlhkosť'], query ($ sql); # This while - loop format and put all the retrieved data into ['timestamp', 'temperature', 'vlhkost'] way. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"], 10, 6); echo "['". $ timestamp_rest. "',". $ row ['teplota']. ",". $ riadok ['vlhkosť']. "],"; // echo "['". $ timestamp_rest. "',". $ riadok ['teplota']. ",". $ riadok ['vlhkosť']. ",". $ riadok ['heatindex ']. "],";}?>]); // Curved line var options = {title: 'Teplota a vlhkosť', curveType: 'function', legenda: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Zakrivený graf var chart = nový google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (údaje, možnosti); } // Koncová zátvorka z drawChart //

Krok 6: 3D tlačené puzdro

Na puzdro som použil dve oddelené puzdra, jedno pre ESP32-CAM a DHT22 spoločne a jedno pre tienenie batérie 18650.

Krok 7: Konečný výsledok

Konečný výsledok!
Konečný výsledok!
Konečný výsledok!
Konečný výsledok!
Konečný výsledok!
Konečný výsledok!
Konečný výsledok!
Konečný výsledok!

Konečný výsledok je tiež zobrazený na obrázkoch vyššie.

A kedykoľvek je batéria vybitá, môžete ju nabiť pomocou mini USB kábla.

Odporúča: