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);
}
}