08/02/2024 in News di sergio rame12 minuti
L’avvento dell’Internet of Things (IoT) ha rivoluzionato il modo in cui interagiamo con la nostra casa. La domotica, in particolare, ha portato all’introduzione di dispositivi intelligenti in grado di automatizzare diverse funzioni e di monitorare l’ambiente domestico.
In questo articolo, presenteremo un progetto per la realizzazione di una centralina multi-sensore basata sulla scheda ESP32. La centralina sarà in grado di:
Il progetto è rivolto a hobbisti ed appassionati di elettronica con un livello di conoscenza intermedio. La realizzazione della centralina richiede l’utilizzo di componenti elettronici di base, facilmente reperibili online o nei negozi di elettronica.
Cosa troverai in questo articolo:
Il sensore di gas MQ-2 è un dispositivo elettronico ampiamente utilizzato per rilevare la presenza di vari gas nel suo ambiente circostante. Questo sensore è particolarmente noto per la sua capacità di rilevare gas infiammabili come metano, propano, butano, idrogeno e altri gas combustibili, oltre a essere sensibile anche a gas nocivi come fumi di sigaretta, alcol, ammoniaca e vapori di benzene.
Il sensore MQ-2 si basa su una tecnologia di rilevamento nota come sensore di gas a resistenza variabile. Questo tipo di sensore utilizza un elemento sensibile che reagisce chimicamente alla presenza di gas specifici, causando una variazione nella sua resistenza elettrica. Quando il gas viene rilevato, la resistenza dell’elemento sensibile cambia e questa variazione viene misurata per determinare la concentrazione del gas nell’ambiente.
Dal punto di vista tecnico, il sensore MQ-2 è costituito da diversi componenti chiave, tra cui l’elemento sensibile, un circuito di controllo e un dispositivo di rilevamento delle variazioni di resistenza.
Il sensore è composto da un elemento riscaldante in ossido di stagno (SnO2) posizionato su un substrato di ceramica. Al riscaldamento, l’elemento sensibile presenta una conduttività elettrica che varia in base alla concentrazioni di gas combustibili presenti nell’aria circostante. In presenza di gas, le molecole di gas si adsorbono sulla superficie dell’ossido di stagno, provocando una diminuzione della conduttività.
La variazione di conduttività viene misurata da un circuito elettrico e convertita in un segnale analogico proporzionale alla concentrazione di gas presente
A parte il semplice progetto che ti presentiamo, il sensore MQ-2 viene utilizzato in svariate applicazioni con Arduino ed ESP32 tra cui:
Esistono in commercio oltre 40 sensori di gas alternativi a MQ-2, grossomodo riconducibili a tre sole categorie:
1. Sensori elettrochimici: sono più selettivi rispetto al sensore MQ-2 e sono in grado di distinguere tra diversi tipi di gas.
2. Sensori a infrarossi: questi sensori sono in grado di rilevare la presenza di gas senza entrare in contatto con essi.
3. Sensori a stato solido: sono più stabili e affidabili rispetto al sensore MQ-2.
Abbiamo testato molti dei sensori alternativi e in alcuni casi abbiamo rilevato tempi di risposta più rapidi o maggiore omogeneità di risultati. Abbiamo comunque preferito l’MQ-2 per il rapporto qualità prezzo imbattibile e la robustezza del case metallico, ideale per la costruzione di un prototipo.
Il sensore di gas MQ-135 è un sensore a semiconduttore di tipo chemio-resistivo, progettato per rilevare la presenza di gas combustibili come GPL, propano, metano, idrogeno e fumi in aria.
Il sensore dell’MQ-135 è composto da un elemento riscaldante in ossido di stagno (SnO2) posizionato su un substrato di ceramica.
Dopo il pre-riscaldamento, l’elemento sensibile presenta una conduttività elettrica che varia in base alla concentrazione di gas combustibili presenti nell’aria.
In presenza di gas, le molecole di gas si adsorbono sulla superficie dell’ossido di stagno, provocando una diminuzione della conduttività. La variazione di conduttività viene misurata da un circuito elettrico e convertita in un segnale analogico proporzionale alla concentrazione di gas presente.
Possiede inoltre una ampia gamma di rilevamento: Il sensore è in grado di rilevare concentrazioni di gas da 200 ppm a 10000 ppm.
A parte la somiglianza con l’MQ-2 e quindi la estrema robustezza del case metallico lo abbiamo selezionato per due motivi ben precisi:
Il sensore DHT11 è un sensore digitale che può svolgere il doppio ruolo di rilevazione della temperatura e della umidità: vediamo brevemente come funziona in entrambi i casi.
Il DHT11 utilizza un termistore per rilevare la temperatura ambiente. Un termistore è un dispositivo resistivo la cui resistenza varia in base alla temperatura. Nel caso del DHT11, il termistore è costituito da un materiale il cui valore di resistenza diminuisce al crescere della temperatura.
Il DHT11 misura l’umidità relativa e per fare questo utilizza un condensatore a film polimerico con un dielettrico. Il dielettrico (isolante) al cambiamento dell’umidità modifica la capacità del condensatore. Le variazioni vengono quindi convertite in un segnale elettrico.
Il sensore contiene un circuito integrato che si occupa di leggere la resistenza e la capacità in segnali digitali. Il circuito riesce a convertire i valori di temperatura e umidità in un segnale digitale standard. I dati così ottenuti vengono inviati all’ESP32 che con questo sistema non deve effettuare nessuna conversione.
I segnali digitali assumono solo due valori discreti, solitamente rappresentati come “0” e “1”. In termini elettrici, questi valori possono corrispondere a due tensioni differenti, come 0V e 5V, oppure a due stati logici, come “vero” e “falso”.
Caratteristiche:
Ampiezza: I segnali digitali hanno un’ampiezza ben definita e non possono assumere valori intermedi tra i due livelli discreti.
Frequenza: La frequenza di un segnale digitale rappresenta il numero di volte al secondo in cui il segnale cambia stato.
Forma d’onda: La forma d’onda di un segnale digitale può essere quadrata, sinusoidale o di altra forma, a seconda dell’applicazione.
Esempi di segnali digitali: 1. Bit in un computer 2. Segnali di clock 3.Dati binari 4.
Segnali Analogici: I segnali analogici assumono un’ampiezza continua all’interno di un intervallo specificato. In altre parole, possono assumere qualsiasi valore all’interno di tale intervallo.
Caratteristiche:
Ampiezza: L’ampiezza di un segnale analogico varia in modo continuo in base al valore che rappresenta. Frequenza: La frequenza di un segnale analogico può essere costante o variabile, a seconda del tipo di segnale. Forma d’onda: La forma d’onda di un segnale analogico può essere sinusoidale, quadrata, triangolare o di altra forma, a seconda dell’applicazione.
Questa mini-stazione di controllo dotata di sensori DHT11, MQ-2 e MQ-135 può essere utilizzata per monitorare la temperatura e l’umidità dell’aria in ambienti interni ed esterni, e risulta ideale per applicazioni in questi settori:
Il progetto non usa resistenze o altri componenti passivi e non ha bisogno di saldature: i connettori Dupont e una breadboard sono sufficienti per completare il montaggio. Ti ricordo che dovresti sempre usare dei colori consistenti nella scelta dei fili di collegamento ed usare, ad esempio solo Dupont neri o blu scuro per il negativo, solo rossi per il positivo e gialli/verdi per il segnale elettrico.
Lo schema di colori che ti ho suggerito è solo indicativo e puoi modificarlo secondo le tue preferenze ma ti consiglio di adottarne solo uno e di mantenere le tue scelte nel tempo. Oltre ai connettori ti servirà una breadboard.
La massa (GND) dell’ESP32 deve essere collegata al negativo comune della breadboard e il pin 5V sempre dell’ESP32 deve essere collegato alla linea rossa della breadboard.
Le connessioni (+) e (-) dei sensori finiscono sulle righe rosse e blu della breadboard. L’assemblaggio non presenta grosse difficoltà: basta seguire scrupolosamente il disegno. Le linee dati dei sensori sono rappresentate in giallo. Il pin centrale del DHT11 viene collegato al pin 13 dell’ESP32 mentre i due sensori MQ sono collegati ai pin 33 e 35.
Vediamo adesso come installare il programma sull’ESP32: procederemo inizialmente ad usare PlatformIO e poi vederemo come compilare con Arduino IDE. Andiamo sul terminale di Linux o sulla Windows PowerShell e facciamo copia e incolla del riquadro sotto.
git clone git@github.com:sebadima/corso-esp32-centralina-multisensore.git
cd corso-esp32-centralina-multisensore
make upload
platformio device monitor --baud 115200 --rts 0 --dtr 0
Dopo avere premuto il tasto invio avremo questa sequenza dal terminale:
Cloning into 'corso-esp32-centralina-multisensore'...
remote: Enumerating objects: 36, done.
remote: Counting objects: 100% (36/36), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 36 (delta 11), reused 34 (delta 9), pack-reused 0
Receiving objects: 100% (36/36), 6.22 KiB | 1.24 MiB/s, done.
Resolving deltas: 100% (11/11), done.
pio -f -c vim run --target upload
Processing esp32dev (platform: espressif32; board: esp32dev; framework: arduino)
Platformio provvederà a compilare il programma, a scaricare le librerie e a linkarle al codice oggetto. Il codice oggetto compilato verrà quindi caricato sulla scheda. In caso di problemi con l’upload devi editare il file platformio.ini e modificare la porta utilizzata dall’ESP32.
Se usi Linux puoi trovare la porta utilizzata dalla scheda scrivendo:
ls /dev/ttyUS*
mentre su Windows puoi usare il comando:
Get-CimInstance -Class Win32_SerialPort | Select-Object Name, Description, DeviceID
#include <Arduino.h>
#include "DHT.h"
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
#define DHTPIN 13
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
float t, h, g_1, g_2;
int lost_packages;
int Gas_1 = 33;
int Gas_2 = 35;
void setup() {
Serial.begin(115200);
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
dht.begin();
pinMode(Gas_1, INPUT);
pinMode(Gas_2, INPUT);
}
void loop() {
h = dht.readHumidity();
t = dht.readTemperature();
g_1 = analogRead(Gas_1);
g_2 = analogRead(Gas_2);
if (isnan(g_1) )
{
Serial.println(F("Non riesco a leggere dal sensore di GAS 1!"));
return;
}
if (isnan(g_2) )
{
Serial.println(F("Non riesco a leggere dal sensore di GAS 2!"));
return;
}
if (isnan(t) )
{
Serial.println(F("Non riesco a leggere dal sensore DHT!"));
return;
}
Serial.print("Temperatura: ");
Serial.println(t);
Serial.print("Umidità: ");
Serial.println(h);
Serial.print("Gas_1: ");
Serial.println(g_1);
Serial.print("Gas_2: ");
Serial.println(g_2);
Serial.println("");
delay(2000);
}
Segui questi passaggi:
Adesso Il programma verrà caricato sulla scheda Arduino. Per leggere i valori dei sensori ti basta andare su “Strumenti” > “Monitor Seriale”.
DHT dht(DHTPIN, DHTTYPE);
serve ad inizializzare nella RAM l’oggetto che rappresenta il driver per il DHT11. La istruzione mappa nella area “codice” di ESP32 funzioni e variabili interne tipiche della programmazione ad oggetti. A questi valori si può accedere solo usando i metodi di interfaccia tipici dei linguaggi “Object Oriented”. Più in basso vedremo come il programma riesca ad usare l’oggetto “DHT dht()” per leggere istantaneamente la temperatura.
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
viene usata per disabilitare il controllo del BROWNOUT dell’ESP32. Si tratta di un controllo elettrico voluto dai progettisti per segnalare anomalie nella tensione di alimentazione. Poichè stiamo usando l’ESP32 collegato al cavetto USB preferiamo disabilitarlo per evitare improbabili e inutili segnalazioni di errore. Nel caso di alimentazione a batteria probabilmente può avere un senso riabilitarlo.
dht.begin();
pinMode(Gas_1, INPUT);
pinMode(Gas_2, INPUT);
servono la prima a lanciare la funzione di start up dell’oggetto “dht”, mentre le due successive servono a segnalare all’ ESP32 che deve usare i due pin 33 e 35 come input.
h = dht.readHumidity();
t = dht.readTemperature();
servono a leggere umidità e temperatura usando le funzioni di interfaccia dell’oggetto “dht” ovvero le funzioni sicure pensate dai progettisti per nascondere la complessità del codice interno. Le funzioni sono introdotte dal “.” come stabilito dalla sintassi del C++.
g_1 = analogRead(Gas_1);
g_2 = analogRead(Gas_2);
servono a leggere la tensione fornita dai pin 33 e 35 usando una funzione predefinita di Arduino: analogRead(). La interpretazione del valore viene lasciata al software e all’utente, a differenza di quanto riesce a fare il DHT11.
if (isnan(g_1) ) ...
if (isnan(g_2) ) ...
if (isnan(t) ) ...
sono usate per tracciare gli errori dei tre sensori, come ad esempio valori fuori scala o infiniti (NaN).
Se il progetto sembra non funzionare correttamente le cause degli errori potrebbero essere in ordine di probabilità:
1. Identificare il problema:
Il primo passo è identificare il problema che si sta verificando con il progetto. Quali sono i sintomi del problema? Quando si verifica il problema? C’è un componente specifico che sembra essere la causa del problema?
2. Controllare i collegamenti:
Una volta identificato il problema, è necessario controllare i collegamenti. Assicurati che tutti i collegamenti siano ben saldi e che non ci siano fili allentati o danneggiati. Controlla che i componenti siano collegati correttamente all’ESP32.
3. Testare i componenti:
È possibile utilizzare un multimetro per testare la tensione, la corrente e la resistenza dei componenti. È possibile anche utilizzare un oscilloscopio per testare i segnali elettrici dei componenti.
L’oscilloscopio può essere utilizzato per testare circuiti elettronici digitali con ESP32 in diversi modi:
Misurare la tensione:
L’oscilloscopio può essere utilizzato per misurare la tensione ai pin dell’ESP32 per verificare se i livelli logici sono corretti.
È importante utilizzare una sonda con una impedenza di ingresso elevata per evitare di caricare il circuito e influenzare le misure.
Misurare la frequenza:
L’oscilloscopio può essere utilizzato per misurare la frequenza di un segnale digitale, come ad esempio il clock del microcontrollore.La funzione di frequenza automatica (autorange) dell’oscilloscopio può facilitare questa misurazione.
Visualizzare la forma d’onda:
L’oscilloscopio può essere utilizzato per visualizzare la forma d’onda di un segnale digitale. Questo può essere utile per identificare problemi come i ritardi di propagazione, i tempi di salita e discesa e le distorsioni del segnale.
“Triggerare” su un evento specifico:
L’oscilloscopio può essere configurato per triggerare l’acquisizione di una traccia su un evento specifico, come ad esempio un fronte di salita o discesa di un segnale. Questo può essere utile per catturare dettagli specifici del segnale che si desidera analizzare.
Usare le funzioni di analisi avanzate:
Gli oscilloscopi moderni offrono diverse funzioni di analisi avanzate, come ad esempio la misura del duty cycle, la demodulazione AM/FM e l’analisi FFT. Queste funzioni possono essere utilizzate per ottenere informazioni più precise sul comportamento del circuito in esame.
Consigli per usare un oscilloscopio con ESP32:
Utilizzare una sonda con un’impedenza di ingresso elevata per evitare di caricare il circuito. Impostare la scala di tensione e di tempo in modo da visualizzare correttamente il segnale e infine usare la funzione di trigger per catturare il segnale desiderato.
4. Sostituire i componenti danneggiati:
Se un componente è danneggiato, è necessario sostituirlo. Assicurati di utilizzare un componente con le stesse caratteristiche del componente originale. Puoi usare i nostri link su Amazon o se preferisci puoi acquistare i componenti da siti alternativi come Aliexpress.
Questo progetto di media complessità permette di controllare in modo estremamente preciso la qualità dell’aria e la presenza di gas nocivi e combustibili. Potresti assemblare la centralina in un contenitore chiuso per montaggi elettronici e magari aggiungere un display LCD per ottenere un prodotto funzionale. In seguito presenteremo una evoluzione di questo progetto dotandolo di un server web che può condividere i dati in tempo reale su un qualunque smartphone o PC collegato al Wi-Fi.
Robotdazero.it - post - R.153.1.6.3