Obsah:

Teplota a vlhkost pomocí ESP32-DHT22-MQTT-MySQL-PHP: 7 kroků
Teplota a vlhkost pomocí ESP32-DHT22-MQTT-MySQL-PHP: 7 kroků

Video: Teplota a vlhkost pomocí ESP32-DHT22-MQTT-MySQL-PHP: 7 kroků

Video: Teplota a vlhkost pomocí ESP32-DHT22-MQTT-MySQL-PHP: 7 kroků
Video: SONOFF TH16 - teplota, vlhkost - chytrá krabička pro spínáni elektro zařízení 2024, Listopad
Anonim
Teplota a vlhkost pomocí ESP32-DHT22-MQTT-MySQL-PHP
Teplota a vlhkost pomocí ESP32-DHT22-MQTT-MySQL-PHP

Moje přítelkyně chtěla skleník, tak jsem jí udělal. Chtěl jsem ale uvnitř skleníku snímač teploty a vlhkosti. Tak jsem googlil pro příklady a začal experimentovat.

Můj závěr byl, že všechny příklady, které jsem našel, nebyly přesně to, co jsem chtěl postavit. Popadl jsem spoustu malých částí kódu a spojil je. Trvalo mi docela dlouho, než jsem dokončil svou první pracovní sestavu, protože dokumentace většiny příkladů byla pro mě příliš obtížná na pochopení, nebo předpokládali část, kterou bych měl vědět? Ale nic jsem (zatím) nevěděl ☹

Proto stavím tento návod. Výukový program „od začátku do konce“, kterému porozumí doslova každý. (Alespoň doufám?)

Jak to funguje …

Konečným produktem je ESP32-CAM se snímačem DHT22, který je napájen baterií 18650. Každé tři minuty čte teplotu a vlhkost a odešle to přes WiFi na externí server MQTT a poté přejde do režimu spánku (na tři minuty), aby podle potřeby spotřeboval méně baterie

Na serveru Debian (což by podle mě mohl být také malinový pi) mám python3, server MQTT, server MySQL a webový server

Skript python3 běží jako služba a kdykoli obdrží zprávu MQTT, započítá předchozí počet položek (indexové číslo) a zvýší je o jednu. Poté načte hodnoty teploty a vlhkosti ze zprávy MQTT. Kontroluje falešné hodnoty a kdykoli jsou hodnoty správné, odešle hodnoty spolu s novým indexovým číslem a aktuálním datem a časem na server MySQL

Webový server má skript PHP, který čte hodnoty ze serveru MySQL a vytváří z něj pěkný graf pomocí grafů Google. (příklad)

Zásoby

Díly, které jsem použil, jsou následující:

  • ESP32-CAM (Důvod, proč jsem použil verzi pro kameru, je ten, že má na sobě konektor externí antény. Pravděpodobně existují i jiné ESP32, které byste mohli použít)
  • Externí anténa
  • Senzor AM2302 DHT22 (Tento má vestavěný odpor, takže potřebujete pouze tři vodiče)

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

  • 18650 baterie štít v3
  • Baterie 18650 (NCR18650B)
  • Starý kabel micro USB (pro připojení ESP32 ke krytu baterie)
  • Některé krátké propojovací vodiče

Extra potřebné:

  • Konektor USB na TTL (obrázek)

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

  • Páječka
  • 3D tiskárna (nutná pouze pro pouzdro)

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

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

Začněme tedy!

Chcete-li nahrát kód Arduino do ESP32-CAM, musíte připojit konektor USBtoTTL k ESP32 pomocí výše uvedených schémat.

Kód Arduino je:

/*Jen malý program pro čtení teploty a vlhkosti ze senzoru DHT22 a

předejte to MQTT. B. Duijnhouwer, 8. června 2020*/#include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // wifi heslo #define mqtt_server "*** SERVER_NAME ***" // název serveru nebo IP #define mqtt_user "*** MQTT_USER ***" // uživatelské jméno #define mqtt_password "*** MQTT_PASSWORD ***" // heslo #definovat téma "skleník /dhtreadings "#define debug_topic" glasshouse /debug "// Téma pro ladění /* definice pro deepsleep* /#define uS_TO_S_FACTOR 1000000 /* Převodní faktor pro mikro sekundy na sekundy* /#define TIME_TO_SLEEP 180 /* Čas ESP32 přejde do režimu spánku po dobu 5 minut (v sekundách) */ bool debug = true; // Zobrazit zprávu protokolu, pokud True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; Klient PubSubClient (espClient); char data [80]; neplatné nastavení () {Serial.begin (115200); setup_wifi (); // Připojení k síti Wifi client.setServer (mqtt_server, 1883); // Konfigurujte připojení MQTT, v případě potřeby změňte port. if (! client.connected ()) {reconnect (); } // ČTENÍ DAT int chk = DHT.read22 (DHT22_PIN); float t = DHT.teplota; float h = DHT. vlhkost; Řetězec dhtReadings = "{" teplota / ": \" " + Řetězec (t) +" / ", \" vlhkost / ": \" " + Řetězec (h) +" / "}"; dhtReadings.toCharArray (data, (dhtReadings.length () + 1)); if (debug) {Serial.print ("Teplota:"); Serial.print (t); Serial.print ("| Vlhkost:"); Serial.println (h); } // Publikování hodnot do témat MQTT client.publish (téma, data); // Publikování čtení na téma (glasshouse/dhtreadings) if (debug) {Serial.println ("Čtení odeslané do MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // přejít do režimu spánku Serial.println ("Nastavit ESP32, aby spal pro každý" + řetězec (TIME_TO_SLEEP) + "sekundy"); Serial.println („Jít teď normálně spát.“); esp_deep_sleep_start (); } // Nastavení připojení k wifi neplatné setup_wifi () {zpoždění (20); Serial.println (); Serial.print („Připojování k“); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {zpoždění (100); Serial.print ("."); } Serial.println (""); Serial.println („WiFi je v pořádku“); Serial.print ("=> Nová IP adresa ESP32 je:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Znovu se připojit k wifi, pokud je připojení ztraceno neplatné znovu připojit () {while (! Client.connected ()) {Serial.print ("Connecting to MQTT broker…"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Chyba] Nepřipojeno:"); Serial.print (client.state ()); Serial.println („Počkejte 5 sekund, než to zkusíte znovu.“); zpoždění (5000); }}} void loop () {}

A znovu nezapomeňte nahradit přihlašovací údaje svými vlastními přihlašovacími údaji

Krok 2: Zapojte se

Připojit!
Připojit!

K napájení jsem použil starý USB kabel, u kterého jsem přerušil konektor USB-A. V kabelu USB jsou čtyři vodiče, potřebujeme pouze černý a červený.

Připojte tedy vše podle plánu výše.

Krok 3: Python3 Script

Skript Python3 přejde na místo, kde je přístupný uživateli root.

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

# Skript Python3 pro připojení k MQTT, čtení hodnot a jejich zápis do MySQL

# # B. Duijnhouwer # červen, 8. 2020 # # verze: 1.0 # # import paho.mqtt.client jako mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb z 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ódem výsledku {0} ". format (str (rc))) # Vytisknout výsledek pokusu o připojení client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (klient, uživatelská data, zpráva): # Zpětné volání při PUBLIKOVANÁ zpráva je přijata ze serveru. 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žitečné zatížení = json.loads (msg.payload.decode (' utf-8 ')) tisk ("Nový řádek:"+str (newrow)) teplota = plovoucí (užitečné zatížení ["teplota"]) vlhkost = float (užitečné zatížení ["vlhkost"]) tisk ("Teplota:"+str (teplota)) tisk ("Vlhkost:"+str (vlhkost)) tisk ("DateTime:"+str (formatted_date)) if ((teplota > -20) a (teplota = 0) a (vlhkost <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, teplota, vlhkost, timestamp) VALUES ("+str (newrow)+","+str (teplota)+","+str (vlhkost)+", %s)", (formatted_date)) db.commit () print ("data přijata a importována v MySQL") else: print ("data překročila limity a NENÍ importována do MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (uživatel, heslo = heslo) client.on_connect = on_connect # definovat funkci zpětného volání pro úspěšné připojení client.on_message = on_message # Definujte funkci zpětného volání pro příjem zprávy client.connect (broker_address, port = port) #connect to broker client.loop_forever () # Start networking daemon

Nezapomeňte nahradit uživatelské jméno a heslo MySQL a uživatelské jméno a heslo MQTT za své vlastní přihlašovací údaje

Skript můžete spustit jako službu vytvořením dvou souborů.

První z nich je „/etc/init/glasshouse.conf“s následujícím obsahem:

začít na runlevelu [2345]

zastavit na úrovni běhu [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Ten druhý je „/etc/systemd/system/multi-user.target.wants/glasshouse.service nerozumí s následujícím obsahem:

[Jednotka]

Description = 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.cílová

Můžete jej spustit jako službu pomocí následujícího příkazu:

systemctl povolit skleník

a spusťte jej pomocí:

systemctl start glasshouse

Krok 4: Server MySQL

Musíte vytvořit novou databázi MySQL s jedinou tabulkou.

Kód pro vytvoření tabulky je:

VYTVOŘIT TABULKU `sensordata` (`idx` int (11) DEFAULT NULL,` teplota` float DEFAULT NULL, `vlhkost` float DEFAULT NULL,` timestamp` datetime DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Krok 5: Webový server

Webový server má dva soubory, soubor index.php a jeden soubor config.ini

Obsah souboru config.ini je:

[databáze]

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

Kde mimo hřiště nahradíte *** DATABASE_USER *** a *** DATABASE_PASSWORD *** svými vlastními přihlašovacími údaji.

google.charts.load ('aktuální', {'balíčky': ['corechart']}); google.charts.setOnLoadCallback (drawChart); funkce drawChart () {var data = google.visualization.arrayToDataTable ([// ['Timestamp', 'Temperature', 'Humidity', 'Heat Index'], ['Timestamp', 'Temperature', 'Humidity'], query ($ sql); # This while - loop formats 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']. ",". $ řádek ['vlhkost']. "],"; // echo "['". $ timestamp_rest. "',". $ řádek ['teplota']. ",". $ řádek ['vlhkost']. ",". $ řádek ['heatindex ']. "],";}?>]); // Zakřivená čára var options = {title: 'Teplota a vlhkost', curveType: 'funkce', legenda: {pozice: 'dole'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Zakřivený graf var chart = nový google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (data, možnosti); } // Koncová závorka z drawChart //

Krok 6: 3D tištěné pouzdro

Pro pouzdro jsem použil dvě samostatná pouzdra, jedno pro ESP32-CAM a DHT22 dohromady a jedno pro štít baterie 18650.

Krok 7: Konečný výsledek

Konečný výsledek!
Konečný výsledek!
Konečný výsledek!
Konečný výsledek!
Konečný výsledek!
Konečný výsledek!
Konečný výsledek!
Konečný výsledek!

Konečný výsledek je také uveden na obrázcích výše.

A kdykoli je baterie vybitá, můžete ji nabít pomocí mini USB kabelu.

Doporučuje: