Progetto Multifunzionale per acquario

Salve a tutti,
sto cercando di creare un progetto per il mio acquario. Le cose che vorrei realizzare sono le seguenti:

  • Controllo temperatura vasca
  • Accensione riscaldatore se la temperatura è inferiore ai 24 gradi
  • Spegnimento riscaldatore quando arriva a 26°
  • Accensione ventole se la temperatura è uguale o superiore a 29°
  • Gestione accensione lampade led
  • Effetto alba/tramonto/nuvoloso

Sono ai primi step e già sono ai primi problemi.
Con un sensore lm35 leggo 10 temperature in 10 secondi ed effettuo una media. Entro in un if per verificare le condizioni dei 24 gradi e qui sorge il problema. Praticamente quando entra nell'if accende il riscaldatore ed effettua in un for il controllo delle temperature. Arrivato a 26° il riscaldatore si spegne, ma sulla seriale non compare più la temperatura ma strani caratteri. A livello funzionale funziona, cioè a 24 si attiva il riscaldatore e continua fino a 26°, solo che dai 26 in poi tutte le letture risultano sballate.Ho notato inoltre che quando entra nel for la temperatura risulta flasata di 1° Potreste aiutarmi? Grazie
Questo è un output della seriale:

23.49 C
24.27 C
”þ–óœþ¡Ã
48.68 C
25.78 C
24.61 C
24.07 C
23.88 C
24.80 C
•þ–æ�þ¡Ã„͘ù29 C
27.00 C
25.54 C
24.80 C
24.22 C
24.02 C
23.73 C
24.66 C
int riscaldatore = 2;
int ventole = 3;
const int pin = 0; // analog pin
float celsius = 0, farhenheit =0; // temperature variables
float millivolts; //dichiarazione di variabile tensione (float è per i numeri con la virgola)
int sensor; 
float somma=0.0;
float media=0.0;
float tref=26.0;
int i=0; 
    
void setup() {  
    pinMode(riscaldatore, OUTPUT);  
    pinMode(ventole, OUTPUT);
}  
  
void loop() {  
    Serial.begin(9600); 
    sensor = analogRead(pin); //lettura valore del sensore LM35 messo sull'ingresso analogico A0
    millivolts = ( sensor/1023.0)*5000; //formula per ottenere la tensione di uscita dell'LM35 in millivolts
    celsius =millivolts/10; // valore espresso in gradi Celsius (l'out del sensore è 10mv per grado)
    farhenheit=celsius*1.8+32; // valore espresso in gradi Farhenheit
    
    for(i=0;i<10;i++)
  {
sensor = analogRead(pin);
sensor = analogRead(pin);
millivolts = ( sensor/1024.0)*5000;
celsius =millivolts/10;
somma=somma + celsius;
delay(1000); //ritardo tra due campionature successive
}
media= (somma/10.0); //calcolo del valore medio di 10 rilievi
somma=0.0; // riazzeramento della variabile somma
Serial.print(media);Serial.println(" C");
    if(media <= 24.0){
      digitalWrite(riscaldatore, HIGH);
      digitalWrite(ventole, LOW);
        for(tref;tref>=media;tref){
        media=0.0;
        for(i=0;i<10;i++){     
            sensor = analogRead(pin);
            sensor = analogRead(pin);
            millivolts = ( sensor/1024.0)*5000;
            celsius =millivolts/10;
            somma=somma + celsius;
            delay(1000); //ritardo tra due campionature successive
                          }
        media= (somma/10.0); //calcolo del valore medio di 10 rilievi
        Serial.print(media);Serial.println(" C");
      }
    Serial.print(media);Serial.println(" C");
    media=0.0;
    somma=0.0;
    }
    digitalWrite(riscaldatore, LOW);
    digitalWrite(ventole, LOW);
    
}

Hai già visto il progetto che è in Megatopic ?

E' piuttosto completo.

Guglielmo

la ringrazio, lo avevo già visto. Però diciamo che il mio progetto dovrebbe essere leggermente differente. Più povero di funzioni ma differente su alcune cose. Poi mi piacerebbe realizzare un codice diciamo tutto mio :slight_smile:

Ti consiglierei di descrivere il tuo progetto come faccio io, così:

// Inizializza dati
pin digitale riscaldatore=2;
pin digitale ventole=3;
pin analogico sensore=0;
float celsius=0.0;
float millivolts=0.0;
float somma=0.0;
float media=0.0;
float tref=26.0;
int sensor;
int i=0;

// void setup {
    pin riscaldatore OUTPUT;
    pin ventole OUTPUT;
    Spegni riscaldatore;
    Spegni ventole;
    Inizializza monitor seriale;
}

// void loop {
    Leggi temperatura media;
    Stampa temperatura media;
    SE temperatura media MINORE-UGUALE 24.0 {
        Accendi riscaldatore;
        Spegni ventola;
    }
    SE temperatura media MAGGIORE 24.0 && temperatura media MINORE-UGUALE 26.0 {
        Spegni riscaldatore;
        Spegni ventola;
    }
    SE temperatura media MAGGIORE 26.0 {
        Spegni riscaldatore;
        Accendi ventola;
    }
    Aspetta 1 secondo;
}

In questo modo è facile vedere se qualcosa non torna. Analizzando così il tuo listato viene fuori una descrizione così:

// Inizializza dati
pin digitale riscaldatore=2;
pin digitale ventole=3;
pin analogico sensore=0;
float celsius=0.0;
float millivolts=0.0;
float somma=0.0;
float media=0.0;
float tref=26.0;
int sensor;
int i=0;

// void setup {
    pin riscaldatore OUTPUT;
    pin ventole OUTPUT;
}

// void loop {
    Inizializza monitor seriale;
    Leggi temperatura media;
    Stampa temperatura media;
    SE temperatura media MINORE-UGUALE 24.0 {
        Accendi riscaldatore;
        Spegni ventola;
        Leggi temperatura media;
        Stampa temperatura media;
        Stampa temperatura media;
    }
    Spegni riscaldatore;
    Spegni ventola;
}

Una volta che la descrizione è soddisfacente si prende una riga per volta e la si implementa. Per esempio la riga "Leggi temperatura media" l'hai implementata così:

for (i = 0; i < 10; i++) {
        sensor = analogRead(pin);
        sensor = analogRead(pin);
        millivolts = ( sensor / 1024.0) * 5000;
        celsius = millivolts / 10;
        somma = somma + celsius;
        delay(1000); //ritardo tra due campionature successive
      }

Prova. Ciao,
P.