Innehållsförteckning:
- Tillbehör
- Steg 1: Ladda upp Arduino-koden till ESP32-CAM
- Steg 2: Wire Up
- Steg 3: Python3 -skript
- Steg 4: MySQL -server
- Steg 5: Webbserver
- Steg 6: 3D -tryckt hus
- Steg 7: Slutresultatet
Video: Temperatur och luftfuktighet med ESP32-DHT22-MQTT-MySQL-PHP: 7 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:40
Min flickvän ville ha ett växthus, så jag gjorde ett till henne. Men jag ville ha en temperatur- och fuktsensor inuti växthuset. Så jag googlade efter exempel och började experimentera.
Min slutsats var att alla exempel som jag hittade inte var exakt vad jag ville bygga. Jag tog många små delar av koden och kombinerade dem. Det tog ett tag innan jag slutförde min första konstruktion eftersom dokumentationen för de flesta exemplen var för svår för mig att förstå eller om de antog en del som jag borde veta ?? Men jag visste ingenting (än) ☹
Det är därför jag bygger detta instruerbart. En handledning från början till slutet för bokstavligen alla att förstå. (Hoppas jag åtminstone?)
Hur det fungerar …
Slutprodukten är en ESP32-CAM med en DHT22-sensor ansluten till den som får ström från ett 18650-batteri. Var tredje minut läser den temperatur och luftfuktighet och skickar detta via WiFi till en extern MQTT -server och går sedan i viloläge (i tre minuter) för att använda så lite batteri som behövs
På en Debian -server, (som också kan vara en hallon pi antar jag) har jag python3, en MQTT -server, en MySQL -server och en webbserver
Python3 -skriptet körs som en tjänst och när det tar emot ett MQTT -meddelande räknar det föregående antalet poster (indexnummer) och ökar detta med en. Därefter läser den värdena för temperaturen och luftfuktigheten från MQTT -meddelandet. Den söker efter falska värden och när värdena är korrekta skickar de värdena tillsammans med det nya indexnumret och aktuellt datum och tid till en MySQL -server
Webbservern har ett PHP -skript som läser värdena från MySQL -servern och gör ett bra diagram från den med hjälp av Google Charts. (exempel)
Tillbehör
Delarna jag använde är följande:
- ESP32-CAM (Anledningen till att jag använde kamversionen är för att den har en extern antennkontakt på den. Det finns förmodligen även andra ESP32: er du kan använda)
- Extern antenn
-
AM2302 DHT22-sensor (den här har ett inbyggt motstånd, så du behöver bara tre ledningar)
https://www.amazon.de/gp/product/B07CM2VLBK/ref=p…
- 18650 batterisköld v3
- 18650 batteri (NCR18650B)
- Gammal mikro -USB -kabel (för anslutning av ESP32 till batteriskyddet)
- Några korta bygeltrådar
Extra behövs:
-
USB till TTL -kontakt (bild)
https://www.amazon.de/FT232RL-Seriell-Unterst%C3%…
- Lödkolv
- 3D -skrivare (behövs endast för hölje)
Steg 1: Ladda upp Arduino-koden till ESP32-CAM
Så låt oss börja!
För att ladda upp Arduino-koden till ESP32-CAM måste du ansluta USBtoTTL-kontakten till ESP32 med hjälp av schemat ovan.
Arduino -koden är:
/*Bara ett litet program för att läsa temperatur och luftfuktighet från en DHT22 -sensor och
skicka den till MQTT. B. Duijnhouwer juni 8th 2020*/#include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // wifi password #define mqtt_server "*** SERVER_NAME ***" // servernamn eller IP #define mqtt_user "*** MQTT_USER ***" // användarnamn #define mqtt_password "*** MQTT_PASSWORD ***" // lösenord #define topic "glasshouse /dhtreadings "#define debug_topic" glasshouse /debug "// Ämne för felsökning /* definitioner för deepsleep* /#define uS_TO_S_FACTOR 1000000 /* Omvandlingsfaktor i mikrosekunder till sekunder* /#define TIME_TO_SLEEP 180 /* Time ESP32 går i viloläge i 5 minuter (i sekunder) */ bool debug = true; // Visa loggmeddelande om True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient -klient (espClient); rödingdata [80]; void setup () {Serial.begin (115200); setup_wifi (); // Anslut till Wifi -nätverksklient.setServer (mqtt_server, 1883); // Konfigurera MQTT -anslutning, byt port om det behövs. if (! client.connected ()) {reconnect (); } // LÄS DATA int chk = DHT.read22 (DHT22_PIN); flyta t = DHT.temperatur; flyta h = DHT.fuktighet; String dhtReadings = "{" temperatur / ": \" " + Sträng (t) +" / ", \" luftfuktighet / ": \" " + Sträng (h) +" / "}"; dhtReadings.toCharArray (data, (dhtReadings.length () + 1)); if (felsökning) {Serial.print ("Temperatur:"); Serial.print (t); Serial.print ("| Luftfuktighet:"); Serial.println (h); } // Publicera värden till MQTT -ämnen client.publish (ämne, data); // Publicera avläsningar om ämne (glashus/dhtreadings) if (debug) {Serial.println ("Avläsningar skickade till MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // gå i viloläge Serial.println ("Konfigurera ESP32 för att sova för varje" + sträng (TIME_TO_SLEEP) + "sekunder"); Serial.println ("Somnar som vanligt nu."); esp_deep_sleep_start (); } // Inställningsanslutning till wifi void setup_wifi () {delay (20); Serial.println (); Serial.print ("Ansluter till"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); medan (WiFi.status ()! = WL_CONNECTED) {fördröjning (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi är OK"); Serial.print ("=> ESP32 ny IP -adress är:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Anslut igen till wifi om anslutningen förloras ogiltig återanslutning () {medan (! Client.connected ()) {Serial.print ("Ansluter till MQTT -mäklare …"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } annars {Serial.print ("[Fel] Inte ansluten:"); Serial.print (client.state ()); Serial.println ("Vänta 5 sekunder innan du försöker igen."); fördröjning (5000); }}} void loop () {}
Och återigen, glöm inte att ersätta referenserna med dina egna referenser
Steg 2: Wire Up
För strömmen använde jag en gammal USB-kabel som jag klippte av USB-A-kontakten. Det finns fyra ledningar i USB -kabeln, vi behöver bara de svarta och de röda.
Så, anslut allt enligt schemat ovan.
Steg 3: Python3 -skript
Python3 -skriptet går in på en plats där det är tillgängligt för rotanvändaren.
Jag använde /root/scripts/glasshouse/glasshouse.py för detta skript. Innehållet i python -skriptet är:
# Python3 -skript för att ansluta till MQTT, läsa värden och skriva dem till MySQL
# # B. Duijnhouwer # juni, 8: e 2020 # # version: 1.0 # # import paho.mqtt.client som mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb från 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 användarnamn lösenord =" *** MQTT_PASSWORD *** " #Connection password def on_connect (client, userdata, flags, rc): #Callback for when the client connect to the broker print (" Connected med resultatkod {0} ". format (str (rc))) # Utskriftsresultat av anslutningsförsök client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # Återuppringning för när en PUBLISH -meddelande tas emot från servern. cursor.execute ("välj * från sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 nu = datetime.now () formatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') nyttolast = json.loads (msg.payload.decode (' utf-8 ')) print ("Ny rad:"+str (newrow)) temperatur = flottör (nyttolast ["temperatur"]) luftfuktighet = float (nyttolast ["fuktighet"]) print ("Temperatur:"+str (temperatur)) tryck ("Luftfuktighet:"+str (fuktighet)) utskrift ("DateTime:"+str (format_date)) if ((temperatur > -20) och (temperatur = 0) och (luftfuktighet <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, temperatur, fuktighet, tidsstämpel) VÄRDEN ("+str (newrow)+","+str (temperatur)+","+str (fuktighet)+", %s)", (formaterad_datum)) db.commit () print ("data mottagen och importerad i MySQL") annat: print ("data överskred gränser och importeras INTE i MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (användare, lösenord = lösenord) client.on_connect = on_connect # Definiera återuppringningsfunktion för lyckad anslutning client.on_message = on_message # Definiera återuppringningsfunktion för mottagande av ett meddelande client.connect (broker_address, port = port) #connect to broker client.loop_forever () # Starta nätverksdemon
Glöm inte att ersätta MySQL -användarnamnet och lösenordet och MQTT -användarnamnet och lösenordet till dina egna uppgifter
Du kan få skriptet att köra som en tjänst genom att skapa två filer.
Den första är “/etc/init/glasshouse.conf” med följande innehåll:
starta på runlevel [2345]
stoppa på runlevel [! 2345] exec /root/scripts/glasshouse/glasshouse.py
Den andra är “/etc/systemd/system/multi-user.target.wants/glasshouse.service”med följande innehåll:
[Enhet]
Beskrivning = 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.mål
Du kan göra den här körningen som en tjänst med följande kommando:
systemctl möjliggöra växthus
och starta den med:
systemctl start växthus
Steg 4: MySQL -server
Du måste skapa en ny MySQL -databas med bara en tabell i den.
Koden för att skapa tabellen är:
SKAPA TABELL `sensordata` (`idx` int (11) DEFAULT NULL,` temperatur` float DEFAULT NULL, `fukt` float DEFAULT NULL,` tidsstämpel` datetime DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8;
Steg 5: Webbserver
Webbservern har två filer, filen index.php och en config.ini -fil
Innehållet i filen config.ini är:
[databas]
db_host = "localhost" db_name = "glasshouse" db_table = "sensordata" db_user = "*** DATABASE_USER ***" db_password = "*** DATABASE_PASSWORD ***"
Där du självklart ersätter *** DATABASE_USER *** och *** DATABASE_PASSWORD *** med dina egna referenser.
google.charts.load ('current', {'packages': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Timestamp', 'Temperature', 'Humidity', 'Heat Index'], ['Timestamp', 'Temperature', 'Humidity'], fråga ($ sql); # This while - loop formaterar och lägger in all hämtad data till ['tidsstämpel', 'temperatur', 'fuktighet'] sätt. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ rad ["tidsstämpel"], 10, 6); eko "['". $ timestamp_rest. "',". $ rad ['temperatur']. ",". $ rad ['fuktighet']. "],"; // echo "['". $ timestamp_rest. "',". $ rad ['temperatur']. ",". $ rad ['fuktighet']. ",". $ rad ['heatindex ']. "],";}?>]); // Curved line var options = {title: 'Temperatur och luftfuktighet', curveType: 'function', legend: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Curved chart var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (data, alternativ); } // Slutfäste från drawChart //
Steg 6: 3D -tryckt hus
För huset använde jag två separata hus, ett för ESP32-CAM och DHT22 tillsammans och ett för 18650 batteriskydd.
Steg 7: Slutresultatet
Det slutliga resultatet visas också på bilderna ovan.
Och när batteriet är tomt kan du ladda det med en mini -USB -kabel.
Rekommenderad:
Hur man gör luftfuktighet och temperatur i realtid Data Recorder med Arduino UNO och SD-kort - DHT11 Datalogger Simulering i Proteus: 5 steg
Hur man gör luftfuktighet och temperatur i realtid Data Recorder med Arduino UNO och SD-kort | DHT11 Datalogger Simulering i Proteus: Introduktion: hej, det här är Liono Maker, här är YouTube-länk. Vi gör kreativa projekt med Arduino och arbetar med inbäddade system.Data-Logger: En datalogger (även datalogger eller dataregistrator) är en elektronisk enhet som registrerar data över tid med
DHT -övervakning av temperatur och luftfuktighet med hjälp av ESP8266 och AskSensors IoT -plattform: 8 steg
DHT -övervakning av temperatur och luftfuktighet med hjälp av ESP8266 och AskSensors IoT -plattform: I en tidigare instruktion presenterade jag en steg -för -steg -guide för att komma igång med ESP8266 -nodenMCU och AskSensors IoT -plattform. I den här självstudien ansluter jag en DHT11 -sensor till noden MCU. DHT11 är en vanlig temperatur och fukt
Varning om temperatur och luftfuktighet med AWS och ESP32: 11 steg
Varning om temperatur och luftfuktighet med hjälp av AWS och ESP32: I denna handledning kommer vi att mäta olika temperatur- och luftfuktighetsdata med hjälp av temp- och fuktighetssensor. Du lär dig också hur du skickar dessa data till AWS
Mätning av luftfuktighet och temperatur med HIH6130 och Arduino Nano: 4 steg
Mätning av fukt och temperatur med HIH6130 och Arduino Nano: HIH6130 är en fukt- och temperatursensor med digital utgång. Dessa sensorer ger en noggrannhetsnivå på ± 4% RF. Med branschledande långsiktig stabilitet, sann temperaturkompenserad digital I2C, branschledande tillförlitlighet, energieffektivitet
Mätning av luftfuktighet och temperatur med HTS221 och Arduino Nano: 4 steg
Mätning av fukt och temperatur med HTS221 och Arduino Nano: HTS221 är en ultrakompakt kapacitiv digital sensor för relativ luftfuktighet och temperatur. Den innehåller ett avkänningselement och en applikationsspecifik integrerad krets (ASIC) för blandad signal för att tillhandahålla mätinformation genom digital seriell