sostituzione delay con millis per comandare 6 relè

ciao ragazzi,
leggevo qui questo modo per sostiuire delay con millis per comandare l'apertura di 6 relè, tre utilizzati per avviare l'avvolgimento e tre per lo svolgimento di quelle che oramai sono le famose tende!! :slight_smile:

questo il link:https://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

ovviamente funziona, siamo passati da:

};

void svolgiTendeGRANDESX() {                       //funzione srotola tenda se chiamata durante salita ferma tenda

  digitalWrite(rele_chiude_sx, LOW);             // chiude il rele' ( LOW=Chiude, HIGH=Apre )

  delay(500);

  digitalWrite(rele_chiude_sx, HIGH); // riapre il rele'

}

a:

unsigned long previousMillis = 0; //will store last time LED was updated
unsigned long interval = 500; //interval at which to blink (milliseconds)

void svolgiTendeGRANDESX() {     
  
  
  digitalWrite(rele_apre_sx, LOW);
     Serial.println(F("low"));

   unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis; //save the last time you blinked the LED
    //if the LED is off turn it on and vice-versa:
   
   
digitalWrite(rele_apre_sx, HIGH);
Serial.println(F("high"));
}
}

con l'utilizzo di ben tre unsigned long.. che moltiplicati ad altri 5 void fa 15...quindi 18 in totale... c'è un modo alternativo per risparmiare memoria? sono a corto...

grazie

ho editato il primo post... avevo sbagliato il codice copiato...

simosere:
con l'utilizzo di ben tre unsigned long

currentMillis è una variabile unica per tutto il programma

interval può essere sostituita con una #define (non serve creare una variabile per contenere un valore che non cambia mai)

rimane solo una variabile aggiuntiva per ogni tempo da controllare

E siamo scesi a 6 variabili in tutto... 5 se si fa anche a meno di currentMillis e si chiama direttamente millis() (ma non lo farei, è sensato che ogni ciclo di programma completo abbia un solo valore di tempo attuale).

simosere:
con l'utilizzo di ben tre unsigned long.. che moltiplicati ad altri 5 void fa 15...quindi 18 in totale... c'è un modo alternativo per risparmiare memoria? sono a corto...

grazie

Se sei a corto di memoria, senza vedere tutto il programma, l'unica cosa che posso consigliarti è di "rimuovere" con una define per il debug tutta la parte di scrittura sul monitor seriale, se quando sarà operativo non ti serve la comunicazione seriale. Se in test sfori il limite di sicurezza della memoria poco importa, per pare delle prove dovresti riuscire comunque, eliminando tutta la parte della seriale risparmi abbastanza memoria.
Poi ci potrebbero essere altri miglioramenti da fare ma senza il codice è impossibile dirlo

Grazie ad entrambi!!! :slight_smile: