Salve a tutti,sto facendo un rilevatore di Gas con Arduino,usando il sensore MQ-5, mi potete dare una mano sulla programmazione? Vi posto il programma che ho fatto,inoltre tramite il modulo bluetooth si può disattivare l'allarme.
int gas=0;
int PreRiscaldo = 0;
void setup()
{
Serial.begin(9600);
pinMode (2, OUTPUT); // Bluetooth
pinMode(7, OUTPUT); //Riscaldamento
pinMode(8, OUTPUT); //Allarme
pinMode(9, OUTPUT); //Buzzer
digitalWrite(7, HIGH);
//attendo 5 minuti per stabilizzare la sonda
for( PreRiscaldo = 0; PreRiscaldo < 300; PreRiscaldo++)
{
delay(1000);
}
digitalWrite(7, LOW);
}
void loop()
{
//Leggo il valore di tensione generato dalla sonda
gas = analogRead(0);
//invio i dati al serial Monitor
Serial.println(gas, DEC);
//gestisco le soglie e agisco di conseguenza
if ( gas > 150)
{
//cicalino ON
analogWrite(9, HIGH);
//allarme via led ON
digitalWrite(8, HIGH);
//attivo ventola
digitalWrite(2, HIGH);
{
//Bluetooth
char c = Serial.read();
if (c == 'L')
{
digitalWrite (2, LOW);
digitalWrite (8, LOW);
digitalWrite (9, LOW);
}
}
else
{
//cicalino OFF
analogWrite(9, LOW);
//allarme via led OFF
digitalWrite(8, LOW);
//attivo relè
digitalWrite(2, LOW);
}
//acquisisco i dati ogni 1/2 secondo
delay(500);
}
Aspetto una vostra risposta.
Grazie anticipatamente
//attendo 5 minuti per stabilizzare la sonda
for( PreRiscaldo = 0; PreRiscaldo < 300; PreRiscaldo++)
{ delay(1000);
}
Sostituiscilo con un più semplice: delay(3000000UL);
Dentro l'IDE usa CTRL+T per indentari, scritto così non si capisce dove inizia un blocca e finisce un'altro
Così vedi che le graffe sono aperte/chiuse male
Invece di reimpire il codice di commenti per ricordare i numeri di pin, crea delle costanti o #define:
La storia del Bluetooth, mica l'ho capita. Hai un pin 2 che chiami bluetooth e poi quando leggi i dati da seriale usi Serial che è la seriale fisica, pin 0 e 1 o usb :o
Inoltre fai pure:
digitalWrite(2, HIGH); //attivo ventola
Così è indentato e si legge meglio, ma i problemi segnalati sopra li ho lasciati
const byte PINBT =2; // Bluetooth
const byte PINRIS =7; // Riscaldamento
const byte PINALL =8; // Allarme
const byte PINBUZ =9; // Buzzer
int gas=0;
void setup()
{ Serial.begin(9600);
pinMode(PINBT, OUTPUT);
pinMode(PINRIS, OUTPUT);
pinMode(PINALL, OUTPUT);
pinMode(PINBUZ, OUTPUT);
digitalWrite(PINRIS, HIGH);
delay(300000UL); //attendo 5 minuti per stabilizzare la sonda
digitalWrite(PINRIS, LOW);
}
void loop()
{ gas = analogRead(0); //Leggo il valore di tensione generato dalla sonda
Serial.println(gas, DEC); //invio i dati al serial Monitor
if ( gas > 150) //gestisco le soglie e agisco di conseguenza
{ analogWrite (PINBUZ, HIGH); //cicalino ON
digitalWrite(PINALL, HIGH); //allarme via led ON
digitalWrite(PINBT, HIGH); //attivo ventola
//Bluetooth
char c = Serial.read();
if (c == 'L')
{ digitalWrite(PINBT, LOW);
digitalWrite(PINALL, LOW);
digitalWrite(PINBUZ, LOW);
}
}
else
{ analogWrite (PINBUZ, LOW); //cicalino OFF
digitalWrite(PINALL, LOW); //allarme via led OFF
digitalWrite(PINBT, LOW); //attivo relè
}
delay(500); //acquisisco i dati ogni 1/2 secondo
}
Ragazzi grazie di tutte le risposte, avete perfettamente ragione ora che mi fate notare, sono un tantino inesperto è 1 mese e mezzo che uso arduino, ora comunque modifico meglio il tutto e pubblico il nuovo sorgente
Attesa di 5 minuti per riscaldare il sensore?
Sono pochi. Lo hai letto il datasheet:
Preheat time: over 24 hour
Devi riscaldarlo per almeno 24 ore se vuoi dati attendibili.
Inoltre quella classe di sensori non è molto precisa.
E poi la lettura dipende anche dall'ambiente in cui operano, per cui mettere un controllo così:
if ( gas > 15)
Non ha senso. Se operi in uno scantinato potresti avere un'attivazione fissa perché la concentrazione è sempre sopra alla tua soglia.
Ti consiglio dopo la fase di riscaldamento di fare una lettura di taratura, in modo da leggere il valore medio dell'ambiente e poi fissare la soglia di allarme come
Certo che lo puoi fare, per scopi didattici poco te ne importa se il sensore dà letture inaffidabili o meno. Se fosse per un uso reale dovresti invece applicare l'effettivo tempo che serve al suo riscaldamento.