Filtro antidisturbo su relè per serra automatizzata

Innanzi tutto grazie mille per la risposta..
Mi dispiace ma non so cosa sia la "classe String" quindi non so rispondere alla domanda :frowning:
In ogni caso allego il codice se può essere utile:

#include <LiquidCrystal.h>
#include "DHT.h"
#define DHTPIN 6
#define DHTTYPE DHT11
#define LCD_LIGHT_ON_TIME 4000
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int pompa=7;
const int ventola=8;
const int pulsante = 13;  //pulsante al pin 13
const int accensioneLcd = 10;   //comando transistor per accensione LCD al pin 10
const int galleggiante = 9;   //sensore galleggiante al pin 9
const int sensoreUmidita=A0;
const int led=A1;

int buttonState;
int lastButtonState = LOW;
int buttonPushCounter = 0;
int statoGalleggiante;

int lcdAcceso = 0;
int terreno;
int statoPompa = 0;
int statoVentola = 0;

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
unsigned long pausaGalleggiante1 = 150;
unsigned long pausaGalleggiante2 = 300;

String message = "       Attenzione!   Livello Acqua Insufficente        ";
int ii = 0;
int strLength;
String toShow;


void setup() {

  lcd.begin(16, 2);
  pinMode(led, OUTPUT);
  pinMode(pulsante, INPUT);
  pinMode(galleggiante, INPUT);
  pinMode(sensoreUmidita, INPUT);
  pinMode(pompa, OUTPUT);
  pinMode(ventola, OUTPUT);
  strLength = message.length();
  digitalWrite(accensioneLcd, HIGH);
  digitalWrite(pompa, HIGH);
  digitalWrite(ventola, HIGH);
  lcd.setCursor(3,0);
  lcd.print ("Benvenuto");
  delay(5000);
  lcd.clear();
  lcd.setCursor (3,0);
  lcd.print ("GReeNHoUse");
  lcd.setCursor(1,1);
  lcd.print ("firmware v.1.0");
  delay(5000);
  lcd.clear();
  delay(1000);
  Serial.begin(9600);
}



void loop() {

  statoGalleggiante = digitalRead(galleggiante);
  int reading = digitalRead(pulsante);
  int t = dht.readTemperature();
  int h = dht.readHumidity();
  int umiditaTerreno = analogRead(sensoreUmidita);
  int livelloAcqua = analogRead(galleggiante);
  terreno = map (umiditaTerreno, 540, 0, 0, 100);
  Serial.println(umiditaTerreno, DEC);

  if (reading != lastButtonState){
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay){
      if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == HIGH && statoGalleggiante == HIGH){
      buttonPushCounter++;
      }
    }
  }

  lastButtonState = reading;

  if ( buttonPushCounter >= 4)
   {
      buttonPushCounter = 0;
   }
  

   switch ( buttonPushCounter){
    case 0:
            digitalWrite(accensioneLcd, HIGH);
            lcd.setCursor(0,0);
            lcd.print ("Umidita' Terreno: ");
            lcd.setCursor(0, 1);
            lcd.print("       ");
            lcd.setCursor(7, 1);       
            lcd.print(terreno, DEC);
            lcd.print("%      ");
            break;
 
    case 1:
            digitalWrite (accensioneLcd, HIGH);
            lcd.setCursor(0,0);
            lcd.print ("Hum. Aria: ");
            lcd.setCursor(0,1);
            lcd.print("Temperat.: ");
            lcd.setCursor(11, 0);
            lcd.print(h, DEC);
            lcd.print(" %   ");
            lcd.setCursor(11, 1);
            lcd.print(t, DEC);
            lcd.print((char)(223)); 
            lcd.print("C   ");
            break;

    case 2:
              digitalWrite (accensioneLcd, HIGH);
              if (statoVentola == 1){
              lcd.setCursor(0,0);
              lcd.print("Ventola:  ON      ");
            }
            
             if (statoVentola==0){
              lcd.setCursor(0,0);
              lcd.print("Ventola: OFF     "); 
            }
                                      
              if(statoPompa == 1){
              lcd.setCursor(0,1);
              lcd.print("Pompa:    ON      ");
              }
           
            if(statoPompa == 0){
              lcd.setCursor(0,1);
              lcd.print("Pompa: OFF      ");
              
            }
            break;
    case 3:
            digitalWrite (accensioneLcd, LOW);
            lcd.clear();
            break; 
              
 }




    
   
  if(statoGalleggiante == LOW){
    digitalWrite (pompa, HIGH);
    digitalWrite (led, HIGH);
    lcd.clear();
    digitalWrite(accensioneLcd, HIGH);
    toShow = message.substring(ii,ii+16);
    
    lcd.print(toShow);

    ii = ii + 2;

 
    if(ii>(strLength-16)) {
      
      ii = 0;
    }

  delay(500);
  }
    
   else{
    digitalWrite(led, LOW);
   }





  if (t>28){
  digitalWrite (ventola, LOW);
  statoVentola=1;
  }
  if (h>50){
    digitalWrite (ventola, LOW);
    statoVentola=1;
  }
    else if (t<=20 && h<=25){
      digitalWrite (ventola, HIGH);
      statoVentola=0;
    }
   
  if (terreno<=7 && statoGalleggiante == HIGH){
    digitalWrite (pompa, LOW);
    statoPompa=1;
  }
  else if (terreno>=30 && statoGalleggiante == HIGH){
    digitalWrite (pompa, HIGH);
    statoPompa=0;
  }


       
  }

serra.ino.ino.ino (4.6 KB)