Rilevatore di Gas con Arduino

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 :slight_smile:

Questo why ?

  //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:

const byte PINBT=2;
const byte PINRIS=7;
const byte PINALL=8;
const byte PINBUZ=9;

E poi in giro usa queste "parole" invece dei numeri

Variabili per i for puoi dichiarale nel for stesso:

for( int PreRiscaldo = 0; PreRiscaldo < 300; PreRiscaldo++)

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

ma 2 è la ventola o il BT ?

Perchè a volte fai analogWrite(XXX, HIGH) e a volte digitalWrite(XXX, HIGH) ??

analogWrite(9, HIGH);  //cicalino ON
digitalWrite(8, HIGH);

La analogWrite ha senso solo sui pin PWM con valori 0-255

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 :slight_smile:

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

if(lettura+tolleranza) ecc..

Il progetto che sto facendo è solamente didattico, lo devo portare all'esame di stato..

Non lo avevi specificato nel 1° post :stuck_out_tongue:

Quindi non è possibile realizzarlo giusto.......? :cry:
Ci voglio 24 ore di preriscaldamento... help :cry:

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.