Sostituire i delay con i millis

Salve ragazzi, sto facendo la miniatura di una casa e ora sto programmando il cancello, dato che ho altri pin disponibili volevo sostituire i delay con i millis per poter eseguire altre operazioni senza dover freezzare niete. Ho provato ad utilizzare i millis in mille modi ma non riesco a sostituirli ai delay che ho usato per gestire il motore. Una fuzione millis è utilizzata nel programma per far blinkare il led mentre il motore è in movimento.

byte fcIndietro = 2; //pin 2 = fine corsa (indietro)
byte fcAvanti = 5; //pin 5 = fine corsa (avanti)
byte hBridge1 = 3; //pin 3 = 1A (ponte H)
byte hBridge2 = 10; //pin 4 = 2A (ponte H)
byte hBridgeEn = 9; //pin 9 = enable (ponte H)
byte fotocellula = 6; //pin 6 = fotocellula
byte ledSegnalazione = 4; //pin 4 = led di stato funzionamento cancello
int ledState = 0; // ledState used to set the LED
unsigned long previousMillis = 0; //will store last time LED was updated
unsigned long interval = 1000; //interval at which to blink (milliseconds)
void setup() {
  pinMode(fcIndietro, INPUT);
  pinMode(fcAvanti, INPUT);
  pinMode(hBridge1, OUTPUT);
  pinMode(hBridge2, OUTPUT);
  pinMode(hBridgeEn, OUTPUT);
  pinMode(fotocellula, INPUT);
  pinMode(ledSegnalazione, OUTPUT);
  //inizializzo il motore sempre spento
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, LOW);
  digitalWrite(hBridgeEn, HIGH);


  //inizializzo il Serial monitor
  Serial.begin(9600);
}

void loop() {




  if ((digitalRead(fotocellula) == HIGH) && (digitalRead(hBridge2) == HIGH)) { //se leggo che il cancello si sta chiudendo e la fotocellula viene interotta
    fermaCancello();                                                           //fermo il cancello
    digitalWrite(ledSegnalazione, LOW);
    delay(5000);                                                               //per 5 secondi
    apriCancello();                                                            //e lo faccio riaprire facendogli eseguire la funzione del finecorsa
  }

if (digitalRead(hBridge1)==HIGH){
  ledFunzionamento();
} 
if (digitalRead(hBridge2)==HIGH){
  ledFunzionamento();
} 




  if (digitalRead(fcIndietro) == HIGH) {                                       // se il cancello tocca il finecorsa (indietro)
    fermaCancello();                                                           // fermo il motore
    digitalWrite(ledSegnalazione, LOW);
    delay(10000);                                                              // attendo 10 sec.
    chiudiCancello();                                                          // chiudo camcello
    
  }
  if (digitalRead(fcAvanti) == HIGH) {                                         // se il cancello tocca il finecorsa (avanti)
    fermaCancello();                                                           // ferma motore
    digitalWrite(ledSegnalazione, LOW);
  }

  //attendi un comando dalla serial
  if ( Serial.available()) {
    byte DataRX = Serial.read();



    if (DataRX == 49) {                                                        // carattere 1 avvia il motore a SX, il cancello si apre
      apriCancello();

    }
    if (DataRX == 50) {                                                        // carattere 2 avvia il motore a DX,
      chiudiCancello();                                                        // il cancello si chiude (ad esempio se aperto a mano)

    }
    if (DataRX == 48) {

      fermaCancello();                                           // Carattere 0 ferma il motore in caso
      // di guasti o malfunzionamenti

    }
  }
}

void apriCancello() {

  digitalWrite(hBridge1, HIGH);
  digitalWrite(hBridge2, LOW);
  Serial.println("apertura");
  
  
}
void chiudiCancello() {
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, HIGH);
  Serial.println("chiusura");
}
void fermaCancello() {
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, LOW);
  Serial.println("fermo");
}
void ledFunzionamento() {

  


    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:
      ledState ^= 1;
      digitalWrite(ledSegnalazione, ledState);
    }
}

Sostituire i delay con i millis NON può essere fatto in modo semplice, ma bisogna ripensare l’intera logica del programma.
Per fare quello che vuoi, quindi, devi prendere carta e penna e scrivere IN ITALIANO quello che vuoi il progetto faccia in ogni momento. E poi partire da li usando un NUOVO programma (che possiamo aiutarti a scrivere).
Comincia a descriverci il progetto (anche solo la parte attuale) poi si vede

ok, praticamente: -in ogni fase di movimento del motore del cancello 1 led giallo lampeggia -il cancello si apre -fa scattare il finecorsa di apertura e si ferma per 10 secondi -il cancello si chiude -fa scattare il finecorsa di chiusura e si ferma del tutto

-se durante la chiusura la fotocellula viene interrotta il cancello si ferma 5 secondi per poi riaprirsi -di conseguenza scatta il finecorsa di apertura e ripete il ciclo

Ottimo! Cominciamo dalla cosa più semplice: far lampeggiare un led quando il motore é acceso. Per non saperne nulla il motore é acceso quando leggo un uscita del ponte H (o un ingresso). Quindi tutto il "cinema" di lampeggiamento led va in un if() che controlli le due uscite del ponte. E quale é il cinema? Anche se credo che in rete ci siano mari di scatch per lampeggio di led con millis() da cui prendere spunto puoi provare a fare un programma che faccia solo quello (far lampeggiare un led con millis). Poi lo legheremo al resto del progetto a tempo debito. Sai farlo?

Ormai vado di rendita :slight_smile:

si si, l'ho già fatto e funziona il lampeggiamento quando il motore è acceso

Ok. Se il lampeggio del led funziona (CON MILLIS() )passiamo alla fase due: Se sento il pulsante di apertura cancello (che sembra non possa chiuderlo) E sento il fine corsa di cancello chiuso, accendo il motore in apertura. Inoltre in continuo se sento il finecorsa di cancello chiuso spengo il motore in chiusura. Inoltre ti chiedo di mettere (se non lo hai già fatto) un blocco elettrico o meccanico (meglio) che impedisca il doppio comando del motore. Ok?