Aiuto If, else If, else

ciao a tutti,
sto cercando di gestire una piccola serra con dht22, ventole per pc e un riscaldatore da 5 v tutto comandato da arduino uno e scheda relè. non voglio far scattare il relè ogni secondo quindi ho creato un'isteresi

la mia intenzione è quella di attivare le ventole sopra i 24 gradi, tenere tutto spento tra 24 e 21 e accendere il riscaldamento sotto i 21.

vi allego il mio codice:

int Tempimpostata = 24;
int Isteresi = 3;

voip setup ()
....
void loop ()
if (t > Tempimpostata)
{
  calore e ventola spente
   }
 else if (t < Tempimpostata - Isteresi)
{
   calore acceso e ventole spente
    }
else if (t > Tempimpostata + isteresi)
{
   calore spento e ventole accese
  }
else 
{
   calore spento e ventole spente
  
  }

vedete degli errori? sto cercando di capire se ho ragionato in maniera troppo contorta e se c'è un modo piu semplice.

grazie mille

daniele

ciao

io modificherei semplicemente così :slight_smile:

#define TempimpostataMAX = 24;
#define TempimpostataMIN = 21;



voip setup ()
....
void loop (){
if (t >= TempimpostataMAX){  calore spento e ventole accese   }
if (t > TempimpostataMIN && t <TempimpostataMAX){ Tutto spento}
if (t < TempimpostataMIN){riscaldamento acceso e ventole spente}
 
 }

se un valore è fisso, tipo TempimpostataMAX non definirla come int, essendo che non varia all'interno del codice, ma bensì come #define, così risparmi spazio sulla memoria del micro :slight_smile:

MD

grazie mille per la risposta, seguiro il tuo consiglio sul #define.

con il tuo codice se la temperatura è bassa accedo il riscaldamento cosi:

if (t < TempimpostataMIN){riscaldamento acceso e ventole spente}

ma una volta raggiunta la temperatura minima il relè si staccherà e si riattaccherà appena scenderà di 0,1 gradi; in pratica avrò un continuo stacca e attacca o sbaglio?

Io lo modificherei cosi:

if (t > Tempimpostata)
{
  if (t > Tempimpostata + isteresi)
  {
    calore spento e ventole accese
  }
  else
  {
    calore e ventola spente
  }
}
else
{
  if (t < Tempimpostata - Isteresi)
  {
    calore acceso e ventole spente
  }
}

perché nel tuo codice se la temperatura è maggiore di quella impostata entra nel primo if e spegne tutto senza considerare gli altri else if che contemplano l'isteresi

Boh a me sembra che il problema sia semplice...
La descrizione dice tutto:
"attivare le ventole sopra i 24 gradi, tenere tutto spento tra 24 e 21 e accendere il riscaldamento sotto i 21"

Quindi basta implementare questa logica "traducendo" i commenti in codice:

#define TEMP_MIN 21
#define TEMP_MAX 24
 ...
void loop ()
  ...
  // attivare le ventole sopra i 24 gradi
  if (t > TEMP_MAX)
  {
    // Attivo ventole
  }
  // accendere il riscaldamento sotto i 21
  else if (t < TEMP_MIN)
 {
    // Attivo riscaldamento
  }
  else 
  // tenere tutto spento tra 24 e 21
  {
    // Disattivo ventole
    // Disattivo riscaldamento
  }

Per ora questa è la soluzione più semplice ed immediata ma ovvio che ci sono anche altri modi, ad esempio per attivare o disattivare solamente al primo passaggio di stato evitando di fare digitalWrite ad ogni loop:

#define TEMP_MIN 21
#define TEMP_MAX 24

#define STATO_LOW -1
#define STATO_OFF 0
#define STATO_HIGH 1
int stato = STATO_OFF;
 ...
void loop ()
  ...
  // attivare le ventole sopra i 24 gradi
  if (t > TEMP_MAX && stato < STATO_HIGH)
  {
    // Attivo ventole
    stato = STATO_HIGH;
  }
  // accendere il riscaldamento sotto i 21
  else if (t < TEMP_MIN && stato > STATO_LOW)
 {
    // Attivo riscaldamento
    stato = STATO_LOW;
  }
  else if ( stato != STATO_OFF )
  // tenere tutto spento tra 24 e 21
  {
    // Disattivo ventole
    // Disattivo riscaldamento
    stato = STATO_OFF;
  }

fabpolli:
Io lo modificherei cosi:

if (t > Tempimpostata)

{
  if (t > Tempimpostata + isteresi)
  {
    calore spento e ventole accese
  }
  else
  {
    calore e ventola spente
  }
}
else
{
  if (t < Tempimpostata - Isteresi)
  {
    calore acceso e ventole spente
  }
}



perché nel tuo codice se la temperatura è maggiore di quella impostata entra nel primo if e spegne tutto senza considerare gli altri else if che contemplano l'isteresi

Grazie mille, ho risolto grazie al tuo suggerimento.
Stamattina è saltata l'energia elettrica, quando è tornata la temperatura era superiore alla Tempimpostata ed è partito sia il calore sia le ventole (da codice doveva essere tutto spento). quando ha raggiunto Tempimpostata+Isteresi si è spento tutto ed ha iniziato a funzionare regolarmente come da codice. perchè?

Credo dipenda da come hai settato le cose nel setup, probabilmente parti tutto acceso, invece devi partire tutto spento e demandare al loop le decisioni, ma senza il programma completo sto tirando a indovinare

fabpolli:
Credo dipenda da come hai settato le cose nel setup, probabilmente parti tutto acceso, invece devi partire tutto spento e demandare al loop le decisioni, ma senza il programma completo sto tirando a indovinare

scusa, hai ragione, in setup parte tutto acceso; grazie ancora, molto gentile. Risolto

aquilacieca:
scusa, hai ragione, in setup parte tutto acceso; grazie ancora, molto gentile. Risolto

Bene, ma ti consiglio caldamente di implementare il codice come nel mio secondo esempio, che NON modifica nulla a meno che tu non stia passando da uno stato all'altro... :wink:

grazie del consiglio, non appena avrò risolto altri piccoli inghippi proverò il tuo codice.

ciao ciao