serra automatizzata ,problema con il settagio delle temperature.

Salve a tutti

mi sono avvicinato al mondo di arduino da poco, sono un felice possessore di un arduino mega , non sono un esperto ma mi arrangio e mi piace imparare sempre cose nuove.

Voglio realizzare un controllo della mia serra tramite arduino. Sto partendo da una cosa semplice come il controllo di temperatura e umidità con relativa attivazione di una stufa e di un ventilatore per poi arrivare a un progetto un pò più complesso che mi permetta di controllare e gestire la mia serra dal mio telefono.

ho un problema con lo skech , vi spiego cosa voglio fare se la temperatura è maggiore di 20°C la stufa deve spegnersi e il ventilatore si deve accendere,se la temperatura è minore di 15 la stufa si accende e il ventilatore si spegne, se il range della temperatura è compreso tra 20 e 15 tutti gli impianti sono spenti.

Quando ho compilato lo skech mi sembrava tutto abbastanza semplice e chiaro, ma all'atto pratico non mi funziona.
Per esempio adesso la temperatura mi segna 22°C e invece di raffreddare mi parte il riscaldamento!

Eccovi il mio Skech :

#define RELAY1 30
 #define RELAY2 31
   #define RELAY3 32
      
#include "LiquidCrystal.h" 
#include <DHT.h>
#include <Wire.h>mi 

int temperature;  // sensore temperatura
int Humidity;  // sensore umidità

DHT dht(2, DHT22); //Imposta il modello di sensore e il pin di Arduino a cui è collegato
LiquidCrystal lcd(3,4, 5,6,7,8); //Imposta i pin di Arduino a quali sono collegati in pin del display (Rs,E,DB4,DB5,DB6,DB7)

int lum_pin=9; //il pin al quale è collegato LED+
byte lum_val=127; // il valore della luminosità. Può essere impostato da 0 (retroilluminazione spenata) a 255 (retroilluminazione massima)


void setup() { 
   
  for (int i=30; i<38; i++) {
    pinMode(i, OUTPUT);
  }
   Serial.begin(9600);       //Abilitazione monitor pc
                             //Abilitazione pin in output

  pinMode(lum_pin,OUTPUT);
  analogWrite(lum_pin,lum_val);
  dht.begin();
  lcd.begin(16, 2);// imposto il numer di righe e colonne del display
  //creo il carattere ‘°’ per poter scrivere °C dopo il valore della temperatura
  byte deg[8] =
  {
    0b00011,
    0b00011,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000
  };
  lcd.createChar(4,deg);
}
  
void loop() {  { 

temperature=digitalRead (DHT22);// lettura sensore umidita' e temperatura  

  // schema umidita' e temperatura inizio 

  {
  float h = dht.readHumidity(); //leggi il valore di temperatura
  float t = dht.readTemperature(); //leggi il valore di umidità
  lcd.setCursor(0,0);//metti il cursore sulla prima riga
  lcd.print("");
  if(isnan(t))lcd.print("Errore!");//se il valore di temperatura è NaN (Not a Number)
  else //altrimenti
  {
    lcd.print(t);
    Serial.print("temperatura: "); 
    Serial.println (t);
    lcd.write(4); //scrivi il carattere ‘°’
    lcd.print("C");
  }
  lcd.setCursor(9,0);//metti il cursore sulla seconda riga
  lcd.print("");
  if(isnan(h))lcd.print("Errore!");//se il valore di umidità è NaN (Not a Number)
  else
  {
    lcd.print(h);
    lcd.print(" %");
    Serial.print("Umidita': "); 
    Serial.println (h);
    
  }
}
  
  // schema umidita' e temperatura fine

 // inizio comandi relè  

 //TEMPERATURA INZIO

       if (temperature > 20) {  // settaggio temperatura MASSIMA  della serra
    
   digitalWrite(31, LOW);  // spegne la stufa
   digitalWrite(30, HIGH);  //accende la ventilazione
   digitalWrite(32, HIGH);  //accende IL FOG
   lcd.setCursor(0,3);  
   lcd.print("T >10 RAFFRED");
   Serial.println ("RISCALDAMENTO OFF");
   delay(1000);
   Serial.println ("FAN ON");
   delay(1000);
   Serial.println ("FOG ON");
   delay(1000);
   
   }else if(temperature < 15) {  // settaggio temperatura MINIMA  della serra 
   
   digitalWrite(31, HIGH);   //accende la stufa
   digitalWrite(30, LOW);   //spegnela ventilazione
   digitalWrite(32, LOW);  // spegne IL FOG
   Serial.println ("IL FOG E' ACCESO");
   delay(3000);               //NEBULIZZO PER SEC 3 
   digitalWrite(32, LOW);  //IL FOG E' SPENTO
   Serial.println ("IL FOG E' SPENTO");
   lcd.setCursor(0,3);
   lcd.print("T<15 RISCALDO");
    Serial.println ("WARM ON FAN OFF");
    delay(1000);
  
   } else {                // se temperatura compresa tra min e max tutto spento
   digitalWrite(31, LOW);
   digitalWrite(30, LOW);
   lcd.setCursor(0,3);
   lcd.print("Tutto Spento  ");
   Serial.println ("Tutto Spento ");
   }
 
 
 delay(1000);  // intervallo tra le letture

}
}

 //TEMPERATURA FINE

    // FINE COMANDI RELAY

Vi ringrazio per qualunque contributo voi mi diate!
un abbraccio !

Salvo

Il codice si racchiude tra i tag CODE e NON tra i tag QUOTE ... per questa volta ho corretto io, poi, se magari usi l'apposita funzione dell'IDE, Tools -> Auto Format, rendi il codice molto più ordinato e leggibile e ti rendi anche conto, molto più facilmente, se ci sono blocchi di codice mal posizionati ...

Venendo la codice ... mi salta subito agli occhi questa:

temperature = digitalRead (DHT22); // lettura sensore umidita' e temperatura

... dove hai letto che la temperatura, con il DHT22, si legge così ? ? ? :o Che senso ha quella riga ? ? ? :o

Guglielmo

Grazie Guglielmo
mi hai dato l'indicazione esatta dove andare a correggere il mio skech, non so di preciso come è venuta fuori quella riga di codice , ma ho fatto una breve ricerca e ho riscritto il codice e questa volta sembra che funzioni a modo .

Adesso posso andare avanti con il mio progetto. grazie!

allego il codice :

#define RELAY1 30
 #define RELAY2 31
   #define RELAY3 32
      
#include "LiquidCrystal.h" 
#include <DHT.h>
#include <Wire.h>
const int sensorPin = A0;  // sensore temperatura
int temperature;  // sensore temperatura
int Humidity;  // sensore umidità

DHT dht(2, DHT22); //Imposta il modello di sensore e il pin di Arduino a cui è collegato
LiquidCrystal lcd(3,4, 5,6,7,8); //Imposta i pin di Arduino a quali sono collegati in pin del display (Rs,E,DB4,DB5,DB6,DB7)

int lum_pin=9; //il pin al quale è collegato LED+
byte lum_val=127; // il valore della luminosità. Può essere impostato da 0 (retroilluminazione spenata) a 255 (retroilluminazione massima)


void setup() { 

 

   
  for (int i=30; i<38; i++) {
    pinMode(i, OUTPUT);
  }
   Serial.begin(9600);       //Abilitazione monitor pc
                             //Abilitazione pin in output
     
   

  pinMode(lum_pin,OUTPUT);
  analogWrite(lum_pin,lum_val);
  dht.begin();
  lcd.begin(16, 2);// imposto il numer di righe e colonne del display
  //creo il carattere ‘°’ per poter scrivere °C dopo il valore della temperatura
  byte deg[8] =
  {
    0b00011,
    0b00011,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000
  };
  lcd.createChar(4,deg);

  
}






  
void loop() {  { 



  // schema umidita' e temperatura inizio 

  {
  float h = dht.readHumidity(); //leggi il valore di temperatura
  float t = dht.readTemperature(); //leggi il valore di umidità
  lcd.setCursor(0,0);//metti il cursore sulla prima riga
  lcd.print("");
  if(isnan(t))lcd.print("Errore!");//se il valore di temperatura è NaN (Not a Number)
  else //altrimenti
  {
    lcd.print(t);
    Serial.print("temperatura: "); 
    Serial.println (t);
    lcd.write(4); //scrivi il carattere ‘°’
    lcd.print("C");
  }
  lcd.setCursor(9,0);//metti il cursore sulla seconda riga
  lcd.print("");
  if(isnan(h))lcd.print("Errore!");//se il valore di umidità è NaN (Not a Number)
  else
  {
    lcd.print(h);
    lcd.print(" %");
    Serial.print("Umidita': "); 
    Serial.println (h);
    
  }
}

  
  // schema umidita' e temperatura fine

   
 // inizio comandi relè  


 //TEMPERATURA INZIO




       if (dht.readTemperature() > 25) {  // settaggio temperatura MASSIMA  della serra
    
   digitalWrite(31, LOW);  // spegne la stufa
   digitalWrite(30, HIGH);  //accende la ventilazione
   digitalWrite(32, HIGH);  //accende IL FOG
   lcd.setCursor(0,3);  
   lcd.print("T >10 RAFFRED");
   Serial.println ("RISCALDAMENTO OFF");
   delay(1000);
   Serial.println ("FAN ON");
   delay(1000);
   Serial.println ("FOG ON");
   delay(1000);

   
   }else if(dht.readTemperature() < 15) {  // settaggio temperatura MINIMA  della serra 
   
   digitalWrite(31, HIGH);   //accende la stufa
   digitalWrite(30, LOW);   //spegnela ventilazione
   digitalWrite(32, LOW);  // spegne IL FOG
   Serial.println ("IL FOG E' ACCESO");
   delay(3000);               //NEBULIZZO PER SEC 3 
   digitalWrite(32, LOW);  //IL FOG E' SPENTO
   Serial.println ("IL FOG E' SPENTO");
   lcd.setCursor(0,3);
   lcd.print("T<15 RISCALDO");
    Serial.println ("WARM ON FAN OFF");
    delay(1000);
  
   } else {                // se temperatura compresa tra min e max tutto spento
   digitalWrite(31, LOW);
   digitalWrite(30, LOW);
   lcd.setCursor(0,3);
   lcd.print("Tutto Spento  ");
   Serial.println ("Tutto Spento ");
   }
 
 
 delay(1000);  // intervallo tra le letture

}
}


 //TEMPERATURA FINE

    // FINE COMANDI RELAY