Innehållsförteckning:

Temperatur och luftfuktighet med ESP32-DHT22-MQTT-MySQL-PHP: 7 steg
Temperatur och luftfuktighet med ESP32-DHT22-MQTT-MySQL-PHP: 7 steg

Video: Temperatur och luftfuktighet med ESP32-DHT22-MQTT-MySQL-PHP: 7 steg

Video: Temperatur och luftfuktighet med ESP32-DHT22-MQTT-MySQL-PHP: 7 steg
Video: Klimatdetektor – Läs Av Temperatur Och Luftfuktighet I Mobilen (2020) 2024, Juli
Anonim
Temperatur och luftfuktighet med hjälp av ESP32-DHT22-MQTT-MySQL-PHP
Temperatur och luftfuktighet med hjälp av ESP32-DHT22-MQTT-MySQL-PHP

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

Ladda upp Arduino-koden till ESP32-CAM
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

Koppla upp!
Koppla upp!

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

Slutresultatet!
Slutresultatet!
Slutresultatet!
Slutresultatet!
Slutresultatet!
Slutresultatet!
Slutresultatet!
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: