delay per ritardare la chiusura di un contatto

Buongiorno a tutti.

Ho una parte di codice che, effettuata una operazione, poi va a settare un pin LOW.

L'operazione di cui sopra, normalmente viene eseguita e poi il contatto si deve riaprire subito dopo la sua esecuzione.

Però, c'è una situazione nella quale a seguito lancio dell'operazione, il contatto deve rimanere chiuso per più tempo, dopo che questa è stata eseguita.

Vi chiedo quindi, come risolvo questa situazione? Con un delay(tempo) nel secondo caso, prima di eseguire la chiusura del contatto o c'è un altro modo? Se tempo == 0, questa operazione di delay(0), influenza il codice? Quanto?

Grazie.

Delay(0) non ferma nulla, nel senso che dice solo di aspettare 0 ms per cui il tempo computazionale perso è pari a quello necessario a chiamare la funzione ed a ritornare da essa, infinitesimale.

Immagino tu voglia fare una cosa così:

if (condizione) {
  tempo=xx;
} else {
  tempo=0;
}
digitalWrite(PIN, LOW);
delay(tempo);
digitalWrite(PIN, HIGH);

In modo da chiudere il contatto per un tempo pari a xx se si è verificata la condizione o riaprirlo subito dopo in caso contrario.

si, cosa molto simile.

grazie :slight_smile:

mi interessava soprattutto capire cosa potesse influire il delay(0) sul codice, visto che verrà sempre eseguito quando condizione non si verifica... ma mi confermi che è assolutamente trascurabile.

Puoi anche mettere il controllo tra i 2 digitalWrite e far eseguire il delay solo se effettivamente c'è da aspettare. Cioè:

digitalWrite(PIN, LOW);
if (condizione) {
  delay(tempo);
}
digitalWrite(PIN, HIGH);

Si, il valore di delay lo imposto da un menu tramite LCD.

Potrei sicuramente eseguirlo solo se <> 0, metterlo sempre era più veloce e non dovevo scrivere l'if :grin:

GS88:
Potrei sicuramente eseguirlo solo se <> 0

Non so se vieni da una programmazione di PLC dove si usa <>, ti faccio presente che in c++ (a scanso di ammattimenti) si scrive !=.

Janos:

GS88:
Potrei sicuramente eseguirlo solo se <> 0

Non so se vieni da una programmazione di PLC dove si usa <>, ti faccio presente che in c++ (a scanso di ammattimenti) si scrive !=.

si, certo. lo so :slight_smile:

presumibilmente utilizzerò una cosa del tipo:

if(0 != timeDelay) delay(timeDelay);

Ciao.

basta fare

if (delayTime) { delay(delayTime); }

Un test su un numero diverso da zero restituisce sempre True, è come fare delayTime!=0
Se invece devi fare un test per avere True quando il numero è pari a 0, basta fare if (!delayTime) { faiqualcosa }

leo72:
basta fare

if (delayTime) { delay(delayTime); }

Un test su un numero diverso da zero restituisce sempre True, è come fare delayTime!=0
Se invece devi fare un test per avere True quando il numero è pari a 0, basta fare if (!delayTime) { faiqualcosa }

Grazie Leo :slight_smile:

Leo, scusa mi sono scordato una cosa...

Nel caso decidessi di usare l'if anzichè far SEMPRE eseguire il delay (anche nel caso di delay(0)), cosa cambia a livello di tempo macchina dedicato a processare la cosa?

Grazie.

L'if è più sbrigativa perché fai un test su una variabile. Chiamando la funzione, devi saltare alla routine del delay, eseguirla a vuoto e tornare indietro.
Sennò un'altra alternativa è fare 2 subroutine: in una ci metti il delay, nell'altra no. E' più dispendioso in termini di consumo di memoria ma così se hai problemi di situazioni time-critical sei a posto :stuck_out_tongue:

mmm attualmente ho questa situazione:

if(!cancel && startTimer) {
         if (useTimer1) go(useTimer1Time, PINS_TIMER1);
         if (useTimer2) go(useTimer2Time, PINS_TIMER2);
   
         if(timerDelay) delay(timerDelay);
}

non capisco bene come fare le due routine, considerando che il tutto va attivato dal primo if e le due condizioni devono avverarsi indipendentemente dal fatto che io voglia o meno usare un delay.