Go Down

Topic: incubatrice per uova  aiutoooo (Read 5637 times) previous topic - next topic

frog

@kokiua
quoto

@emanuele
ora che ci guardo, così com'è hai una risoluzione di circa 0,5°C (il che non aiuta). Intanto cambia inserendo nel setup()
Code: [Select]
analogReference(INTERNAL);
e modificando la conversione dell'ADC in °C come segue
Code: [Select]
tempC = (tempC * 110.0)/1024.0;  //convert the analog data to temperature

emanuele

si andava meglio perche era piu stabile e il led non impazziva..
ho inserito la correzione mi sbaglia di 1° ed il led arrivato a soglia lampeggia sempre
mi sa che era meglio che mi compravo un termostato cosi non vi scocciavo



frog

allora, un passetto alla volta. proviamo con le letture distanziate l'una dall'altra
Code: [Select]
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define RIT_TEMP   (unsigned int)(0x00FF)  /*costante di ritardo lettura temperatura */
unsigned int    RitTemp;   /* variabile conteggio ritardo lettura temperatura */

float tempC;
float umiditaC;
float buffer_tempC[] = {0, 0, 0, 0, 0, 0 ,0, 0, 0, 0};
float tamporanea_media = 0;
byte  indice_buffer = 0;


int tempPin = 0;
int umiditaPin = 1;
int DigitalPin =  13;
int DigitalPin1 = 6;      // imposta il pin 6 per attivazione macchina umidita'
float TemperaturaMinima  = 22;
float UmiditaMinima = 57;           //soglia di umidita

int buttonPin_inc = 7;
int buttonPin_dec = 9;
int buttonPin_inc_umidita = 8; // imposta il pin 8 per incremento pulsanti umidita'
int buttonPin_dec_umidita = 10; // imposta il pin 10 per diminuzione pulsante umidita'
char stato_pulsanti = 0;
char stato_pulsanti_umidita = 0;
int lettura_pulsante = 0;
int lettura_pulsante_umidita = 0;
int isteresi = 0.5;

void setup()
{
 RitTemp = 0;
 lcd.begin(3,20);

 pinMode(DigitalPin, OUTPUT);
 pinMode(DigitalPin1, OUTPUT);
 pinMode(buttonPin_inc, INPUT);
 pinMode(buttonPin_dec, INPUT);
 pinMode(buttonPin_inc_umidita, INPUT);
 pinMode(buttonPin_dec_umidita, INPUT);
}

void loop()
{
 //gestione della pressione del pulsante collegato al pin 7 per incrementare l'isteresi
 lettura_pulsante = digitalRead(buttonPin_inc);
 if((lettura_pulsante == HIGH) && !(stato_pulsanti & 0x01))
 {
   TemperaturaMinima += 0.5;
   stato_pulsanti |= 0x01;
 }
 else
 {
   if(lettura_pulsante == LOW)
   {
     stato_pulsanti &= ~0x01;
   }
 }

 //gestione della pressione del pulsante collegato al pin 9 per decrementare l'isteresi
 lettura_pulsante = digitalRead(buttonPin_dec);
 if((lettura_pulsante == HIGH) && !(stato_pulsanti & 0x02))
 {
   TemperaturaMinima -= 0.5;
   stato_pulsanti |= 0x01;
 }
 else
 {
   if(lettura_pulsante == LOW)
   {
     stato_pulsanti &= ~0x01;
   }
 }
 //gestione della pressione del pulsante collegato al pin 8 per incrementare l'isteresi d'umidita'
 lettura_pulsante_umidita = digitalRead(buttonPin_inc_umidita);
 if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti_umidita & 0x01))
 {
   UmiditaMinima += 0.5;
   stato_pulsanti_umidita |= 0x01;
 }
 else
 {
   if(lettura_pulsante_umidita == LOW)
   {
     stato_pulsanti_umidita &= ~0x01;
   }
 }
 //gestione della pressione del pulsante collegato al pin 10 per decrementare l'isteresi d'umidita'
 lettura_pulsante_umidita = digitalRead(buttonPin_dec_umidita);
 if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti_umidita & 0x02))
 {
   UmiditaMinima -= 0.5;
   stato_pulsanti_umidita |= 0x01;
 }
 else
 {
   if(lettura_pulsante_umidita == LOW)
   {
     stato_pulsanti_umidita &= ~0x01;
   }
 }
 
 if( ++RitTemp == RIT_TEMP )
 { /* incrementa il conteggio e verifica se raggiunto il ritardo */
   RitTemp = 0;    /* se raggiunto azzera il contatore */
 
   //calcolo dela temperatura attuale
   tempC = analogRead(tempPin);           //read the value from the sensor
   tempC = (tempC * 500.0)/1024.0;  //convert the analog data to temperature
 
   //calcolo dell'umidita attuale
   umiditaC = analogRead(umiditaPin);           //read the value from the sensor
   umiditaC = (5.0 * umiditaC * 100.0)/1024.0;  //convert the analog data to temperature
 
   //visualizzazione a display
   lcd.clear();
   lcd.print ( "Temp. Int.   +" );
 
   lcd.setCursor  (14,0);
   lcd.print(tempC);
 
   lcd.setCursor  (14,3);
   lcd.print(umiditaC);
 
   lcd.setCursor (0,3);
   lcd.print ("Umidita Int. %");
 
   lcd.setCursor (0,1);
   lcd.print ( "Temp. Set    +" );
 
   lcd.setCursor (14,1);          //sposta i gradi di soglia sull'lcd
   lcd.print(TemperaturaMinima); // scrive temperatura di soglia
 
   lcd.setCursor (14,2);          //sposta i gradi di soglia sull'lcd
   lcd.print(UmiditaMinima); // scrive umidita' di soglia
 
   lcd.setCursor (0,2);
   lcd.print ("Umidita Set  %");
 
   //gestione dell'attivazione/disattivazione dell'uscita in base alla temperatura letta
   if (tempC < TemperaturaMinima)
   {
     digitalWrite(DigitalPin, HIGH);   // set the LED on
     delay(40);                      // wait for a second
   }
   else
   {
     if (tempC > (TemperaturaMinima + isteresi))
     {
       digitalWrite(DigitalPin, LOW);  // set the LED off
       delay(40);
     }
   }
   delay(200);
 
   //gestione dell'attivazione/disattivazione dell'uscita in base all'umidita' letta
   if (umiditaC < UmiditaMinima)
   {
     digitalWrite(DigitalPin1, HIGH);   // set the LED on
     delay(40);                      // wait for a second
   }
   else
   {
     if (umiditaC > (UmiditaMinima + isteresi ))
     {
       digitalWrite(DigitalPin1, LOW);  // set the LED off
       delay(40);
     }
   }
   delay(200);
 }
}


per aumentare la distanza fra le letture aumenta il #define RIT_TEMP, ad esempio con 0x02FF

mi scocci? ma va là! questa sera non avevo niente da fare  ;)

emanuele

grazie :)
e impossibile provarlo perche appena sposto la temp di soglia invece di varialmela di 0,5° varia 405.50°

frog

questo problema è nato con questa ultima versione?


frog

ho visto un errorino nell'ultima versio del codice che hai postato. ecco l acorrezione, dimmi se si risolve qualcosa
Code: [Select]
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define RIT_TEMP   (unsigned int)(0x00FF)  /*costante di ritardo lettura temperatura */
unsigned int    RitTemp;   /* variabile conteggio ritardo lettura temperatura */

float tempC;
float umiditaC;
float buffer_tempC[] = {0, 0, 0, 0, 0, 0 ,0, 0, 0, 0};
float tamporanea_media = 0;
byte  indice_buffer = 0;


int tempPin = 0;
int umiditaPin = 1;
int DigitalPin =  13;
int DigitalPin1 = 6;      // imposta il pin 6 per attivazione macchina umidita'
float TemperaturaMinima  = 22;
float UmiditaMinima = 57;           //soglia di umidita

int buttonPin_inc = 7;
int buttonPin_dec = 9;
int buttonPin_inc_umidita = 8; // imposta il pin 8 per incremento pulsanti umidita'
int buttonPin_dec_umidita = 10; // imposta il pin 10 per diminuzione pulsante umidita'
char stato_pulsanti = 0;
char stato_pulsanti_umidita = 0;
int lettura_pulsante = 0;
int lettura_pulsante_umidita = 0;
int isteresi = 0.5;

void setup()
{
 RitTemp = 0;
 lcd.begin(3,20);

 pinMode(DigitalPin, OUTPUT);
 pinMode(DigitalPin1, OUTPUT);
 pinMode(buttonPin_inc, INPUT);
 pinMode(buttonPin_dec, INPUT);
 pinMode(buttonPin_inc_umidita, INPUT);
 pinMode(buttonPin_dec_umidita, INPUT);
}

void loop()
{
 //gestione della pressione del pulsante collegato al pin 7 per incrementare l'isteresi
 lettura_pulsante = digitalRead(buttonPin_inc);
 if((lettura_pulsante == HIGH) && !(stato_pulsanti & 0x01))
 {
   TemperaturaMinima += 0.5;
   stato_pulsanti |= 0x01;
 }
 else
 {
   if(lettura_pulsante == LOW)
   {
     stato_pulsanti &= ~0x01;
   }
 }

 //gestione della pressione del pulsante collegato al pin 9 per decrementare l'isteresi
 lettura_pulsante = digitalRead(buttonPin_dec);
 if((lettura_pulsante == HIGH) && !(stato_pulsanti & 0x02))
 {
   TemperaturaMinima -= 0.5;
   stato_pulsanti |= 0x02;
 }
 else
 {
   if(lettura_pulsante == LOW)
   {
     stato_pulsanti &= ~0x02;
   }
 }
 //gestione della pressione del pulsante collegato al pin 8 per incrementare l'isteresi d'umidita'
 lettura_pulsante_umidita = digitalRead(buttonPin_inc_umidita);
 if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti_umidita & 0x04))
 {
   UmiditaMinima += 0.5;
   stato_pulsanti_umidita |= 0x04;
 }
 else
 {
   if(lettura_pulsante_umidita == LOW)
   {
     stato_pulsanti_umidita &= ~0x04;
   }
 }
 //gestione della pressione del pulsante collegato al pin 10 per decrementare l'isteresi d'umidita'
 lettura_pulsante_umidita = digitalRead(buttonPin_dec_umidita);
 if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti_umidita & 0x08))
 {
   UmiditaMinima -= 0.5;
   stato_pulsanti_umidita |= 0x08;
 }
 else
 {
   if(lettura_pulsante_umidita == LOW)
   {
     stato_pulsanti_umidita &= ~0x08;
   }
 }
 
 if( ++RitTemp == RIT_TEMP )
 { /* incrementa il conteggio e verifica se raggiunto il ritardo */
   RitTemp = 0;    /* se raggiunto azzera il contatore */
 
   //calcolo dela temperatura attuale
   tempC = analogRead(tempPin);           //read the value from the sensor
   tempC = (tempC * 500.0)/1024.0;  //convert the analog data to temperature
 
   //calcolo dell'umidita attuale
   umiditaC = analogRead(umiditaPin);           //read the value from the sensor
   umiditaC = (5.0 * umiditaC * 100.0)/1024.0;  //convert the analog data to temperature
 
   //visualizzazione a display
   lcd.clear();
   lcd.print ( "Temp. Int.   +" );
 
   lcd.setCursor  (14,0);
   lcd.print(tempC);
 
   lcd.setCursor  (14,3);
   lcd.print(umiditaC);
 
   lcd.setCursor (0,3);
   lcd.print ("Umidita Int. %");
 
   lcd.setCursor (0,1);
   lcd.print ( "Temp. Set    +" );
 
   lcd.setCursor (14,1);          //sposta i gradi di soglia sull'lcd
   lcd.print(TemperaturaMinima); // scrive temperatura di soglia
 
   lcd.setCursor (14,2);          //sposta i gradi di soglia sull'lcd
   lcd.print(UmiditaMinima); // scrive umidita' di soglia
 
   lcd.setCursor (0,2);
   lcd.print ("Umidita Set  %");
 
   //gestione dell'attivazione/disattivazione dell'uscita in base alla temperatura letta
   if (tempC < TemperaturaMinima)
   {
     digitalWrite(DigitalPin, HIGH);   // set the LED on
     delay(40);                      // wait for a second
   }
   else
   {
     if (tempC > (TemperaturaMinima + isteresi))
     {
       digitalWrite(DigitalPin, LOW);  // set the LED off
       delay(40);
     }
   }
   delay(200);
 
   //gestione dell'attivazione/disattivazione dell'uscita in base all'umidita' letta
   if (umiditaC < UmiditaMinima)
   {
     digitalWrite(DigitalPin1, HIGH);   // set the LED on
     delay(40);                      // wait for a second
   }
   else
   {
     if (umiditaC > (UmiditaMinima + isteresi ))
     {
       digitalWrite(DigitalPin1, LOW);  // set the LED off
       delay(40);
     }
   }
   delay(200);
 }
}

emanuele

adesso si imposta bene, la lettura sembra piu' stabile pero quando arriva a soglia fa lo stesso difetto .
ma se lo taglio e lo butto quel led :D
forse e meglio se preparo il contenitore e lo testo in condizioni reali

digitalWrite(DigitalPin, HIGH);   // set the LED on
     delay(40);   potrebbe essere questa la causa che allorigine era di 4000 e poi lo tolto perche dovevo aspettare 4+4+4+4 secondi per impostare 0.5° di soglia

emanuele

quell'errore che mi hai correttonella prima versione andava bene nell'ultima no
lo avevo fatto io di proposito perche cosi non dovevo premere ripetutamente il pulsante per aumentare il livello di soglia con quello basta che tenevo premuto e aumentava di 0,5° per volta fino a che non lasciavo

frog

ma no! piuttosto di togliere "quel led" cambia pin per abilitare il relè (ma secondo me non centra)

ma la simulazione che fai è di cambiare la soglia tramite i pulsanti? puoi provare a impostare una sogli a di 25°C e scaldare il sensore con le dita?

ci aggiorniamo a domani che mi butto in branda (domani sono in trasferta per lavoro)

emanuele

"ma la simulazione che fai è di cambiare la soglia tramite i pulsanti?"      si la metto a temperatura ambiente
prova fatta soglia 25° scaldato con le mani ma appena arriva al traguardo il led e intermittente

frog

allora, ci ho un po' pensato e sono giunto alla conclusione che potrebbe essere colpa del fatto che così com'è il sistema ha una risoluzione di poco inferiore a 0.5°C e l'isteresi è proprio di 0.5°C il che è un po' rischioso. proverei a fare così:
1) aumento della risoluzione del sistema (circa 0.1°C)
2) ampiamento dell'isteresi (1.0°C)
3) diminuzione degli incrementi della soglia di temperatura in seguito alla pressione del pulsante (0.3°C)
di seguito il codice

Code: [Select]
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define RIT_TEMP   (unsigned int)(0x00FF)  /*costante di ritardo lettura temperatura */
unsigned int    RitTemp;   /* variabile conteggio ritardo lettura temperatura */

float tempC;
float umiditaC;
float buffer_tempC[] = {0, 0, 0, 0, 0, 0 ,0, 0, 0, 0};
float tamporanea_media = 0;
byte  indice_buffer = 0;


int tempPin = 0;
int umiditaPin = 1;
int DigitalPin =  13;
int DigitalPin1 = 6;      // imposta il pin 6 per attivazione macchina umidita'
float TemperaturaMinima  = 22;
float UmiditaMinima = 57;           //soglia di umidita

int buttonPin_inc = 7;
int buttonPin_dec = 9;
int buttonPin_inc_umidita = 8; // imposta il pin 8 per incremento pulsanti umidita'
int buttonPin_dec_umidita = 10; // imposta il pin 10 per diminuzione pulsante umidita'
char stato_pulsanti = 0;
#define PULSANTE_TEMPERATURA_INC_PREMUTO  0x01
#define PULSANTE_TEMPERATURA_DEC_PREMUTO  0x02
#define PULSANTE_UMIDITA_INC_PREMUTO      0x04
#define PULSANTE_UMIDITA_DEC_PREMUTO      0x08

#define STEP_TEMPERATURA                  0.3
#define STEP_UMIDITA                      0.5

char stato_pulsanti_umidita = 0;
int lettura_pulsante = 0;
int lettura_pulsante_umidita = 0;
int isteresi = 1.0;

void setup()
{
 RitTemp = 0;
 lcd.begin(3,20);
 
 analogReference(INTERNAL);
 
 pinMode(DigitalPin, OUTPUT);
 pinMode(DigitalPin1, OUTPUT);
 pinMode(buttonPin_inc, INPUT);
 pinMode(buttonPin_dec, INPUT);
 pinMode(buttonPin_inc_umidita, INPUT);
 pinMode(buttonPin_dec_umidita, INPUT);
}

void loop()
{
 //gestione della pressione del pulsante collegato al pin 7 per incrementare l'isteresi
 lettura_pulsante = digitalRead(buttonPin_inc);
 if((lettura_pulsante == HIGH) && !(stato_pulsanti & PULSANTE_TEMPERATURA_INC_PREMUTO))
 {
   TemperaturaMinima += STEP_TEMPERATURA;
   stato_pulsanti |= PULSANTE_TEMPERATURA_INC_PREMUTO;
 }
 else
 {
   if(lettura_pulsante == LOW)
   {
     stato_pulsanti &= ~PULSANTE_TEMPERATURA_INC_PREMUTO;
   }
 }

 //gestione della pressione del pulsante collegato al pin 9 per decrementare l'isteresi
 lettura_pulsante = digitalRead(buttonPin_dec);
 if((lettura_pulsante == HIGH) && !(stato_pulsanti & PULSANTE_TEMPERATURA_DEC_PREMUTO))
 {
   TemperaturaMinima -= STEP_TEMPERATURA;
   stato_pulsanti |= PULSANTE_TEMPERATURA_DEC_PREMUTO;
 }
 else
 {
   if(lettura_pulsante == LOW)
   {
     stato_pulsanti &= ~PULSANTE_TEMPERATURA_DEC_PREMUTO;
   }
 }
 //gestione della pressione del pulsante collegato al pin 8 per incrementare l'isteresi d'umidita'
 lettura_pulsante_umidita = digitalRead(buttonPin_inc_umidita);
 if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti & PULSANTE_UMIDITA_INC_PREMUTO))
 {
   UmiditaMinima += STEP_UMIDITA;
   stato_pulsanti |= PULSANTE_UMIDITA_INC_PREMUTO;
 }
 else
 {
   if(lettura_pulsante_umidita == LOW)
   {
     stato_pulsanti &= ~PULSANTE_UMIDITA_INC_PREMUTO;
   }
 }
 //gestione della pressione del pulsante collegato al pin 10 per decrementare l'isteresi d'umidita'
 lettura_pulsante_umidita = digitalRead(buttonPin_dec_umidita);
 if((lettura_pulsante_umidita == HIGH) && !(stato_pulsanti & PULSANTE_UMIDITA_DEC_PREMUTO))
 {
   UmiditaMinima -= STEP_UMIDITA;
   stato_pulsanti |= PULSANTE_UMIDITA_DEC_PREMUTO;
 }
 else
 {
   if(lettura_pulsante_umidita == LOW)
   {
     stato_pulsanti &= ~PULSANTE_UMIDITA_DEC_PREMUTO;
   }
 }
 
 if( ++RitTemp == RIT_TEMP )
 { /* incrementa il conteggio e verifica se raggiunto il ritardo */
   RitTemp = 0;    /* se raggiunto azzera il contatore */
 
   //calcolo dela temperatura attuale
   tempC = analogRead(tempPin);           //read the value from the sensor
   tempC = (tempC * 107.421875L)/1000.0;  //convert the analog data to temperature
 
   //calcolo dell'umidita attuale
   umiditaC = analogRead(umiditaPin);           //read the value from the sensor
   umiditaC = (5.0 * umiditaC * 100.0)/1024.0;  //convert the analog data to temperature
 
   //visualizzazione a display
   lcd.clear();
   lcd.print ( "Temp. Int.   +" );
 
   lcd.setCursor  (14,0);
   lcd.print(tempC);
 
   lcd.setCursor  (14,3);
   lcd.print(umiditaC);
 
   lcd.setCursor (0,3);
   lcd.print ("Umidita Int. %");
 
   lcd.setCursor (0,1);
   lcd.print ( "Temp. Set    +" );
 
   lcd.setCursor (14,1);          //sposta i gradi di soglia sull'lcd
   lcd.print(TemperaturaMinima); // scrive temperatura di soglia
 
   lcd.setCursor (14,2);          //sposta i gradi di soglia sull'lcd
   lcd.print(UmiditaMinima); // scrive umidita' di soglia
 
   lcd.setCursor (0,2);
   lcd.print ("Umidita Set  %");
 
   //gestione dell'attivazione/disattivazione dell'uscita in base alla temperatura letta
   if (tempC < TemperaturaMinima)
   {
     digitalWrite(DigitalPin, HIGH);   // set the LED on
     delay(40);                      // wait for a second
   }
   else
   {
     if (tempC > (TemperaturaMinima + isteresi))
     {
       digitalWrite(DigitalPin, LOW);  // set the LED off
       delay(40);
     }
   }
   delay(200);
 
   //gestione dell'attivazione/disattivazione dell'uscita in base all'umidita' letta
   if (umiditaC < UmiditaMinima)
   {
     digitalWrite(DigitalPin1, HIGH);   // set the LED on
     delay(40);                      // wait for a second
   }
   else
   {
     if (umiditaC > (UmiditaMinima + isteresi ))
     {
       digitalWrite(DigitalPin1, LOW);  // set the LED off
       delay(40);
     }
   }
   delay(200);
 }
}

se così facendo il led pazzerino mette la testa a posto possiamo cominciare ad affinare le cose

emanuele

woww il led si e calmato ma che cera un po di valeriana nel codice

dati attuali
temperatura di soglia 23.20
resta acceso  fino a 24.20   (no dovrebe staccare a23.20)( e ripartire appena arriva a 22.20)

e riparte nuovamente a 23.20
lettura umidita(che per il momento ce un lm35)   mi segna +106.42° credo sia sballato

temperatura con srumento di precisione 22.25
temperatura con arduino 22.34/22.45

frog

yuppi! ci ho preso  8-)

resta acceso fino a 24.2 perché è così nel codice
Code: [Select]
//gestione dell'attivazione/disattivazione dell'uscita in base alla temperatura letta
   if (tempC < TemperaturaMinima)
   {
     digitalWrite(DigitalPin, HIGH);   // set the LED on
     delay(40);                      // wait for a second
   }
   else
   {
     if (tempC > (TemperaturaMinima + isteresi))
     {
       digitalWrite(DigitalPin, LOW);  // set the LED off
       delay(40);
     }
   }

per avere lo stacco a 23.2 e attivazione sotto i 22.2 si deve cambiare con
Code: [Select]
//gestione dell'attivazione/disattivazione dell'uscita in base alla temperatura letta
   if (tempC < (TemperaturaMinima - isteresi))
   {
     digitalWrite(DigitalPin, HIGH);   // set the LED on
     delay(40);                      // wait for a second
   }
   else
   {
     if (tempC > TemperaturaMinima)
     {
       digitalWrite(DigitalPin, LOW);  // set the LED off
       delay(40);
     }
   }

per avere una lettura corretta anche sul secondo sensore va modificata la formula di conversione da
Code: [Select]
umiditaC = (5.0 * umiditaC * 100.0)/1024.0;  //convert the analog data to temperature
in
Code: [Select]
umiditaC = (umiditaC * 107.421875L)/1000.0;  //convert the analog data to temperature
lo strumento di precisione di cui parli misura la temperatura ambiente o la tensione di uscita del sensore (che converti in temperatura)?

emanuele

perche avevi dubbi che ci prendevi  ;)


che pensi e meglio cosi ho farlo scendere


lo strumento misura la temperatura ambiente li ho affiancati

ok funziona anche umidita'

Go Up