Aiuto su Millis, attivare un relè per un determinato periodo.

Salve a tutti, rispolvero nozioni di programmazione dopo svariati anni..... premetto che ho guardato molti tutorial e alla fine vedendo l esempio blink senza delay dell ide di aarduino, sono arrivato a questo punto. Devo accendere un relè per un certo tempo dopo che si è verificata una particolare condizione, in pratica misuro l umidità di un sensore e se si verifica una condizione parte per 5 secondi, il problema è che viene eseguita solo una volta nonostante sia nel loop, come se si inceppasse da qualche parte. vorrei capire se ci sono errori logici, il codice è questo:

humid = analogRead(A1Pin); //FUNZIONE CON MILLIS
 humid = (1023-humid)*100/1023;

unsigned long currentMillis = millis(); 
if (humid<=humidmin) 
        {
          if (currentMillis - previousMillis >= interval) {
   
   previousMillis = currentMillis;
        if (rele1state == HIGH) {
          rele1state == LOW;  }
        else
        { rele1state == HIGH;
          
        }

    digitalWrite(rele1,rele1state);    
 
  } }

questo codice sta in una funzione che mi serve per stampare un menu in un lcd e navigare tra le varie voci. In pratica funziona bene, si attiva per 5 secondi, ma successivamente è come se non facesse più il controllo dell umidità

Ciao, essendo il tuo primo post, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, edita (in basso a destra del post, bottone More -> Modify) il tuo post e racchiudi il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.

Guglielmo

Posta lo sketch intero.

scusate, corretto subito....

la funzione è questa

void mainMenu() {

humid = analogRead(A1Pin); //FUNZIONE CON MILLIS
  humid = (1023-humid)*100/1023;

unsigned long currentMillis = millis(); 
if (humid<=humidmin) 
         {
           if (currentMillis - previousMillis >= interval) {
    // salvo l'ultima volta che ho aperto l elttrovalvola
    previousMillis = currentMillis;
         if (rele1state == HIGH) {
           rele1state == LOW;  }
         else
         { rele1state == HIGH;
           
         }
 
     digitalWrite(rele1,rele1state);    
  
   } }

  
  //State = 0 every loop cycle.
  int state = 0;
  //Refresh the button pressed.
  x = analogRead (0);
  //Set the Row 0, Col 0 position.
  lcd.setCursor(0,0);
 
  //Check analog values from LCD Keypad Shield 
  if (x < 50) {
    //Right
  } else if (x < 200) {
   //Up
    state = 1;
  } else if (x < 400){
   //Down
    state = 2;
  } else if (x < 600){
    //Left
  } else if (x < 800){
    //Select
    state = 3;
  }


 
  //If we are out of bounds on th menu then reset it.
  if (currentMenuItem < 0 || currentMenuItem > 4) {
   currentMenuItem = 0; 
  }
 
   //If we have changed Index, saves re-draws.
   if (state != lastState) {
      if (state == 1) {
         //If Up
          currentMenuItem = currentMenuItem - 1; 
          displayMenu(currentMenuItem);
      } else if (state == 2) {
         //If Down
          currentMenuItem = currentMenuItem + 1;  
          displayMenu(currentMenuItem);
      } else if (state == 3) {
         //If Selected
         selectMenu(currentMenuItem); 
      }
      //Save the last State to compare.
      lastState = state;
   } 
   //Small delay
  delay(3);

 controllo=read_button(adc_key_in);
 
 if ((currentMenuItem==3) && (controllo==btnSELECT))  
   {
    //Select
 
        
    digitalWrite (rele1, LOW);// APRO L ELETTROVALVOLA
        clearPrintTitle();
        Stato_Irrigazione();//Stampa lo stato del relè Aggiornato
        delay(3000);
        digitalWrite (rele1, HIGH);
        clearPrintTitle();
        Stato_Irrigazione();//Stampa lo stato del relè Aggiornato}
       
     }   



}

Ho chiesto lo sketch, non la funzione...

#include <LiquidCrystal.h>
#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 11



//ricerca bottone premuto
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

#define rele1 3
// Initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int adc_key_in;
int i=0; //variabile per contatore
unsigned long previousMillis = 0; 
const long interval = 5000;
int rele1state=HIGH;
//States for the menu.
int currentMenuItem = 0;
int lastState = 0;
int temp;//variabile per la temperatura
int controllo;
int x;
float humid;// variabili per sensore umidità terreno
float humidmax = 75.00;
float humidmin = 35.00;
int A1Pin = 1;

void setup() {
 
  
   //Set the characters and column numbers.
   lcd.begin(16, 2);
   pinMode(rele1, OUTPUT);  //imposto il pin 3 (primo rele) in uscita
   
   //Print default title.
   clearPrintTitle();
}
void loop() {


//Call the main menu.
  mainMenu();
  
 }
void mainMenu() {

humid = analogRead(A1Pin); //FUNZIONE CON MILLIS
  humid = (1023-humid)*100/1023;

unsigned long currentMillis = millis(); 
if (humid<=humidmin) 
         {
           if (currentMillis - previousMillis >= interval) {
    // salvo l'ultima volta che ho aperto l elttrovalvola
    previousMillis = currentMillis;
         if (rele1state == HIGH) {
           rele1state == LOW;  }
         else
         { rele1state == HIGH;
           
         }
 
     digitalWrite(rele1,rele1state);    
  
   } }

  
  //State = 0 every loop cycle.
  int state = 0;
  //Refresh the button pressed.
  x = analogRead (0);
  //Set the Row 0, Col 0 position.
  lcd.setCursor(0,0);
 
  //Check analog values from LCD Keypad Shield 
  if (x < 50) {
    //Right
  } else if (x < 200) {
   //Up
    state = 1;
  } else if (x < 400){
   //Down
    state = 2;
  } else if (x < 600){
    //Left
  } else if (x < 800){
    //Select
    state = 3;
  }


 
  //If we are out of bounds on th menu then reset it.
  if (currentMenuItem < 0 || currentMenuItem > 4) {
   currentMenuItem = 0; 
  }
 
   //If we have changed Index, saves re-draws.
   if (state != lastState) {
      if (state == 1) {
         //If Up
          currentMenuItem = currentMenuItem - 1; 
          displayMenu(currentMenuItem);
      } else if (state == 2) {
         //If Down
          currentMenuItem = currentMenuItem + 1;  
          displayMenu(currentMenuItem);
      } else if (state == 3) {
         //If Selected
         selectMenu(currentMenuItem); 
      }
      //Save the last State to compare.
      lastState = state;
   } 
   //Small delay
  delay(3);

 controllo=read_button(adc_key_in);
 
 if ((currentMenuItem==3) && (controllo==btnSELECT))  
   {
    //Select
 
        
    digitalWrite (rele1, LOW);// APRO L ELETTROVALVOLA
        clearPrintTitle();
        Stato_Irrigazione();//Stampa lo stato del relè Aggiornato
        delay(3000);
        digitalWrite (rele1, HIGH);
        clearPrintTitle();
        Stato_Irrigazione();//Stampa lo stato del relè Aggiornato}
       
     }   



}
void Stato_Irrigazione(){
  
if ((digitalRead (rele1) == HIGH))
    { lcd.print ("->IrrigazioneOFF"); }
  else
    { lcd.print ("->Irrigazione ON");}
  }
 int read_button(int adc_key_in)
 {adc_key_in = analogRead(0);
 
 if (adc_key_in > 1000) return btnNONE;
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT;
 if (adc_key_in < 790)  return btnSELECT;   
 }
//Display Menu Option based on Index.
int displayMenu(int x) {
  
     switch (x) {
      case 1:
          
      clearPrintTitle();
temp = DHT.read(DHT11_PIN);      // LEGGI IL VALORE DEL SENSORE
        lcd.print ("->Temperatura");
        lcd.setCursor(14, 1);
        lcd.println(DHT.temperature,1);
           
         break;
         
      
      case 2:
        clearPrintTitle();
        lcd.print ("->Umidita' ");
        break;
       case 3:
        clearPrintTitle();
        Stato_Irrigazione();
        break;   
        
      case 4:
        clearPrintTitle();
        lcd.print ("->Luce");
        break;
    }
}
 
//Print a basic header on Row 1.
void clearPrintTitle() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" Serra Peppe ");
  lcd.setCursor(0,1); 
  }
 
//Show the selection on Screen.
int selectMenu(int x) {   
   switch (x) {
      
       case 2:
       lcd.setCursor(0, 0);
        lcd.print("Serra");
        lcd.setCursor(5, 0);
        lcd.print("(%)");
        lcd.setCursor(9, 0);
        lcd.println(DHT.humidity,1);
        lcd.setCursor(0, 1);
        lcd.print("Terra");
        lcd.setCursor(5, 1);
        lcd.print("(%)");
        lcd.setCursor(9, 1);
        lcd.print(humid);
        
        break;
          
    }
}

trovato l arcano....

 if (rele1state == HIGH) {
           rele1state == LOW;  }
         else
         { rele1state == HIGH;
           
         }

ho messo un = di troppo nell'assegnare un valore alto o basso a rele1state, grazie comunque