ciao a tutti, ho un problema con uno sketch che utilizzo per gestire una cella di lievitazione. tramite la funzione switch case e il conteggio del tempo passato, seleziona la porzione di codice da eseguire. fino al case 2 ( prelievitazione ) tutto bene , ma da qui dopo i 10 secondi (impostati per prova) non passa al case 3 ( lievitazione) ma dopo 20 secondi va al case 4 (attesa) e poi ricomincia. ho perso ore a cercare di capire dove sia l'errore , ma non ci arrivo ,sarà una banalità o no ? avete qualche idea? Uso IDE 1.6.11 . allego sketch per cercare di capire assieme , ciedo un grande aiuto ..devo preparare gli impasti per sabato
![]()
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Imposta l'indirizzo del display a 0x27 con 16 caratteri per 2 linee
LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(8, DHT22); // tipo sensore e pin connesso
const int toutraf = 7; //Frigo
const int toutris = 6; //Cavetto
const int hout = 9; //Umidificatore ultrasuoni
const int led = 10; // luce interna led
unsigned long prevMillis = 0; // era la tua variabile time
#define K_15H 10000L //tempo 1 ora per ora tutto a 10 sec per test funzionamento
#define K_25H 10000L //tempo 2 ore
#define K_1H 10000L //tempo 3 ore
#define K_24H 10000L //tempo 24 ore
int fase = 0; // 0,1,2,3,4 fasi
void setup()
{
lcd.init();// inizializza il display
lcd.backlight();//accende la retroilluminazione
dht.begin();
pinMode(toutraf, OUTPUT);
pinMode(hout, OUTPUT);
pinMode(toutris, OUTPUT);
}
void loop()
{
float h = dht.readHumidity(); // Leggo il valore di umidità
float t = dht.readTemperature(); // Leggo il valore di temperatura
if (isnan(t) || isnan(h)) // Se almeno uno dei due valori è NaN (Not a Number)
{ lcd.clear();
lcd.print("Impossibile leggere il sensore!");
delay (1000);
}
else //altrimenti
{
lcd.setCursor(0, 0);
lcd.print("Umidita' =");
lcd.setCursor(10, 0);
lcd.print(h);
lcd.setCursor(0, 1);
lcd.print("Temperat.= ");
lcd.setCursor(10, 1);
lcd.print(t);
}
unsigned long currMillis = millis();
switch (fase)
{ case 0: Raffreddamento(); break;
case 1: Maturazione(); break;
case 2: Prelievitazione(); break;
case 3: Lievitazione(); break;
case 4: Attesa(); break;
}
}
}
}
void Raffreddamento()
{ unsigned long currMillis = millis();
float t = dht.readTemperature();
float h = dht.readHumidity();
lcd.setCursor(0, 3);
lcd.print(millis() / 1000);
if (currMillis - prevMillis > K_1H)
{ fase = 1; // finita 1 ore passa a Maturazione
prevMillis = currMillis;
}
else // le due ore non sono passate...
{ if ( t >= 3 )
{ digitalWrite(toutraf, LOW);
digitalWrite(toutris, HIGH);
digitalWrite(hout, HIGH);
lcd.setCursor(15, 0);
lcd.print("Acc");
lcd.setCursor(15, 1);
lcd.print("No");
lcd.setCursor(6, 3);
lcd.print("Raffreddamento");
}
else
{ if ( t <= 3 - 1 )
{ digitalWrite(toutraf, HIGH);
digitalWrite(toutris, HIGH);
digitalWrite(hout, HIGH);
lcd.setCursor(15, 0);
lcd.print("Spe");
lcd.setCursor(15, 1);
lcd.print("NO ");
lcd.setCursor(6, 3);
lcd.print("Raffreddamento");
}
}
}
}
void Maturazione()
{ unsigned long currMillis = millis();
float t = dht.readTemperature();
float h = dht.readHumidity();
lcd.setCursor(0, 3);
lcd.print(millis() / 1000);
if (currMillis - prevMillis > K_24H)
{ fase = 2; // finite le 24 ora passa a Pre-levitazione
prevMillis = currMillis;
}
else
{ if ( t >= 4 )
if ( h <= 60 )
{ digitalWrite(toutraf, LOW);
digitalWrite(toutris, HIGH);
digitalWrite(hout, LOW);
lcd.setCursor(15, 0);
lcd.print("Acc");
lcd.setCursor(6, 3);
lcd.print("Maturazione ");
lcd.setCursor(15 , 1);
lcd.print("Acc");
}
else
{ if ( t <= 4 - 1 )
if ( h >= 60 )
{ digitalWrite(toutris, LOW);
digitalWrite(toutraf, HIGH);
digitalWrite(hout, HIGH);
lcd.print("Maturazione ");
lcd.setCursor(15, 0);
lcd.print("Spe");
lcd.setCursor(6, 3);
lcd.setCursor(15, 1);
lcd.print("Spe");
}
}
}
}
void Prelievitazione()
{ unsigned long currMillis = millis();
float t = dht.readTemperature();
float h = dht.readHumidity();
lcd.setCursor(0, 3);
lcd.print(millis() / 1000);
if (currMillis - prevMillis > K_1H)
{ fase = 3; // finite le 1.5 ore passa a Lievitazione
prevMillis = currMillis;
}
else
{ if ( t >= 13 )
if ( h <= 80 )
{ digitalWrite(toutraf, LOW);
digitalWrite(toutris, HIGH);
digitalWrite(hout, LOW);
lcd.setCursor(15, 0);
lcd.print("Acc");
lcd.setCursor(6, 3);
lcd.print("Pre-lievitaz. ");
lcd.print("Acc");
}
else
{ if ( t <= 13 )
if ( h >= 80 )
{ digitalWrite(toutraf, HIGH);
digitalWrite(toutris, LOW);
digitalWrite(hout, HIGH);
lcd.setCursor(15, 0);
lcd.print("Spe");
lcd.setCursor(6, 3);
lcd.print("Pre-lievita ");
lcd.setCursor(15, 1);
lcd.print("Spe");
}
}
}
}
void Lievitazione()
{ unsigned long currMillis = millis();
float t = dht.readTemperature();
float h = dht.readHumidity();
lcd.setCursor(0, 3);
lcd.print(millis() / 1000);
if (currMillis - prevMillis > K_1H)
{ fase = 4; // finite le 2.5 ora passa a Attesa
prevMillis = currMillis;
}
else
{ if ( t > 28 )
if ( h < 95 )
{ digitalWrite(toutraf, LOW);
digitalWrite(toutris, HIGH);
digitalWrite(hout, LOW);
lcd.setCursor(15, 0);
lcd.print("Acc");
lcd.setCursor(6, 3);
lcd.print("Lievitazione ");
digitalWrite(hout, LOW);
lcd.setCursor(15, 1);
lcd.print("Acc");
}
else
{ if ( t < 28 )
if ( h > 95 )
{ digitalWrite(toutraf, HIGH);
digitalWrite(toutris, LOW);
digitalWrite(hout, HIGH);
lcd.setCursor(15, 0);
lcd.print("Spe");
lcd.setCursor(6, 3);
lcd.print("Lievitazione ");
digitalWrite(hout, LOW);
lcd.setCursor(15, 1);
lcd.print("Spe");
}
}
}
}
void Attesa()
{ unsigned long currMillis = millis();
float t = dht.readTemperature();
float h = dht.readHumidity();
lcd.setCursor(0, 3);
lcd.print(millis() / 1000);
if (currMillis - prevMillis > K_1H)
{ fase = 0; // finite le 8 ora passa Raffreddamento
prevMillis = currMillis;
}
else
{ if ( t >= 24 )
if ( h <= 80 )
{ digitalWrite(toutraf, LOW);
digitalWrite(toutris, HIGH);
digitalWrite(hout, LOW);
lcd.setCursor(15, 0);
lcd.print("Acc");
lcd.setCursor(6, 3);
lcd.print("Attesa ");
digitalWrite(hout, LOW);
lcd.setCursor(15, 1);
lcd.print("Acc");
}
else
{ if ( t <= 24 )
if ( h >= 80 )
{ digitalWrite(toutraf, HIGH);
digitalWrite(toutris, LOW);
digitalWrite(hout, HIGH);
lcd.setCursor(15, 0);
lcd.print("Spe");
lcd.setCursor(6, 3);
lcd.print("Attesa ");
digitalWrite(hout, LOW);
lcd.setCursor(15, 1);
lcd.print("Spe");
}
}
}
}