Da notarsi che una volta alimentato il circuito non abbiamo da subito il valore base ma ci vogliono diversi minuti prima che questo si stabilizzi. Appoggiando invece il sensore a circa 5 centimetri dal fornello della cucina, una volta aperto il gas in pochissimo tempo la lettura passa a 900 e oltre mentre una volta richiusa la perdita ci vuole del tempo prima che il valore si ristabilisca, in parte perchè il gas stesso si deve disperdere. Faccio notare che il sensore è sensibile all’umidità temperatura e concentrazione di ossigeno nell’aria, motivo per cui per ottenere delle misure più accurate occorre tener conto quantomeno di temperatura ed umidità: l’ossigeno minimo è del 2% ma a quelle condizioni non ha più importanza se ci sia o meno del gas in aria, sareste comunque belli che stecchiti.
Di per se il prototipo è già funzionante ma non possiamo certo accontentarci di inviare la lettura sulla porta seriale. L’ideale sarebbe collegare un relè ad un’elettrovalvola che in caso di superamento di una certa soglia blocca la conduttura del gas e/ o attiva un sistema di ventilazione forzata. Fate molta attenzione che questi dispositivi possono produrre scintille durante il loro funzionamento e in ambienti saturi di gas possono provocare esplosioni, pertanto non devono essere installati in ambienti a rischio di saturazione ma devono stare in luoghi perennemente arieggiati.
In questo articolo mi limiterò all’uso di un buzzer per segnalare la presenza di gas, in particolare pensavo di fare in modo che emetta un suono ogni tot tempo e che questo suono si intensifichi come frequenza all’aumentare della concentrazione di gas. Potremmo fare in modo che in assenza di rilevazioni emetta un piccolo bip dopo tot minuti, in modo da non essere fastidioso ma che sia comunque percettibile. Questo periodo deve essere invece accorciato tanto più quanto è il gas rilevato aumenta, sino ad avere un suono quasi continuo. Il buzzer ha un funzionamento quasi banale, nel modulo a mia disposizione ci sono un pin di alimentazione 5V, la massa ed un pin per inviare il segnale acceso / spento. Utilizzando una sapiente alternanza di segnali on / off è possibile generare suoni di diversa frequenza, infatti si vengono a formare delle onde quadre più o meno ravvicinate con conseguente variazione della frequenza. Il modulo a mia disposizione è come questo ma fate estrema attenzione perchè in questi kit “37 in 1” la documentazione è assai scarsa, vi sono kit simili con moduli differenti, alcuni dei quali sembrano identici ma presentano piccole differenze. E’ proprio il caso del buzzer a mia disposizione. In quasi tutti i kit guardandolo dall’alto con i pin verso il basso, trovate al centro l’alimentazione a 5V, a sinistra la massa e a destra il segnale. Nel mio questi ultimi due sono invertiti, me ne sono accorto dalla serigrafia sul modulo stesso che non corrispondeva a quella della documentazione in mio possesso e fornita con i moduli. Fatta questa doverosa avvertenza, non dobbiamo far altro che collegare la massa, i 5v ed un pin digitale di Arduino, io ho usato l’11, ma qualunque altro può andar bene. L’uso del buzzer è banale, se tenete alta l’uscita a cui l’avete collegato avrete un suono, altrimenti il silenzio. La velocità con cui cambiate fra i due stati determina la formazione di onde quadre di diverse ampiezze con conseguente variazione della frequenza e tipo di suono (più acuto o più basso). Nella foto a lato vi mostro il cablaggio di entrambi i componenti. Si vede sia il buzzer con i cavi blu (gnd), rosso (5V) e verde (segnale) che il sensore di gas con i cavi rossi sui pin H, gialli sui pin A e verdi sui B (ricordandoci che A e B sono intercambiabili). Ora non dobbiamo far altro che scrivere uno sketch semplice, semplice che ci ripotrta a terminale il valore misurato ed emette un suono tanto più ravvicinato quanto più è alta la concentrazione di gas. Il software è davvero molto semplice. Non fà altro che leggere il valore analogico del sensore ed in base ad alcune soglie preimpostate emette un suono tramite il buzzer a determinati intervalli di tempo che si accorciano con l’aumentare del valore letto. E’ stato interessante notare come durante la scrittura di questo articolo si è acceso il termosifone in vicinanza al sensore che ha cominciato a leggere valori più elevati, a sufficienza da far cambiare la soglia ed emettere segnali acustici più ravvicinati. Inizialmente avevo provato ad usare una formula matematica un po’ empirica per correlare i valori letti con la vicinanza dei segnali sonori, ma non sono riuscito a trovare un giusto equilibrio fra la sensibilità quando la soglia è pericolosamente alta e la necessità di mantenere i segnali distanziati quando la concentrazione di gas è bassa. Ho usato perciò delle soglie fisse all’interno del listato. Sono valori basati sulla semplice osservazione empirica in vicinanza al fornello della cucina, ma non vi è una reale correlazione con le soglie di pericolosità per cui NON mettete le vostra vita in mano a questo sketch. Per qualcosa di più preciso occorre misurare anche temperatura ed umidità oltre che tarare il sensore con concentrazioni note di gas, ma quest’ultimo punto mi è difficile da riprodurre.
#define AnalogGasPin 0 #define BuzzerPin 11 int sensorValue; int soglia; unsigned long basetime; int time; void setup() { Serial.begin(9600); // sets the serial port to 9600 pinMode(BuzzerPin,OUTPUT); // used for buzzer signal BuzzerSound(100,2,1); // welcome message :-) basetime=millis(); } void loop() { delay(500); sensorValue = analogRead(AnalogGasPin); // read analog input pin 0 time=(millis()-basetime)/1000; // seconds elapsed if(sensorValue<200) soglia=5000; else if(sensorValue<240) soglia=500; else if(sensorValue<270) soglia=240; else if(sensorValue<300) soglia=60; else if(sensorValue<320) soglia=30; else if(sensorValue<350) soglia=12; else if(sensorValue<400) soglia=8; else if(sensorValue<450) soglia=5; else if(sensorValue<500) soglia=3; else if(sensorValue<600) soglia=2; else if(sensorValue<700) soglia=1; else soglia=0; Serial.print("Sensore: "); Serial.print((int)sensorValue, DEC); Serial.print(" - Secondi: "); Serial.print(time, DEC); Serial.print(" - Soglia: "); Serial.println((int)soglia, DEC); if(time>soglia) { BuzzerSound(80,1,2); basetime=millis(); Serial.println("SOUND"); } } void BuzzerSound(int cicli, int delay1,int delay2) { for(int i=0;i<cicli;i++)//output sound of one frequency { digitalWrite(BuzzerPin,HIGH);//make a sound delay(delay1);//delay 1ms digitalWrite(BuzzerPin,LOW);//silient delay(delay2);//delay 1ms } }
Ci sono altre piccole accortezze a cui stare attenti. Ad esempio il consumo del sensore MQ4 non è propriamente irrisorio. Il datasheet indica 750mW anche se a dirla tutta ho trovato datasheet diversi, dello stesso (apparentemente) componente e della stessa ditta, che indica <900mW. Comunque sia 750mW a 5V corrispondono a 150mA, ben sopportabili dall’uscita 5V di Arduino ma nel caso di progetti più complessi potrebbe essere necessario fare due conti sugli assorbimenti di corrente. Un’altra cosa che volevo segnalare prima di concludere questo articolo, è che come dicevo il sensore ci mette un paio di minuti per stabilizzarsi, nella realtà la fase di stabilizzazione completa richiede 24 ore per cui se intendete creare un progetto più preciso dovrete effettuare le misurazioni dopo questo lasso di tempo.