Letture da sensore co2

Ciao a tutti, sto lavorando ad un progetto di lettura di dati da un sensore co2 collegato all'arduino. Il problema e' che quando faccio stampare a monitor i dati che legge, trovo valori molto alti (intorno ai 900 per capirsi) nelle rilevazioni dell'aria normale.

Mi potreste dare una mano a capire?

Ciao smau
che sensore CO2 hai, forniscici sia il circuito che il programma.
Non siamo ancora veggenti.
Ciao Uwe

si avete ragione anche voi :stuck_out_tongue: alla fine mi stavano cacciando dall'ufficio quindi ho dovuto postare in fretta... in ogni caso per il circuito ho seguito quello che hanno fatto qui:
http://translate.google.com/translate?prev=_t&hl=en&ie=UTF-8&u=http%3A%2F%2Flusorobotica.com%2Findex.php%2Ftopic%2C111.0.html&sl=pt&tl=en&history_state0=

mentre il sensore e' questo:
Gas Sensors (Carbon Dioxide CO2 Sensor)

e il codice e' questo qui:

// ARUINO CO2 TESTER v 1.0
// BY SAMUELE MATTIUZZO (samumatt.altervista.org)
// 2010


#define R 10 // led rosso
#define Yp 11 // led giallo +
#define G 12 // led ok
#define Ym 13 // led giallo -
#define __TOPS__ 870
#define __BOTTOM__ 840

unsigned int val = 0; // valore letto 
unsigned char PIN = 0; // pin dove e' collegato il sensore (analogico)
unsigned long time; // tempo dall'inizio della funzione
int z = 1;

void statusNow(int a, int b){ // funzione che accende il led rosso o verde
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
}

void regulation(int a, int b){ // funzione che lampeggia il led di regolazione (+ o -)
  digitalWrite(b, LOW);
  digitalWrite(a, HIGH);
  delay(150);
  digitalWrite(a,LOW);
  delay(150); 
}

void loading(int a, int b, int c, int d){ // funzione durante il caricamento
  digitalWrite(a, HIGH);
  delay(100);
  digitalWrite(a, LOW);
  digitalWrite(b,HIGH);
  delay(100);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  delay(100);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  delay(100);
  digitalWrite(d, LOW);
}

void setup() {
  // setup iniziale
  Serial.begin(9600);
  pinMode(R, OUTPUT);
  pinMode(Yp, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(Ym, OUTPUT);
  pinMode(PIN,INPUT);
}

void loop() {
  
  time = millis();
  
  if (time <= 60000) { // attesa di 5 minuti per il corretto riscaldamento del led
    loading(R,Yp,G,Ym);  
  }
  else{
    if (z == 1){ // esegue una volta sola, spegne tutti i led quando e' caldo
      z--;
      digitalWrite(R, LOW);
      digitalWrite(Yp, LOW);
      digitalWrite(G, LOW);
      digitalWrite(Ym, LOW);
    }
    
    val = analogRead(PIN); // lettura del valore
    // controllo della lettura fatta
    if (val >= __BOTTOM__ && val <= __TOPS__){
      statusNow(G,R);
      digitalWrite(Yp, HIGH);
      digitalWrite(Ym, HIGH);
    }
    else if (val > __TOPS__){
      statusNow(G,R);
      regulation(Yp,Ym);
    }
    else {
      statusNow(G,R);
      regulation(Ym,Yp);
    }
  
  Serial.println(val);
  delay(500);
  }
}

lasciando perdere i due valori per cui l'avevo tarato io per fargli lampeggiare i led, quello che mi torna strano e' che nel datasheet parlano di 390 ppm circa, mentre i valori che leggo io superano tranquillamente gli 800 - 900 e non capisco a cosa corrispondano (ppm? boh?)

altra cosa: questo sensore ci mette un po a "scaldarsi"? nel senso, all'inizio devo farlo girare a vuoto per un po prima di avere delle rilevazioni piu o meno precise?

ciao smau
non ho capito se hai seguito le istruzioni del primo link per il sensore del secondo link.
I sensori non sono uguali.
Quello del alcool vuole 5V di alimentazione, quello del CO2 vuole 6V di alimentazione.
Il sensore di alcool cambia la resistenza, mentre quello di co2 varia la tensione di uscita.
Devi adeguare il circuito al sensore.
Ciao Uwe

abbiamo un nuovo problema, abbiamo provato il sensore per il gpl (codice MQ-6) e quello funziona e si scalda, mentre il nostro sensore di CO2 ora non si scalda nemmeno piu e come valori ritorna numeri molto bassi (5,7,8,10, 20...), puo' essere che si sia bruciato? l'abbiamo provato ad aprire, dentro ci sono dei carboni fossili ed un sensore molto simile a quello del CO: avevo pensato di cambiare il sensore di CO2 con quello di CO e metterci sopra la capsula che contiene i carboni fossili, secondo voi puo' andare?

in ogni caso, come devo interpretare la lettura in uscita? la funzione analogRead() mi da in uscita dei valori tra 0 e 1023, come faccio a mapparli correttamente con quello che dovrebbe essere il valore di co2 nell'aria, per tarare lo strumento? grazie ancora

ciao smau
Il carbone attivo serve solo per fermare certe mollecole a cui il sensore é sensibile, ma non si vuole avere influenza. Non funzionerá.
IL sensore deve avere 30 ohm tra i 2 pin di riscaldamento. Se é aperto si é rotto la resistenza di riscaldamento.
Devi vedere lo Datasheet del sensore e lí é descritto sia che circito serve per pilotarlo e la grandezza di uscita.
Il arduino legge una tensione in rapporto alla tensione di riferimento la traduce in un numero da 0 a 1024.
Normalmente il riferimento é 5V.
Per i sensori devi usare un amplificatore per cndizionarli in modo che vadano bene per l'entrata di Arduino.
Ciao Uwe

dopo prove su prove siamo giunti alla conclusione che e' rotto il sensore, dato che quello per la CO si scalda e fa delle letture, mentre quello per la CO2 rimane freddo e legge valori casuali. grazie a tutti per l'aiuto

riapro questo topic un attimo:
ho sistemato il codice e il circuito e adesso fa quello che deve fare, il mio problema e' la conversione tra i risultati che mi da la lettura da pin analogico e quelli che effettivamente sono i ppm di co2 nell'aria

ho utilizzato la funzione map(,0,1023,0,5000) che mi ritorna dei valori tra i 50 e i 90, che credo siano i mV di output della scheda... ho corretto la funzione map in modo che il range <0,5000> diventi <350,10000> come indicato nel datasheet, ma non so se mi sto muovendo nella direzione giusta... qualche consiglio?

codice:

#define R 11 //led rosso
#define L 12 //led giallo centrale
#define G 13 //led verde
#define K 10 //led giallo inferiore
#define PIN 0 //pin analogico
#define SOGLIA 1000 // 200ppm soglia

unsigned int lettura = 0; //lettura attuale
unsigned int letturaOld = 0; //lettura del ciclo precedente
unsigned long time;

void reading(){ //funzione che indica la lettura
 digitalWrite(R, LOW);
 digitalWrite(K, LOW);
 digitalWrite(G, LOW);
 int cont = 0;
 while (cont < 15){
   digitalWrite(L, HIGH);
   delay(500);
   digitalWrite(L, LOW);
   delay(500);
   cont++;
 } 
}

void victory(){
 digitalWrite(R, LOW);
 digitalWrite(G, HIGH);
 int cont = 0;
 while (cont < 15){
   digitalWrite(L, HIGH);
   digitalWrite(K, LOW);
   delay(500);
   digitalWrite(L, LOW);
   digitalWrite(K, HIGH);
   delay(500);
   cont++;
 } 
}

void rightWay(){
 digitalWrite(R, LOW);
 digitalWrite(K, LOW);
 digitalWrite(G, HIGH);
 int cont = 0;
 while (cont < 15){
   digitalWrite(L, HIGH);
   delay(500);
   digitalWrite(L, LOW);
   delay(500);
   cont++;
 } 
}

void wrongWay(){
 digitalWrite(R, HIGH);
 digitalWrite(K, LOW);
 digitalWrite(G, LOW);
 int cont = 0;
 while (cont < 15){
   digitalWrite(L, HIGH);
   delay(500);
   digitalWrite(L, LOW);
   delay(500);
   cont++;
 } 
}

void setup(){
  pinMode(PIN, INPUT);
  pinMode(R, OUTPUT);
  pinMode(L, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(K, OUTPUT);
  Serial.begin(9600);
}

void loop(){
  time = millis();
  if ( time <= 300000) {
    digitalWrite(R, HIGH);
    digitalWrite(L, HIGH);
    digitalWrite(K, HIGH);
    digitalWrite(G, HIGH);
    letturaOld = analogRead(PIN); //do nothing (continua a leggere)
    letturaOld = map(letturaOld,0,1023,350,10000);
    Serial.print(time/1000);
    Serial.println(" secondi trascorsi. Riscaldamento in corso...");
    delay(10000);
  }
  else if ( time > 300000 && time < 305000 ) { // spegne tutti i led prima di iniziare le attivita
   digitalWrite(R, LOW);
   digitalWrite(L, LOW);
   digitalWrite(K, LOW);
   digitalWrite(G, LOW);
  }
  else{
    //blink led centrale L -> lettura
    reading();
    delay(1500);
    lettura = analogRead(PIN);
    lettura = map(lettura,0,1023,350,10000);
    Serial.print("Vecchia lettura: ");
    Serial.print(letturaOld);
    Serial.print(" | Nuova lettura: ");
    Serial.println(lettura);
    if ( lettura < SOGLIA ){
      victory();//soglia raggiunta
      delay(1500);
    }
    else{
      if (lettura < letturaOld)
        rightWay();
      else  
        wrongWay();
    }
    letturaOld = lettura;
    lettura = 0;
    delay(1500);
  }
}

ho trovato il sensore giusto
http://www.hwsensor.com/english/products/gas%20module/MH-Z11.html
sto vedendo di ordinarlo per provarlo.

Ciao Ricapito per caso in questo topic:
Ho visto le caratteristiche del sensore segnalato dall'amico Alvise ma porta:
Accuracy: ±50ppm

Praticamente ha un errore di circa 50ppm. Non è un po' troppo come range?

Sapete per caso qual'è il limite consentito dalla legge prima dello stato di allarme?

Grazie