Problema Incubatrice Uova Galline

Salve a tutti,

sono nuovo del forum e anche in linea di massima di Arduino, avendolo conosciuto circa un anno fa; io non mi occupo di elettronica ma di chimica e Arduino rimane una bellissima passione oltre alla mia attività studentesca.

Ho un problema: con mio padre abbiamo deciso di lavorare ad un'incubatrice per uova di gallina e Arduino sembra faccia proprio al caso nostro. Messo a punto e realizzato il cablaggio dei cavi sono sorti diversi problemi di logica del programma, sicuramente dovuti alla mia ignoranza in materia.

vi spiego un po' che sensori ho nella mia incubatrice e che attuatori:

---Sensori---
.DHT11 per Temp. e Umid.

--Attuatori (tutti collegati a relè gestiti da Arduino)--
-Motore gira Uova.
-Lampade Riscaldamento Teca.
-Resistenza 24v per scaldare H2O in contenitore metallico (idea abbandonata perchè la resistenza non è sufficientemente potente a scaldare).
-Ventola di un vecchio ATX per pc utile per correggere T e Umid buttando aria fuori dalla teca.

Schermo LCD 20x4 I2C alimentato a parte così come la scheda relè da 4.

Premettendo che ho avuto diversi problemi già con il sensore dati dalla ripetuta lettura dello stesso e "risolti" con un delay() nell'accensione della lampadina, vi chiedo:

Si può introdurre un ciclo di rotazione del motore senza interferire con il loop principale? Una sorta di lampeggio senza delay()magari con la funzione millis() e se si, come?

Vi posto lo sketch da e realizzato modificandone altri già esistenti. Ringrazio anticipatamente per le eventuali disponibilità e se avete idee o accorgimenti da implementare al "mio" sketch fate pure.

![/
[#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
LiquidCrystal_I2C lcd(0x27, 20, 4);


#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);



const int luce = 7;
const int ventola = 13;
const int resistenza = 8;
const int motore = 10;

void setup() {

lcd.begin();
lcd.setCursor(0,1);
lcd.print("Temp:");
lcd.setCursor(0,2);
lcd.print("Umid:");
lcd.setCursor(3, 0);
lcd.print("Incubatrice");
lcd.setCursor(0, 3);
lcd.print("*/*/-Incubando-/*/*");


pinMode(luce, OUTPUT);
pinMode(ventola, OUTPUT);
pinMode(resistenza, OUTPUT);
pinMode(motore, OUTPUT);


digitalWrite(luce, LOW);





}
void loop() {

int t = dht.readTemperature();
int h = dht.readHumidity();
lcd.setCursor(6, 1);
lcd.print(t);
lcd.print(char(223));
lcd.print("C");
lcd.setCursor(6, 2);
lcd.print(h);
lcd.print(" %");




if (t<37.7) {
 digitalWrite(luce, HIGH);
 lcd.setCursor(12,1);
 lcd.print("Riscal");
 delay(3000);
 
 }
else{
  digitalWrite(luce, LOW);
  lcd.setCursor(12, 1);
  lcd.print("OK     ");
  delay(180000);
 
}
 


if (t >= 39){
  digitalWrite(ventola, HIGH);
  }
else{
  digitalWrite(ventola, LOW);
  }


if (h < 53){
  digitalWrite(resistenza, HIGH);
  lcd.setCursor(12, 2);
  lcd.print("Riscal.");
}
else{
  digitalWrite(resistenza, LOW);
  lcd.setCursor(12, 2);
  lcd.print("OK     ");
}



if(h > 60){
 digitalWrite(ventola, HIGH);
 }
else{
 digitalWrite(ventola, LOW);
 }
 
 

}

Spero di aver azzeccato almeno la sezione giusta questa volta.

Andava bene già nell'altra. Poi il codice usa i tag code (primo pulsante < / > quando editi)
Puoi anche mettere a posto (correggere) quello che tu hai già scritto.

Ok grazie mille, spero di trovare una soluzione per questo problema perchè mi sta facendo dannare. Forse va oltre le mie competenze questo progetto.

Incubare le uova non è facile, hai scelto proprio il progetto sbagliato per iniziare.
Devi sapere che se sbagli anche di poco con umidità e temperatura hai alte probabilità di dannarti dopo 3 settimane di attesa. In caso di temperatura sbagliata l'embrione non si sviluppa per niente o si ferma nei primi giorni; umidità troppo bassa il pulcino non ce la fa a bucare l'uovo e muore intrappolato, troppo alta muore soffocato. Un mix tra temperatura e umidità sballate portano alla nascita di pulcini malformati (zampe storte, pulcini ciechi) e devi sopprimerli.
Secondo il mio giudizio faresti bene a prendere un'incubatrice commerciale già fatta, non costano quanto un rene e sono affidabili.
In alternativa se proprio vuoi costruirla inizia con le uova di quaglia che sono molto meno rognose (fanno pure prima, 18 giorni tra icubnazione e schiusa).

Non vendo incubatrici, è un consiglio disinteressato :wink:

un po rivisto

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
LiquidCrystal_I2C lcd(0x27, 20, 4);


#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);



const int luce = 7;
const int ventola = 13;
const int resistenza = 8;
const int motore = 10;

void setup() {

  lcd.begin();
  lcd.setCursor(0,1);
  lcd.print("Temp:");
  lcd.setCursor(0,2);
  lcd.print("Umid:");
  lcd.setCursor(3, 0);
  lcd.print("Incubatrice");
  lcd.setCursor(0, 3);
  lcd.print("*/*/-Incubando-/*/*");

  pinMode(luce, OUTPUT);
  pinMode(ventola, OUTPUT);
  pinMode(resistenza, OUTPUT);
  pinMode(motore, OUTPUT);
  
  digitalWrite(luce, LOW);
  digitalWrite(ventola, LOW);
  digitalWrite(resistenza, LOW);
  digitalWrite(motore, LOW);
}

unsigned long TempoPrecedente=0;
unsigned long Intervallo=0;

void loop() {

  double t = dht.readTemperature();
  double h = dht.readHumidity();
  
  lcd.setCursor(6, 1);
  lcd.print(t,1);
  lcd.print(char(223));
  lcd.print("C");
  lcd.setCursor(6, 2);
  lcd.print(h);
  lcd.print(" %");

  // Light
  if (millis() - TempoPrecedente > Intervallo)
    if (t < 37.7) {
      digitalWrite(luce, HIGH);
      lcd.setCursor(12,1);
      lcd.print("Riscal");
      TempoPrecedente = millis();
      Intervallo = 30000; 
    } if (t > 37.8) {
      digitalWrite(luce, LOW);
      lcd.setCursor(12, 1);
      lcd.print("OK     ");
      TempoPrecedente = millis();
      Intervallo = 180000;  
    }
}
  
  // Fan
  if ((t >= 39.0) || (h > 60)) {
    digitalWrite(ventola, HIGH);
  } if ((t < 37.7) && (h <55))
    digitalWrite(ventola, LOW);
  }
 
  if (h < 53){
    digitalWrite(resistenza, HIGH);
    lcd.setCursor(12, 2);
    lcd.print("Riscal.");
  }
  else if (h > 60)) {
    digitalWrite(resistenza, LOW);
    lcd.setCursor(12, 2);
    lcd.print("OK     ");
  }
  
 
 }

pelletta:
Non vendo incubatrici, è un consiglio disinteressato :wink:

Però hai una grande esperienza in merito. :smiley:

Grazie per il suggerimento; io però pensavo a qualche consiglio tecnico per risolvere il problema e non per ovviarlo o rinunciarci. Saluti

CoreZilla grazie per le correzioni però mi da errore nella compilazione... .:confused:

trovato, era una tonda in più..:slight_smile: ora lo provo.

Colpa del doppio #include "Dht.h", presumo.

Si potrebbe inserire un timer per l'azionamento del motore ogni 6 ore per circa 1 min, ovviamente trasformando il tutto in millisecondi e senza usare la funzione delay così da non bloccare il ciclo principale..?

Ho cancellato l' altro tread.
Ciao Uwe

Andreapodd

Andreapodd:
Si potrebbe inserire un timer per l'azionamento del motore ogni 6 ore per circa 1 min, ovviamente trasformando il tutto in millisecondi e senza usare la funzione delay così da non bloccare il ciclo principale..?

Tutto quello che vuoi :P. Volendo anche un Calendario o eventi esclusivi/inclusivi. Mi spiego: se entro sei ore non accendo la lampada dopo 6 ore la accendo per un minuto, etc ...

Se vuoi ti modifico lo sketch se tu mi dai una serie di eventi, magari lo commento e lo rendo più leggibile :P.

Versione un po strutturata con letture non continue ma ogni secondo (io farei anche ogni 5sec). Dimmi se ti è tutto chiaro.

#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 

#define DHTPIN        2       // PIN del sensore
#define DHTTYPE       DHT11   // Tipo sensore T/rH
#define _LOOP_MISURA_ 1000    // 1 secondo di ciclo misura

const int luce = 7;
const int ventola = 13;
const int resistenza = 8;
const int motore = 10;

LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  
  lcd.begin();
  lcd.setCursor(0,1);
  lcd.print("Temp:");
  lcd.setCursor(0,2);
  lcd.print("Umid:");
  lcd.setCursor(3, 0);
  lcd.print("Incubatrice");
  lcd.setCursor(0, 3);
  lcd.print("*/*/-Incubando-/*/*");

  pinMode(luce, OUTPUT);
  pinMode(ventola, OUTPUT);
  pinMode(resistenza, OUTPUT);
  pinMode(motore, OUTPUT);

  digitalWrite(luce, LOW);
  digitalWrite(ventola, LOW);
  digitalWrite(resistenza, LOW);
  digitalWrite(motore, LOW);
}

unsigned long TempoPrecedente=0;
unsigned long TempoLoop=0;
unsigned long Intervallo=0;

void loop() {

  if (millis() - TempoLoop > _LOOP_MISURA_) {   // Limito la lettura e la verifica dei valori a _LOOP_MISURA_
  
    double t = dht.readTemperature();
    double h = dht.readHumidity();
  
    printTRH(t, h);

    if (millis() - TempoPrecedente > Intervallo) {
      Intervallo = LightMngt(t, h);
      TempoPrecedente = millis(); 
    }
    FanMngt(t, h);
    HeaterMngt(t, h);
    TempoLoop = millis();     
  } 
}

//****************************************
// Update the TEMP and Umidity on LCD
void printTRH(double temp, double Rh) {
  lcd.setCursor(6, 1);
  lcd.print(temp, 1);
  lcd.print(char(223));
  lcd.print("C");
  lcd.setCursor(6, 2);
  lcd.print(Rh);
  lcd.print(" %");
}

//****************************************
// Light Management
unsigned long LightMngt(double temp, double Rh) {
  if (temp < 37.7) {
    digitalWrite(luce, HIGH);
    lcd.setCursor(12,1);
    lcd.print("Riscal");    
    return 30000; 
  } if (temp > 37.8) {
    digitalWrite(luce, LOW);
    lcd.setCursor(12, 1);
    lcd.print("OK     ");
    return 180000;  
  }
  return 0;
}

//****************************************
// Fan Management
void FanMngt(double temp, double Rh) {
  if ((temp >= 39.0) || (Rh > 60)) {
    digitalWrite(ventola, HIGH);
  } if ((temp < 37.7) && (Rh <55)) {
    digitalWrite(ventola, LOW);
  }
}

//****************************************
// Heater Management
void HeaterMngt(double temp, double Rh) {
  if (Rh < 53) {
    digitalWrite(resistenza, HIGH);
    lcd.setCursor(12, 2);
    lcd.print("Riscal.");
  }
  else if (Rh > 60) {
    digitalWrite(resistenza, LOW);
    lcd.setCursor(12, 2);
    lcd.print("OK     ");
  }
}

CoreZilla ti dirò la verità, il tuo programma mi sembra fantastico anche se io di programmazione così avanzata, se questa la si può considerare tale, almeno per me lo è, non me ne intendo molto; diciamo che ci sto studiando. Non ho capito bene che hai fatto nella logica del programma. Da quanto ho capito hai diviso in blocchi, giustamente, hai reso indipendente ogni blocco non avendo usato dalay( ottima cosa) e poi....(nella mia ignoranza è compresa l'assenza di molti comandi e strutture della compilazione)? Potresti inserirmi nel codice l'attivazione di un motore(relè, quindi nessun calcolo in gradi di rotazione o cose così) 4 volte al giorno per un minuto e mezzo, anzi, anche 5, anche se con 5 non dividiamo bene le 24h.?:slight_smile: Ti ringrazio enormemente dell'impegno.

Qualche piccolo controllo di errore. Attenzione che per una gestione più accurata e temporizzata bisogna aggiungere un RTC. Il timer di Arduino sicuramente non è preciso.
Il ciclo del motore è ogni 4h un minuto di ON, sincronizzato alla partenza con 1 min di ON

#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 

#define DHTPIN                  2       // PIN del sensore
#define DHTTYPE                 DHT11   // Tipo sensore T/rH
#define _LOOP_MISURA_           2000    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

#define _1MIN__                 60000L
#define _1HOUR_               3600000L
#define _MOT_ON__TIME_          _1MIN__               // 1Minute of ON  time
#define _MOT_OFF_TIME_          (4*_1HOUR_- _1MIN__ ) // 3:59    of OFF time

const int luce = 7;
const int ventola = 13;
const int resistenza = 8;
const int motore = 10;

LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  
  lcd.begin();
  lcd.setCursor(0,1);
  
  lcd.setCursor(0,2);
  lcd.print("Umid:");
  lcd.setCursor(3, 0);
  lcd.print("Incubatrice");
  lcd.setCursor(0, 3);
  lcd.print("*/*/-Incubando-/*/*");

  pinMode(luce, OUTPUT);
  pinMode(ventola, OUTPUT);
  pinMode(resistenza, OUTPUT);
  pinMode(motore, OUTPUT);

  digitalWrite(luce, LOW);
  digitalWrite(ventola, LOW);
  digitalWrite(resistenza, LOW);
  digitalWrite(motore, LOW);
}

unsigned long TempoPrecedente=0;
unsigned long TempoLoop=0;
unsigned long Intervallo=0;

         bool stateMot = false;
unsigned long TempoMot = 0;
unsigned long IntMot   = 0;

void loop() {

  if (millis() - TempoLoop > _LOOP_MISURA_) {   // Limito la lettura e la verifica dei valori a _LOOP_MISURA_

    float t = dht.readTemperature();
    float h = dht.readHumidity();

    // Check if any reads failed and exit early (to try again).
    if (isnan(h) || isnan(t)) {
      printErr();
      TempoLoop = millis();
      return;
    }
  
    printTRH(t, h);

    if (millis() - TempoPrecedente > Intervallo) {
      Intervallo = LightMngt(t, h);
      TempoPrecedente = millis(); 
    }
    FanMngt(t, h);
    HeaterMngt(t, h);
    TempoLoop = millis();     
  } 
}

//****************************************
// Update the TEMP and Umidity on LCD
void printTRH(float temp, float Rh) {
  lcd.setCursor(6, 1);
  lcd.print(temp, 1);
  lcd.print(char(223));
  lcd.print("C");
  lcd.setCursor(6, 2);
  lcd.print(Rh);
  lcd.print(" %");
}

//****************************************
// Update the TEMP and Umidity on LCD with ERR
void printErr() {
  lcd.setCursor(6, 1);
  lcd.print("--.-");
  lcd.print(char(223));
  lcd.print("C");
  lcd.setCursor(6, 2);
  lcd.print("-- %");
}

//****************************************
// Light Management
unsigned long LightMngt(double temp, double Rh) {
  if (temp < 37.7) {
    digitalWrite(luce, HIGH);
    lcd.setCursor(12,1);
    lcd.print("Riscal");    
    return 30000; 
  } if (temp > 37.8) {
    digitalWrite(luce, LOW);
    lcd.setCursor(12, 1);
    lcd.print("OK     ");
    return 180000;  
  }
  return 0;
}

//****************************************
// Fan Management
void FanMngt(float temp, float Rh) {
  if ((temp >= 39.0) || (Rh > 60)) {
    digitalWrite(ventola, HIGH);
  } if ((temp < 37.7) && (Rh <55)) {
    digitalWrite(ventola, LOW);
  }
}

//****************************************
// Heater Management
void HeaterMngt(float temp, float Rh) {
  if (Rh < 53) {
    digitalWrite(resistenza, HIGH);
    lcd.setCursor(12, 2);
    lcd.print("Riscal.");
  }
  else if (Rh > 60) {
    digitalWrite(resistenza, LOW);
    lcd.setCursor(12, 2);
    lcd.print("OK     ");
  }
}

//****************************************
// Motor Management
void MotorMngt() {
  if (millis() - TempoMot > IntMot) {
    if (stateMot) {     // Motore ON -> OFF
      digitalWrite(motore, LOW);
      IntMot = _MOT_OFF_TIME_;
    }
    else {              // Motore OFF -> ON
      digitalWrite(motore, HIGH);
      IntMot = _MOT_ON__TIME_;      
    }
    stateMot = !stateMot; // Change True to False or False to True
  }
}

Sul display adesso visualizzo il valore della temperatura ma non la scritta "Temp:". Poi ti volevo chiedere: inizialmente il motore è spento e passato il tempo da te impostato dovrebbe accendersi o dovrebbe essere acceso all'accensione di arduino? Per un RTC riguardo la gestione dell'orario o temporizzatore non è essenziale, basta che le uova vengano girate almeno 4 volte al giorno, da qui il fatto che non sia essenziale un'ora precisa, basta solo che in un giorno le giri 4 volte..:slight_smile:

Inizialmente il motore è spento ma al primo ciclo di programma dovrebbe venire avviato.

Sotto corretta l'errore di visualizzazione

#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 

#define DHTPIN                  2       // PIN del sensore
#define DHTTYPE                 DHT11   // Tipo sensore T/rH
#define _LOOP_MISURA_           2000    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

#define _1MIN__                 60000L
#define _1HOUR_               3600000L
#define _MOT_ON__TIME_          _1MIN__               // 1Minute of ON  time
#define _MOT_OFF_TIME_          (4*_1HOUR_- _1MIN__ ) // 3:59    of OFF time

const int luce = 7;
const int ventola = 13;
const int resistenza = 8;
const int motore = 10;

LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  
  lcd.begin();
  lcd.setCursor(0,1);
  lcd.print("Temp:");
  lcd.setCursor(0,2);
  lcd.print("Umid:");
  lcd.setCursor(3, 0);
  lcd.print("Incubatrice");
  lcd.setCursor(0, 3);
  lcd.print("*/*/-Incubando-/*/*");

  pinMode(luce, OUTPUT);
  pinMode(ventola, OUTPUT);
  pinMode(resistenza, OUTPUT);
  pinMode(motore, OUTPUT);

  digitalWrite(luce, LOW);
  digitalWrite(ventola, LOW);
  digitalWrite(resistenza, LOW);
  digitalWrite(motore, LOW);
}

unsigned long TempoPrecedente=0;
unsigned long TempoLoop=0;
unsigned long Intervallo=0;

         bool stateMot = false;
unsigned long TempoMot = 0;
unsigned long IntMot   = 0;

void loop() {

  if (millis() - TempoLoop > _LOOP_MISURA_) {   // Limito la lettura e la verifica dei valori a _LOOP_MISURA_

    float t = dht.readTemperature();
    float h = dht.readHumidity();

    // Check if any reads failed and exit early (to try again).
    if (isnan(h) || isnan(t)) {
      printErr();
      TempoLoop = millis();
      return;
    }
  
    printTRH(t, h);

    if (millis() - TempoPrecedente > Intervallo) {
      Intervallo = LightMngt(t, h);
      TempoPrecedente = millis(); 
    }
    FanMngt(t, h);
    HeaterMngt(t, h);
    TempoLoop = millis();     
  } 
}

//****************************************
// Update the TEMP and Umidity on LCD
void printTRH(float temp, float Rh) {
  lcd.setCursor(6, 1);
  lcd.print(temp, 1);
  lcd.print(char(223));
  lcd.print("C");
  lcd.setCursor(6, 2);
  lcd.print(Rh);
  lcd.print(" %");
}

//****************************************
// Update the TEMP and Umidity on LCD with ERR
void printErr() {
  lcd.setCursor(6, 1);
  lcd.print("--.-");
  lcd.print(char(223));
  lcd.print("C");
  lcd.setCursor(6, 2);
  lcd.print("-- %");
}

//****************************************
// Light Management
unsigned long LightMngt(double temp, double Rh) {
  if (temp < 37.7) {
    digitalWrite(luce, HIGH);
    lcd.setCursor(12,1);
    lcd.print("Riscal");    
    return 30000; 
  } if (temp > 37.8) {
    digitalWrite(luce, LOW);
    lcd.setCursor(12, 1);
    lcd.print("OK     ");
    return 180000;  
  }
  return 0;
}

//****************************************
// Fan Management
void FanMngt(float temp, float Rh) {
  if ((temp >= 39.0) || (Rh > 60)) {
    digitalWrite(ventola, HIGH);
  } if ((temp < 37.7) && (Rh <55)) {
    digitalWrite(ventola, LOW);
  }
}

//****************************************
// Heater Management
void HeaterMngt(float temp, float Rh) {
  if (Rh < 53) {
    digitalWrite(resistenza, HIGH);
    lcd.setCursor(12, 2);
    lcd.print("Riscal.");
  }
  else if (Rh > 60) {
    digitalWrite(resistenza, LOW);
    lcd.setCursor(12, 2);
    lcd.print("OK     ");
  }
}

//****************************************
// Motor Management
void MotorMngt() {
  if (millis() - TempoMot > IntMot) {
    if (stateMot) {     // Motore ON -> OFF
      digitalWrite(motore, LOW);
      IntMot = _MOT_OFF_TIME_;
    }
    else {              // Motore OFF -> ON
      digitalWrite(motore, HIGH);
      IntMot = _MOT_ON__TIME_;      
    }
    stateMot = !stateMot; // Change True to False or False to True
  }
}

L'ho acceso da un paio di minuti, non mi resta che aspettare lo scatto del relè..:slight_smile: Una curiosità.... Mi potresti spiegare il comando che hai dato per il controllo degli errori, in cosa consiste e come lavora per favore...?

Il comando è una classica chiamata C isnan (is not a number) e il controllo è lo stesso nell'esempio della libreria (se vedi nella libreria c'è un assegnamento float f = NAN; per la gestione degli errori).

Scusa mi sono accorto che non c'è la chimata del manager del motore:

#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 

#define DHTPIN                  2       // PIN del sensore
#define DHTTYPE                 DHT11   // Tipo sensore T/rH
#define _LOOP_MISURA_           2000    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

#define _1MIN__                 60000L
#define _1HOUR_               3600000L
#define _MOT_ON__TIME_          _1MIN__               // 1Minute of ON  time
#define _MOT_OFF_TIME_          (4*_1HOUR_- _1MIN__ ) // 3:59    of OFF time

const int luce = 7;
const int ventola = 13;
const int resistenza = 8;
const int motore = 10;

LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  
  lcd.begin();
  lcd.setCursor(0,1);
  lcd.print("Temp:");
  lcd.setCursor(0,2);
  lcd.print("Umid:");
  lcd.setCursor(3, 0);
  lcd.print("Incubatrice");
  lcd.setCursor(0, 3);
  lcd.print("*/*/-Incubando-/*/*");

  pinMode(luce, OUTPUT);
  pinMode(ventola, OUTPUT);
  pinMode(resistenza, OUTPUT);
  pinMode(motore, OUTPUT);

  digitalWrite(luce, LOW);
  digitalWrite(ventola, LOW);
  digitalWrite(resistenza, LOW);
  digitalWrite(motore, LOW);
}

unsigned long TempoPrecedente=0;
unsigned long TempoLoop=0;
unsigned long Intervallo=0;

         bool stateMot = false;
unsigned long TempoMot = 0;
unsigned long IntMot   = 0;

void loop() {

  if (millis() - TempoLoop > _LOOP_MISURA_) {   // Limito la lettura e la verifica dei valori a _LOOP_MISURA_

    float t = dht.readTemperature();
    float h = dht.readHumidity();

    // Check if any reads failed and exit early (to try again).
    if (isnan(h) || isnan(t)) {
      printErr();
      TempoLoop = millis();
      return;
    }
  
    printTRH(t, h);

    if (millis() - TempoPrecedente > Intervallo) {
      Intervallo = LightMngt(t, h);
      TempoPrecedente = millis(); 
    }
    FanMngt(t, h);
    HeaterMngt(t, h);
    MotorMngt();
    TempoLoop = millis();     
  } 
}

//****************************************
// Update the TEMP and Umidity on LCD
void printTRH(float temp, float Rh) {
  lcd.setCursor(6, 1);
  lcd.print(temp, 1);
  lcd.print(char(223));
  lcd.print("C");
  lcd.setCursor(6, 2);
  lcd.print(Rh);
  lcd.print(" %");
}

//****************************************
// Update the TEMP and Umidity on LCD with ERR
void printErr() {
  lcd.setCursor(6, 1);
  lcd.print("--.-");
  lcd.print(char(223));
  lcd.print("C");
  lcd.setCursor(6, 2);
  lcd.print("-- %");
}

//****************************************
// Light Management
unsigned long LightMngt(double temp, double Rh) {
  if (temp < 37.7) {
    digitalWrite(luce, HIGH);
    lcd.setCursor(12,1);
    lcd.print("Riscal");    
    return 30000; 
  } if (temp > 37.8) {
    digitalWrite(luce, LOW);
    lcd.setCursor(12, 1);
    lcd.print("OK     ");
    return 180000;  
  }
  return 0;
}

//****************************************
// Fan Management
void FanMngt(float temp, float Rh) {
  if ((temp >= 39.0) || (Rh > 60.0)) {
    digitalWrite(ventola, HIGH);
  } if ((temp < 37.7) && (Rh < 55.0)) {
    digitalWrite(ventola, LOW);
  }
}

//****************************************
// Heater Management
void HeaterMngt(float temp, float Rh) {
  if (Rh < 53) {
    digitalWrite(resistenza, HIGH);
    lcd.setCursor(12, 2);
    lcd.print("Riscal.");
  }
  else if (Rh > 60) {
    digitalWrite(resistenza, LOW);
    lcd.setCursor(12, 2);
    lcd.print("OK     ");
  }
}

//****************************************
// Motor Management
void MotorMngt() {
  if (millis() - TempoMot > IntMot) {
    if (stateMot) {     // Motore ON -> OFF
      digitalWrite(motore, LOW);
      IntMot = _MOT_OFF_TIME_;
    }
    else {              // Motore OFF -> ON
      digitalWrite(motore, HIGH);
      IntMot = _MOT_ON__TIME_;      
    }
    stateMot = !stateMot; // Change True to False or False to True
  }
}

Ora parte all'avvio e rimane in rotazione per un minuto..:slight_smile: Grazie mille..!!! Questo progetto mi ha fatto veramente dannare, l'ho sottovalutato pensando di poter gestire il tutto con if....else..:confused: a quanto pare proprio no. Per quanto riguarda il sensore dici che un DHT22 sarebbe stato molto meglio vero?