MICHELEPISANI.IT
 

Sensore MQ-4, Buzzer, LED, LCD 1602 I2C

Rilevatore di Gas Con Allarme Sonoro e Visivo, con Arduino UNO

arduino - rilevatore di gas con allarme
Febbraio 19
07:152017

Ho recentemente acquistato un sensore per il rilevamento della concentrazione nell'aria di gas naturale (principalmente composto da Metano) e non ho potuto fare a meno di constatarne l'elevata sensibilità tradotta appunto in un tempo di risposta alla sollecitazione molto rapido.

Ho creato pertanto un piccolo progetto con Arduino UNO al fine di ottenere un sistema di allarme che segnali acusticamente e visivamente la presenza di Gas nell'aria.
In breve ho utilizzato un display LCD 1602 I2C per mostrare il valore del livello di GAS rilevato nell'aria dal sensore MQ-4. Sopra una certa soglia di rilevamento un buzzer, in funzione di allarme uditivo, emette un segnale acustico e contestualmente un led, in funzione di allarme visivo, si accende. Sotto la soglia stabilita i sensori di allarme tornano allo stato di inattività.

Di seguito lo schema elettrico del progetto

arduino - rilevatore di gas metano con allarme
Fig. 1 - Schema per Arduino - Rilevatore di Gas Metano con Allarme

Ed ecco la parte più interessante del progetto, lo sketch, ottimizzato con l'utilizzo della funzione millis() anziché il classico delay() per garantire un più efficace ed immediato recupero delle informazioni rilevate:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

const int buzzerPin = 12;
const int ledPin = 11;
const int sensorPin = A0;
const int intervallo_base = 200;

int sensorValue = 0;
int sensorAlertMinValue = 400;
int ledValue = 0;
bool buzzerTone = 0;

unsigned long currentMillis = 0;
unsigned long previousMillis = 0;

void setup(void) {
  lcd.begin(16, 2);
  pinMode(buzzerPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
}

void loop(void) { 
  currentMillis = millis();
  sensorValue = analogRead(sensorPin);

  lcd.setCursor(0, 0);
  lcd.print("Rilevamento GAS:");
  lcd.setCursor(0, 1);
  lcd.print(sensorValue);

  if (sensorValue > sensorAlertMinValue) {
    ledValue = HIGH;
    if ((currentMillis - previousMillis) >= (intervallo_base) && buzzerTone == 0) {
      noTone(buzzerPin);
      tone(buzzerPin, 500, 1000);
      buzzerTone = 1;
      updateMillis();
    }
    if ((currentMillis - previousMillis) >= (intervallo_base) && buzzerTone == 1) {
      noTone(buzzerPin);
      tone(buzzerPin, 300, 1000);
      buzzerTone = 0;
      updateMillis();
    }
  } else {
    ledValue = LOW;
  }

  digitalWrite(ledPin, ledValue);
  delay(100);

}

void updateMillis() {
  previousMillis = currentMillis;
}

Di seguito una breve dimostrazione del funzionamento del progetto dove è evidente la sensibilità del sensore principale utilizzato:

Il progetto è senz'altro migliorabile ed ampliabile utilizzando componenti di allerta più adeguati come ad esempio una sirena al posto del buzzer e del led.

Per consigli, suggerimenti o chiarimenti sentitevi liberi di lasciare un commento!

Tags
Condividi

Autore

Michele Pisani

Michele Pisani

Ho uno spiccato orientamento al problem-solving, se è troppo facile non mi diverto :)
Credo nella volontà e nel cambiamento perchè hanno fatto della mia passione il mio pane quotidiano.
Se devo descrivermi con una sola parola direi... "Concretezza", la mia stretta di mano è una garanzia.

10 Commenti

  1. Gian lunedì 20 marzo 2017 alle ore 12.08

    Complimenti bell'articolo

    Rispondi a questo commento
  2. angelo sabato 13 maggio 2017 alle ore 20.13

    Ciao innanzitutto complimenti bellissima ed utilissima idea. ti disturbo piochè ho provato a realizzare partendo da tuo progetto ma a lavoro ultimato ho riscontrato problemi con il display nello sketch visualizzo\:LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); se cancello la stringa il programma me lo carica funziona tutto ma non leggo nulla sul display. Vuoi essere cosi gentile da indicarmi la soluzione. grazie e buona serata.

    Rispondi a questo commento
    • Michele PisaniAutore domenica 14 maggio 2017 alle ore 00.16

      Ciao Angelo,
      sei in possesso del convertitore I2C (ovvero quel componente nero che vedi nel video sopra il display LCD)? In caso negativo, ossia se hai collegato i singoli pin come da procedura standard senza l'ausilio del componente I2C, allora quella stringa che hai evidenziato non è adeguata.
      Se hai collegato correttamente i pin dell'LCD ad Arduino, al potenziometro, ecc... prova a sostituire il contenuto di quella riga con la seguente stringa ed il display LCD dovrebbe funzionare correttamente:

      LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

      Rispondi a questo commento
  3. Angelo domenica 14 maggio 2017 alle ore 15.45

    Ciao Michele ti ringrazio nuovamente per la tua disponibilità.Ho collegato il display al convertitore I2C ed il rimanente come fai vedere nel tuo video il sensore mq5 funziona il bazzer ed il led si accendono mentre il display è alimentato ma non visualizzo nessuna scritta.

    Rispondi a questo commento
    • Michele PisaniAutore domenica 14 maggio 2017 alle ore 15.50

      Ciao Angelo,
      ma quella stringa l'hai lasciata? Hai provato inoltre a regolare il potenziometro che sta sulla I2C? Può essere che le scritte ci siano ma non le vedi per una questione di luminosità.

      Rispondi a questo commento
      • Angelo lunedì 15 maggio 2017 alle ore 08.40

        Buongiorno Michele la stringa l'ho lasciata l'errore me lo da durante la compilazione dello sketch .Comunque per venirne a capo ho messo sul display una scritta statica "rilevato gas pericolo!!!" Ed il tutto funziona.Ti ringrazio nuovamente per la tua disponibilità e ti rinnovo i complimenti per questo tuo interessantissimo sito,alla prossima Michele buon lavoro.

      • Michele PisaniAutore lunedì 15 maggio 2017 alle ore 21.36

        Di niente Angelo, l'importante è che sei riuscito a risolvere.

  4. Paolo martedì 13 giugno 2017 alle ore 18.49

    salve,mi interessa il progetto sensore gas ,per applicazioni in agricoltura.Vedremo gli sviluppi.ottimo programma.

    Rispondi a questo commento

Scrivi un Commento

Il tuo indirizzo email non sarà pubblicato.
I campi contrassegnati da un * sono obbligatori

Articoli e Argomenti correlati

Categorie popolari

Iscriviti alla mia newsletter

La tua e-mail con me sarà al sicuro.
Non fornirò mai le tue informazioni a nessuno!

Ultimi commenti

Michele Pisani

Ciao stefy,
la tua domanda non è proprio pertinente a questo articolo... ti consiglio di dare …

stefy

salve. ho un problema sulla pagina facebook..non riesco a unirla..mi dice che è in sospeso …

Michele

Ciao Antonio,
ma il tuo apk si chiama 'HelloWorld-release-unsigned.apk'?

Antonio

Grazie michele per la velocità con cui hai risposto, comunque ho seguito la tua guida passo per …