Sommario:

Temperatura e umidità utilizzando ESP32-DHT22-MQTT-MySQL-PHP: 7 passaggi
Temperatura e umidità utilizzando ESP32-DHT22-MQTT-MySQL-PHP: 7 passaggi

Video: Temperatura e umidità utilizzando ESP32-DHT22-MQTT-MySQL-PHP: 7 passaggi

Video: Temperatura e umidità utilizzando ESP32-DHT22-MQTT-MySQL-PHP: 7 passaggi
Video: ESP32 DHT Web Server Project 2024, Luglio
Anonim
Temperatura e umidità utilizzando ESP32-DHT22-MQTT-MySQL-PHP
Temperatura e umidità utilizzando ESP32-DHT22-MQTT-MySQL-PHP

La mia ragazza voleva una serra, quindi gliene ho fatta una. Ma volevo un sensore di temperatura e umidità all'interno della serra. Quindi, ho cercato su Google degli esempi e ho iniziato a sperimentare.

La mia conclusione è stata che tutti gli esempi che ho trovato non erano esattamente ciò che volevo costruire. Ho preso molte piccole parti di codice e le ho combinate. Mi ci è voluto un po' di tempo per finire la mia prima build funzionante perché la documentazione della maggior parte degli esempi era troppo difficile da capire per me o presumevano una parte che avrei dovuto conoscere?? Ma non sapevo nulla (ancora) ☹

Ecco perché costruisco questo istruibile. Un tutorial "dall'inizio alla fine" che letteralmente tutti possono capire. (almeno spero?)

Come funziona …

Il prodotto finale è un ESP32-CAM con un sensore DHT22 collegato ad esso che riceve energia da una batteria 18650. Ogni tre minuti legge la temperatura e l'umidità e la invia tramite WiFi a un server MQTT esterno e poi va in sospensione (per tre minuti) per utilizzare meno batteria necessaria

Su un server Debian, (che potrebbe anche essere un raspberry pi immagino) ho python3, un server MQTT, un server MySQL e un server web

Lo script python3 viene eseguito come servizio e ogni volta che riceve un messaggio MQTT, conta il numero precedente di voci (numero di indice) e lo incrementa di uno. Quindi legge i valori della temperatura e dell'umidità dal messaggio MQTT. Controlla i valori falsi e ogni volta che i valori sono corretti, invia i valori insieme al nuovo numero di indice e la data e l'ora correnti a un server MySQL

Il server web ha uno script PHP che legge i valori dal server MySQL e ne ricava un bel grafico utilizzando Google Charts. (esempio)

Forniture

Le parti che ho utilizzato sono le seguenti:

  • ESP32-CAM (Il motivo per cui ho usato la versione cam è perché ha un connettore per antenna esterna. Probabilmente ci sono anche altri ESP32 che potresti usare)
  • Antenna esterna
  • Sensore AM2302 DHT22 (questo ha un resistore integrato, quindi sono necessari solo tre fili)

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

  • Scudo batteria 18650 v3
  • Batteria 18650 (NCR18650B)
  • Vecchio cavo micro USB (per collegare ESP32 allo scudo della batteria)
  • Alcuni ponticelli corti

Extra necessari:

  • Da USB a connettore TTL (immagine)

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

  • Saldatore
  • Stampante 3D (necessaria solo per custodia)

Passaggio 1: carica il codice Arduino su ESP32-CAM

Carica il codice Arduino su ESP32-CAM
Carica il codice Arduino su ESP32-CAM

Quindi cominciamo!

Per caricare il codice Arduino sull'ESP32-CAM, devi collegare il connettore USBtoTTL all'ESP32 usando gli schemi sopra.

Il codice Arduino è:

/*Solo un programmino per leggere la temperatura e l'umidità da un sensore DHT22 e

passalo a MQTT. B. Duijnhouwer, 8 giugno 2020 */ #include #include #include #define wifi_ssid "***WIFI_SSID***" //wifi ssid #define wifi_password "***WIFI_PASSWORD***" //wifi password #define mqtt_server "***SERVER_NAME***" // nome del server o IP #define mqtt_user "***MQTT_USER***" // username #define mqtt_password "***MQTT_PASSWORD***" // password #define topic "glasshouse /dhtreadings" #define debug_topic "glasshouse/debug" //Argomento per il debug /* definizioni per deepsleep */ #define uS_TO_S_FACTOR 1000000 /* Fattore di conversione per micro secondi in secondi */ #define TIME_TO_SLEEP 180 /* Tempo in cui ESP32 andrà a dormire per 5 minuti (in secondi) */ bool debug = true; //Visualizza il messaggio di registro se True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient client(espClient); dati char[80]; void setup() { Serial.begin(115200); setup_wifi(); //Connettiti alla rete Wi-Fi client.setServer(mqtt_server, 1883); // Configura la connessione MQTT, cambia la porta se necessario. if (!client.connected()) { reconnect(); } // LEGGI DATI int chk = DHT.read22(DHT22_PIN); galleggiante t = temperatura DHT; float h = DHT.umidità; String dhtReadings = "{"temperature\":\"" + String(t) + "\", \"umidità\":\"" + String(h) + "\"}"; dhtReadings.toCharArray(data, (dhtReadings.length() + 1)); if (debug) { Serial.print("Temperatura: "); Serial.print(t); Serial.print(" | Umidità: "); Serial.println(h); } // Pubblica i valori negli argomenti MQTT client.publish(topic, data); // Pubblica le letture sull'argomento (serra/dhtreadings) if (debug) { Serial.println("Letture inviate a MQTT."); } esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); //vai in stop Serial.println("Imposta ESP32 in stop per ogni " + String(TIME_TO_SLEEP) + " Seconds"); Serial.println("Adesso vado a dormire normalmente."); esp_deep_sleep_start(); } //Configura la connessione al wifi void setup_wifi() { delay(20); Serial.println(); Serial.print("Connessione a "); Serial.println(wifi_ssid); WiFi.begin(wifi_ssid, wifi_password); while (WiFi.status() != WL_CONNECTED) { ritardo(100); Serial.print("."); } Serial.println(""); Serial.println("WiFi è OK"); Serial.print("=> il nuovo indirizzo IP di ESP32 è: "); Serial.print(WiFi.localIP()); Serial.println(""); } //Riconnettiti al wifi se la connessione viene persa void reconnect() { while (!client.connected()) { Serial.print("Connessione al broker MQTT …"); if (client.connect("ESP32Client", mqtt_user, mqtt_password)) { Serial.println("OK"); } else { Serial.print("[Errore] Non connesso: "); Serial.print(client.state()); Serial.println("Attendi 5 secondi prima di riprovare."); ritardo (5000); } } } ciclo vuoto() { }

E ancora, non dimenticare di sostituire le credenziali con le tue credenziali

Passaggio 2: collega

Cablare!
Cablare!

Per l'alimentazione ho utilizzato un vecchio cavo USB di cui ho tagliato il connettore USB-A. Ci sono quattro fili nel cavo USB, abbiamo bisogno solo di quelli neri e rossi.

Quindi, collega tutto secondo il programma sopra.

Passaggio 3: script Python3

Lo script Python3 va in un luogo in cui è accessibile all'utente root.

Ho usato /root/scripts/glasshouse/glasshouse.py per questo script. Il contenuto dello script python è:

# Script Python3 per connettersi a MQTT, leggere i valori e scriverli in MySQL

# # B. Duijnhouwer # 8 giugno 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): # Il callback per quando il client si connette al broker print("Connesso con codice risultato {0}".format(str(rc))) # Stampa il risultato del tentativo di connessione client.subscribe("glasshouse/dhtreadings/#") def on_message(client, userdata, msg): # Il callback per quando un Il messaggio PUBLISH viene ricevuto dal server. cursor.execute ("seleziona * da sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 now = datetime.now() formatted_date = now.strftime('%Y-%m-%d %H:% M:%S') payload = json.loads(msg.payload.decode('utf-8')) print("Nuova riga: "+str(newrow)) temperatura = float(payload["temperatura"]) umidità = float(payload["umidità"]) print("Temperatura: "+str(temperatura)) print("Umidità: "+str(umidità)) print("DateTime: "+str(formatted_date)) if ((temperature > -20) e (temperatura = 0) e (umidità <= 100)): cur = db.cursor() cur.execute("INSERT INTO glasshouse.sensordata (idx, temperatura, umidità, timestamp) VALUES ("+str (newrow)+", "+str(temperature)+", "+str(humidity)+", %s)", (formatted_date)) db.commit() print("dati ricevuti e importati in MySQL") else: print("i dati hanno superato i limiti e NON sono importati in MySQL") client = mqtt. Client("duijnhouwer-com-glasshouse-script") client.username_pw_set(user, password=password) client.on_connect = on_connect # Define callback function per connessione riuscita client.on_message = on_message # Definisce la funzione di callback per la ricezione di un messaggio client.connect(broker_address, port=port) #connect to broker client.loop_forever() # Avvia il demone di rete

Non dimenticare di sostituire il nome utente e la password MySQL e il nome utente e la password MQTT con le tue credenziali

È possibile eseguire lo script come servizio creando due file.

Il primo è “/etc/init/glasshouse.conf” con i seguenti contenuti:

avvia su runlevel [2345]

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

Il secondo è “/etc/systemd/system/multi-user.target.wants/glasshouse.service” con i seguenti contenuti:

[Unità]

Description=Servizio di monitoraggio Glasshouse After=multi-user.target [Service] Type=semplice Restart=sempre RestartSec=1 ExecStart=/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Install] WantedBy=multi-user.obbiettivo

Puoi farlo funzionare come un servizio usando il seguente comando:

systemctl abilita la serra

e avvialo usando:

systemctl avvia la serra

Passaggio 4: server MySQL

Devi creare un nuovo database MySQL con una sola tabella al suo interno.

Il codice per creare la tabella è:

CREATE TABLE `sensordata` (`idx` int(11) DEFAULT NULL, `temperature` float DEFAULT NULL, `humidity` float DEFAULT NULL, `timestamp` datetime DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Passaggio 5: server Web

Il server web ha due file, il file index.php e un file config.ini

Il contenuto del file config.ini è:

[Banca dati]

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

Dove ovviamente sostituisci ***DATABASE_USER*** e ***DATABASE_PASSWORD*** con le tue credenziali.

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'], query($sql); # Questo ciclo while formatta e mette tutti i dati recuperati in ['timestamp', 'temperature', 'humidity']. while ($row = $result->fetch_assoc()) { $timestamp_rest = substr($row["timestamp"], 10, 6); echo "['".$timestamp_rest."', ".$row['temperatura']", ".$row['umidità']. "], "; // echo "['".$timestamp_rest."', ".$row['temperatura']", ".$row['umidità']", ".$row['indice di calore" ']."], "; } ?>]); // Linea curva var options = { title: 'Temperatura e umidità', curveType: 'function', legend: { position: 'bottom' }, hAxis: { slantedText:true, slantedTextAngle:45 } }; // Grafico curvo var chart = new google.visualization. LineChart(document.getElementById('curve_chart')); chart.draw(dati, opzioni); } // Parentesi finale da drawChart //

Passaggio 6: custodia stampata in 3D

Per l'alloggiamento, ho usato due alloggiamenti separati, uno per ESP32-CAM e DHT22 insieme e uno per lo scudo della batteria 18650.

Passaggio 7: il risultato finale

Il risultato finale!
Il risultato finale!
Il risultato finale!
Il risultato finale!
Il risultato finale!
Il risultato finale!
Il risultato finale!
Il risultato finale!

Il risultato finale è mostrato anche nelle immagini sopra.

E ogni volta che la batteria è scarica, puoi caricarla con un cavo mini USB.

Consigliato: