Controllo serra: Pompe attive per cinque secondi e uso relè

Salve a tutti,
ho cercato discussioni simili ma non sono riuscito a trovarle, quindi pongo a voi la seguente domanda:
Come posso tenere attive due pompe (per l’acqua) per cinque secondi o meno, con un delay del programma di 300 ms? Quindi con un timer ad oltranza.

Di conseguenza, vorrei saper come fare in modo che il relè rimanga attivo tutti i 5 secondi (o quelli che sono) e poi si spenga.

Altra domanda: Con il delay presente, i relè si attivano per 6 volte, poi fanno una pausa di circa 100 ms e il ciclo si ripete. Non mi capacito del comportamento anomalo

Copio anche il codice del programma, se volete dare un’occhiata

Grazie intanto per aver letto

#include <IRremote.h>
#include <IRremoteInt.h>
#include "DHT.h"
#include <SPI.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

int InputInfra = 10;
IRrecv irrecv(InputInfra);
decode_results results;

#define DHTPIN 2
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);

//Inizializzazione Pin

int sensoreTerra1 = A0;
int sensoreTerra2 = A1;
int sensoreTerra3 = A2;
int sensoreTerra4 = A3;
int Rele1=6;
int Rele2=5;
int Button=4;

//Inizialiazzazione Variabili

int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;
int sensorValue4 = 0;
double MediaSensori1=0.0;
double MediaSensori2=0.0;
double temp1=0.0;
double temp2=0.0;
int buttonState=0;
boolean StatoPompa1=false; 
boolean StatoPompa2=false;

LiquidCrystal_I2C lcd(0x27,16,2);

void setup() {
  lcd.init(); 
  dht.begin();
  pinMode(sensoreTerra1, INPUT);
  pinMode(sensoreTerra2, INPUT);
  pinMode(sensoreTerra3, INPUT);
  pinMode(sensoreTerra4, INPUT);
  pinMode(Rele1, OUTPUT); //Inzializza Relè 1
  pinMode(Rele2, OUTPUT); //Inzializza Relè 2
  pinMode(Button,INPUT);
  lcd.backlight();
  irrecv.enableIRIn();
  Serial.begin(9600);
}

void loop() {
  sensorValue1 = analogRead(sensoreTerra1);
  sensorValue2 = analogRead(sensoreTerra2);
  sensorValue3 = analogRead(sensoreTerra3);
  sensorValue4 = analogRead(sensoreTerra4);
  temp1=0,0;
  temp2=0,0;
  temp1=temp1+sensorValue1+sensorValue2;
  temp2=temp2+sensorValue3+sensorValue4;
//Ora fa la media tra i sensori per poi attivare le pompe separatamente   
  MediaSensori1=(temp1/2);
  MediaSensori2=(temp2/2);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

  int h = dht.readHumidity();
  int t = dht.readTemperature();
  digitalWrite(Rele1, LOW);
  digitalWrite(Rele2, LOW);
  buttonState=digitalRead(Button);
  
    // set the cursor to (0,0):
  lcd.setCursor(0, 0);
  // print from 0 to 9:
   lcd.print("T: ");
   lcd.print(t);
   lcd.print("C");
   lcd.print("  ");
   lcd.print("H: ");
   lcd.print(h);
   lcd.print("%");
    // set the cursor to (16,1):
   lcd.setCursor(0,1);
   Serial.print(MediaSensori1);
   Serial.print(" ");
   Serial.println(MediaSensori2);
   //Controllo Motore tramite telecomando, 90=Su 890=Giù
   if (irrecv.decode(&results)) 
   {
     if(results.value==90)
     {
       Serial.println("SU");
     }
     else
     {
       if(results.value==890)
       {
         Serial.println("GIU'");
       }
     }
     }
     
        	if(buttonState==HIGH)
        	{
        	     digitalWrite(Rele1, HIGH);
        	     digitalWrite(Rele2, HIGH);
        	}
        	else
        	{
        	   //Controllo dei sensori per attivare le pompe
        	   if(MediaSensori1<60)
        	   {
        	     if( MediaSensori2<60)
        	     {
        	       //Attiva tutte e due le pompe
        	       lcd.print("ANNAFFIA");
        	       digitalWrite(Rele1, HIGH);
        	       digitalWrite(Rele2, HIGH);
        	     }
        	     else
        	     {
        	       //Attiva solo la prima pompa
        	       lcd.print("ANNAFFIA");
        	       digitalWrite(Rele1, HIGH);
        	     }
        	   }
        	   else
        	   {
        	     if(MediaSensori2<60)
        	     {
        	       //Attiva solo la seconda pompa
        	       lcd.print("ANNAFFIA");
        	       digitalWrite(Rele2, HIGH);
        	     }
        	     else
        	     {
        	       //Tiene spente le pompe
        	      lcd.print("OK      ");
        	       digitalWrite(Rele1, LOW);
        	       digitalWrite(Rele2, LOW);
        	     }
        	   }
        
        	}
    irrecv.resume();
  delay(300); 
}

(tags added by Moderator)

ProgettoSerra.txt (3.82 KB)

Per rendere il codice più leggibile devi racchiuderlo con i TAG code. Riedita il codice. :wink:

Segui l’esempio del blinkwhitoutdelay. Imposti una variabile boleana ed un IF condizionato al tempo e allo stato della variabile per accendere e spegnere la pompa.

Perchè il delay? Devi sincronizzare qualche evento o temi che lo sketch vada troppo veloce?

Grazie, scusa per la poca manualità con il forum

Il delay è per il DHT11. Se metto meno di 300 ms i dati in entrata saranno sempre un po' in ritardo rispetto alla realtà (Almeno così leggevo dalla libreria DHT)

La funzione millis ha funzionato. Non l'avevo proprio capita, grazie mille.

Ultima cosa: i relè. Devo fare un controllo pure su quelli? Per evitare che ogni 300 ms dia di nuovo l'impulso?

Ultima cosa: i relè. Devo fare un controllo pure su quelli? Per evitare che ogni 300 ms dia di nuovo l'impulso?

Non è necessario e non comporta alcuna anomalia funzionale, tuttavia rieseguire codice già eseguito è in alcuni casi uno spreco di cicli macchina, in questi casi si usano due funzioni e un puntatore a funzione che alternativamente punta esclusivamente ad una di esse.

Es. la funzione A, accende il pin e dopo fa in modo che il puntatore a funzione punti a B. B fa la stessa cosa, tranne per il fatto che spegne, e assegna al puntatore la funzione A.

Il puntatore potrebbe anche puntare a nulla (zero) e in questo caso il codice seguente permette di evitare l'esecuzione di una funzione.

if (funcPointer != 0)
    funcPointer();     // chiama la funzione se il puntatore è diverso da zero.

Tuttavia i puntatori a funzione in mani poco esperte posso creare problemi. Occorre sempre visionare il codice in assembler prodotto dal compilatore C/C++ al fine di vedere se fa quello che volevamo, in alcuni caso fa qualcosa che non vogliamo e occorre combattere con il linker al fine di comunicagli informazioni dettagliate.

Ciao.