Problema con codice per serra

Salve, da un po di tempo mi sto dedicando al progetto di una piccola serra wifi, con una scheda MKR1000
ho collegato:
delle ventole per il raffreddamento e in caso di umidità troppo alta
1 termistore che rileva la T del terreno
1 Soil Mosture per l’umidità del terreno
e un dht22 per umidità e temperatura del aria, il progetto funziona alla perfezione ma quando provo a far accendere le ventole sia per la temperatura elevata che per l’umidità si accendono solo quano la temperatura supera il il limite e non per l’umidità,

il fatto e che il software non da errore
ecco il codice che riguarda il controllo dei dispositivi:

if (tempimpostata > -1 && tempimpostata < 10)
{ lcd.setCursor (7, 0);
lcd.print ("  ");}
if (umidimpostata > -1 && umidimpostata < 10)
{ lcd.setCursor (7, 1);
lcd.print ("  ");}

if (soil > -1 && soil < 10)
{ lcd.setCursor (7, 0);
lcd.print (" ");}

if ( soil > sm )
{digitalWrite ( sout, HIGH );}
else {digitalWrite (sout, LOW);}

if ( h > umidimpostata ) 
{digitalWrite ( vout, HIGH );}
else {digitalWrite (vout, LOW);}

if ( t > tempimpostata ) 
{digitalWrite ( vout, HIGH );}
else {digitalWrite (vout, LOW);}

if (h < umidimpostata )
{digitalWrite (v2out, HIGH );}
else {digitalWrite (v2out, LOW);}

 if ( t < tempimpostata  )
{digitalWrite (tout2, HIGH );}
else {digitalWrite (tout2, LOW);}
if ( h < umidimpostata )
{digitalWrite ( hout, HIGH );}
else {digitalWrite (hout, LOW);}
timer.run(); // Initiates SimpleTimer
  Blynk.run();
delay (150);
    
    
}

qualcuno puo indicarmi se sbaglio qualcosa?

così come è scritto anche se l’umidità fa accendere la ventola appena dopo (al massimo qualche microsecondo) se la temperatura non è fuori soglia la ventola viene spenta per cui non fa in tempo a partire :slight_smile:

devi legare le 2 condizioni nello stesso if

if ( h > umidimpostata ||  t > tempimpostata ) {
   digitalWrite ( vout, HIGH );
} else {
   digitalWrite (vout, LOW);
}
 //if ( t > tempimpostata ) {
//   digitalWrite ( vout, HIGH );
//} else {
//   digitalWrite (vout, LOW);
//}

vedo ora

if (h < umidimpostata ) {
   digitalWrite (v2out, HIGH );
} else {
   digitalWrite (v2out, LOW);
}
if ( h < umidimpostata ) {
   digitalWrite ( hout, HIGH );
} else {
   digitalWrite (hout, LOW);
}

anche questa le puoi mettere assieme

if (h < umidimpostata ) {
   digitalWrite (v2out, HIGH );
   digitalWrite ( hout, HIGH );
} else {
   digitalWrite (v2out, LOW);
   digitalWrite (hout, LOW);
}

Allora, il codice gira perfettamente ma le ventole non ancora partono quando il valore supera il limite mentre per la temperatura tutto ok :frowning:

Quale può essere il problema?

il programma e controllato anche tramite wifi, ci potrebbero essere problemi di sincronizzazione??

allora ora girano solo se entrambi i valori sono sopra al limite dimenticavo c’è anche una pulsantiera nel sistema che serve a impostare i limiti dei valori

questo è tutto il codice:

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <SPI.h>
#include <WiFi101.h>
#include <BlynkSimpleMKR1000.h>

#include <Wire.h>
#include <SimpleTimer.h>
#include <FlashAsEEPROM.h>

#include "DHT.h"
#include <BlynkSimpleWiFiShield101.h> 
#define DHTPIN 1    // what pin we're connected to, pin1 is 5th pin from end

#define analogPin A5//sensore suolo

#define analogPin A6//sensore temperatura terreno
#define beta 3950 //the beta of the thermistor
#define resistance 10 //the value of the pull-up resistor


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
int sm=0;
int pinMoist=A5;


// connessione display (pin)
const int soilTemperature = A6;
const int soilMoisture = A5;

const int tsu = 4;
const int tgiu = 5;

const int hsu = 8;
const int hgiu = 2;

const int ssu = 13;
const int sgiu = 14;

//serpentina riscaldamento

const int vout =6;
const int v2out =3;
const int tout =7;
//umidificatore
const int hout =9;
//irrigazione pompa
const int sout =10;
//dichiarazione pulsanti
int statotsu =0;
int statotgiu =0;

int statohsu =0;
int statohgiu =0;

int tempimpostata =0;
int umidimpostata =0;
int soil = 750;

//umidità terreno
//int umtrimpostata =0;


// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);

const int riscaldamento =7;
const int irrigazione = 10;
const int umidificatore =9;
const int ventilazione =6;
//const int stato = irrigazione ;

//#define DHTTYPE DHT21  // DHT 21
#define DHTTYPE DHT22  // DHT 22

//Adafruit_BMP085 bmp;
  

DHT dht(DHTPIN,DHTTYPE);
SimpleTimer timer;

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "      ";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "     "; //  your network SSID (name)
char pass[] = "     ";    //your network password
int keyIndex = 0;     // your network key Index number (needed only for WEP)

//int relayPin = 6;
void sendSensor()
{


 float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);
  

  long a =1023 - analogRead(A6); //read thermistor value 
  float tempC = beta /(log((1025.0 * 10 / a - 10) / 10) + beta / 298.0) - 273.0;
  float t2 =tempC;

  

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)|| isnan(sm) )
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
  
   
   

   
    
   
    

   
  Blynk.virtualWrite(V2, h);
  Blynk.virtualWrite(V3, t);
  Blynk.virtualWrite(V5, pinMoist );
  //Serial.println(soilMoisture);
  Blynk.virtualWrite(V6, t2 );
  //Serial.println(soilTemperature);
  Blynk.virtualWrite(V7, soil );
  Blynk.virtualWrite(V8, tempimpostata );
  Blynk.virtualWrite(V9, umidimpostata );
  
}

// This function will be called every time Slider Widget
// in Blynk app writes values to the Virtual Pin 1
//BLYNK_WRITE(V1) {
//  int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  //SerialUSB.print("V1 button is: ");
 // SerialUSB.println(pinValue);
  //if (pinValue == 1) {
    //digitalWrite(relayPin, HIGH);
 // } else {
 //   digitalWrite(relayPin, LOW);
 // }
//}


void setup()
{
  lcd.begin();
  lcd.backlight();

lcd.setCursor(0,0);
lcd.print("T:");
lcd.setCursor(4,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("H:");
lcd.setCursor(4,1);
lcd.print(" ");
lcd.setCursor(8,0);
lcd.print(" Soil:");


//riscaldamento-ventoole
pinMode(tout, OUTPUT);
 pinMode(vout, OUTPUT);
 //umidificatore-ventole
 pinMode(hout, OUTPUT);
 //irrigazione
 pinMode(sout, OUTPUT); 
  Serial.begin(9600);

// If the EEPROM is empty then isValid() is false
  if (!EEPROM.isValid()) {

    Serial.println("EEPROM is empty, writing some example data:");
    Serial.print("->");
    for (int i=0; i<20; i++) {
      EEPROM.write(i, 100+i);
      Serial.print(" ");
      Serial.print(100+i);
    }
  Serial.println();

 
    EEPROM.commit();
    Serial.println("Done!");

    Serial.print("After commit, calling isValid() returns ");
    Serial.println(EEPROM.isValid());

  } else {

    Serial.println("EEPROM has been written.");
    Serial.println("Here is the content of the first 20 bytes:");

    Serial.print("->");
    for (int i=0; i<20; i++) {
      Serial.print(" ");
      Serial.print(EEPROM.read(i));
    }
    Serial.println();

  }
  
  Blynk.begin(auth, ssid, pass);
  // Or specify server using one of those commands:
  //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442);
  //Blynk.begin(auth, ssid, pass, server_ip, port);

   dht.begin();
   Wire.begin(); // required by BMP180
 //   bmp.begin();
    timer.setInterval(1000L, sendSensor);

pinMode(riscaldamento, OUTPUT);


  delay(5000);
  
   

}
BLYNK_CONNECTED() {
Blynk.syncVirtual(V20);
}
// This function will be called every time
// when App writes value to Virtual Pin 1
BLYNK_WRITE(V20)
 {
 if(param.asInt()==1)
  {
     digitalWrite(riscaldamento, LOW);
  }
  else
  {
     digitalWrite(riscaldamento, HIGH);
     pinMode(2, OUTPUT);
  }
 }


void loop()
{

sm = analogRead(pinMoist);  
 
long a =1023 - analogRead(A6); //read thermistor value 
  Serial.print("Raw reading ");
  Serial.println(a); 
  //the calculating formula of temperature
  float tempC = beta /(log((1025.0 * 10 / a - 10) / 10) + beta / 298.0) - 273.0;
 
  
statotsu = digitalRead (tsu);
if( statotsu == HIGH)
{tempimpostata++;}
statotgiu = digitalRead (tgiu);
if( statotgiu == HIGH)
{tempimpostata--;}
statohsu = digitalRead (hsu);
if( statohsu == HIGH)
{umidimpostata++;}
statohgiu = digitalRead (hgiu);
if( statohgiu == HIGH)
{umidimpostata--;}
statohsu = digitalRead (ssu);
if( statohsu == HIGH)
{soil++;}
statohgiu = digitalRead (sgiu);
if( statohgiu == HIGH)
{soil--;}

    int t = dht.readTemperature();
    lcd.setCursor(2, 0);
    lcd.print(t);
    lcd.setCursor(6, 0);
lcd.print(tempimpostata);
    int h = dht.readHumidity();
    lcd.setCursor(2, 1);
    lcd.print(h);
    lcd.setCursor(6, 1);
lcd.print(umidimpostata);
    lcd.setCursor(9, 1);    
lcd.println( soil);
    


if (tempimpostata > -1 && tempimpostata < 10)
{ lcd.setCursor (7, 0);
lcd.print ("  ");}
if (umidimpostata > -1 && umidimpostata < 10)
{ lcd.setCursor (7, 1);
lcd.print ("  ");}

if (soil > -1 && soil < 10)
{ lcd.setCursor (7, 0);
lcd.print (" ");}

if ( t < tempimpostata  )
{digitalWrite (tout, HIGH );}
else {digitalWrite (tout, LOW);}

if ( soil > sm )
{digitalWrite ( sout, HIGH );}
else {digitalWrite (sout, LOW);}

//if ( h > umidimpostata ) 
//{digitalWrite ( vout, HIGH );}
//else {digitalWrite (vout, LOW);}

if ( h >= umidimpostata ||  t >= tempimpostata ) {
   digitalWrite ( vout, HIGH );
} else {
   digitalWrite (vout, LOW);
   delay(100);
}

//if ( t > tempimpostata ) 
//{digitalWrite ( vout, HIGH );}
//else {digitalWrite (vout, LOW);}




if ( h < umidimpostata )
{digitalWrite ( hout, HIGH );}
else {digitalWrite (hout, LOW);
}

                                                                                                                                                                                                                                                                                                                                                                                            
timer.run(); // Initiates SimpleTimer
  Blynk.run();
delay (150);
    
    
}

ti riconfermo che se non fai un'attesa di almeno 60 millisecondi tra una lettura e l'altra del dht.... non legge correttamente
poi prova a stamparti su seriale i valori subito prima delle if così vedi esattamente che h e t hai e che umidimpostata e tempimpostata sono
essendoci di mezzo l'or (||) non è possibile che debbano essere tutte e due sopra, ne basta una (o la prima o la seconda condizione deve risultare vera per eseguire le istruzioni)