Sommario:
- Forniture
- Passaggio 1: carica il codice Arduino su ESP32-CAM
- Passaggio 2: collega
- Passaggio 3: script Python3
- Passaggio 4: server MySQL
- Passaggio 5: server Web
- Passaggio 6: custodia stampata in 3D
- Passaggio 7: il risultato finale
Video: Temperatura e umidità utilizzando ESP32-DHT22-MQTT-MySQL-PHP: 7 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:01
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
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
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 è mostrato anche nelle immagini sopra.
E ogni volta che la batteria è scarica, puoi caricarla con un cavo mini USB.
Consigliato:
M5STACK Come visualizzare temperatura, umidità e pressione su M5StickC ESP32 utilizzando Visuino - Facile da eseguire: 6 passaggi
M5STACK Come visualizzare temperatura, umidità e pressione su M5StickC ESP32 utilizzando Visuino - Facile da fare: in questo tutorial impareremo come programmare ESP32 M5Stack StickC con Arduino IDE e Visuino per visualizzare la temperatura, l'umidità e la pressione utilizzando il sensore ENV (DHT12, BMP280, BMM150)
Monitoraggio della temperatura e dell'umidità utilizzando NODE MCU E BLYNK: 5 passaggi
Monitoraggio della temperatura e dell'umidità utilizzando NODE MCU E BLYNK: Ciao ragazzi, in questo tutorial impariamo come ottenere la temperatura e l'umidità dell'atmosfera utilizzando il sensore di temperatura e umidità DHT11 utilizzando l'app Node MCU e BLYNK
Avviso di temperatura e umidità utilizzando AWS ed ESP32: 11 passaggi
Avviso di temperatura e umidità utilizzando AWS ed ESP32: in questo tutorial, misureremo diversi dati di temperatura e umidità utilizzando il sensore di temperatura e umidità. Imparerai anche come inviare questi dati ad AWS
Automatizzare una serra con LoRa! (Parte 1) -- Sensori (temperatura, umidità, umidità del suolo): 5 passaggi
Automatizzare una serra con LoRa! (Parte 1) || Sensori (temperatura, umidità, umidità del suolo): in questo progetto ti mostrerò come ho automatizzato una serra. Ciò significa che ti mostrerò come ho costruito la serra e come ho collegato l'elettronica di alimentazione e automazione. Inoltre ti mostrerò come programmare una scheda Arduino che utilizza L
ESP8266 Nodemcu Monitoraggio della temperatura utilizzando DHT11 su un server Web locale - Ottieni la temperatura e l'umidità della stanza sul tuo browser: 6 passaggi
ESP8266 Nodemcu Monitoraggio della temperatura utilizzando DHT11 su un server Web locale | Ottieni la temperatura e l'umidità della stanza sul tuo browser: Ciao ragazzi, oggi faremo un'umidità e l'umidità; sistema di monitoraggio della temperatura utilizzando ESP 8266 NODEMCU & Sensore di temperatura DHT11. La temperatura e l'umidità saranno ottenute da DHT11 Sensor & può essere visto su un browser quale pagina web verrà gestita