Ancora con delay, millis() etc.

Buongiorno, scusate.

Posto un breve codice incompleto per capirci ed arrivare alle domande:

void loop() {
  if(pin1 == HIGH)
  
  if(delayMotor) delay(delayMotor);

  digitalWrite(pin2, HIGH);
}

Meglio togliere l'if e far eseguire eventualmente un delay(0)?

Detto questo delay può assumere valori da 0 a 1000 (1sec.) nel mio caso, settati tramite menu.

Che problematiche vedete alla cosa?

Mi fareste per favore un esempio più efficiente? (durante il delay non è necessario che il micro esegua altre operazioni).

Grazie.

tra
if(delayMotor) delay(delayMotor);
e
delay(delayMotor);
nel caso particolare dello 0 non vedo molta differenza...cioè mettere o no l'if a questo punto è più una cosa del tipo "quando fra un mese andrò a vedere il programma capisco meglio con l'if o senza l'if".

leggendo l'ultima frase mi sembra che il codice sia abbastanza efficiente anche perchè sono 3 righe di codice ci sarebbe poco da ottimizzare, e poi (rispondendo a quello che hai scritto tra parentesi) durante il delay il micro non fa niente già di suo non è una cosa opzionale (non so se mi sono spiegato)

comunque aspetta anche altri pareri più professionali che non fanno mai male :slight_smile:

ps. riguardandolo direi che devi aprire la parentesi graffa dopo if(pin1 == HIGH) e chiuderla dopo digitalWrite(pin2, HIGH); se vuoi che l'if sia effettivo

No ok, il codice è li non controllato solo per avere un riferimento sul delay :slight_smile: In pratica per dare un'idea alle persone di quello che vorrei sapere.

Probabilmente si, mancano parentesi ma non le ritenevo importanti. L'importante era che il tema del delay fosse compreso.

Per 'ottimizzare' non intendevo ottimizzare le tre righe, che non sono niente. Ma, ho usato un termine inadatto, sostituire il delay() con qualcosa di più efficiente (se c'è).

se il tuo intento è far "dormire" il micro per un tot tempo prima di riprendere l'esecuzione così su due piedi non mi viene in mente un altro modo, l'unica è che se vuoi essere più preciso usi il delayMicroseconds ma non ne vedo il motivo
spero di esserti stato di aiuto

Il mio intento è quello di attendere a fare le successive operazioni se la variabile delayMotor è impostata.

Vorrei capire se usare delay (per i tempi che ho descritto, da 0 ad 1sec) oppure altro e nel caso cosa (e come).

Grazie.

a parte che il codice così scritto serve a poco (in particolare la digitalWrite), meglio l'if di delay(0) perchè eviti di salvare lo stato sullo stack etc... tutte cose relative ad una chiamata a funzione

lesto:
a parte che il codice così scritto serve a poco (in particolare la digitalWrite), meglio l'if di delay(0) perchè eviti di salvare lo stato sullo stack etc... tutte cose relative ad una chiamata a funzione

mi sta tutto bene lesto :slight_smile:

altro modo di scrivere quel delay(delayMotor) in modo non bloccante?

Grazie.

usando la millis, ora non ho tempo di scriverti il codice, se stasera sei ancora in alto mare te lo scrivo, cmq il blinkWithoutDelay è il posto giusto da cui partire

Cosa ne dici?

boolean sensor_stop(unsigned int limitTime){

  long time= millis();
  boolean result = false;

  while(!result) {

    if (millis() >= time + limitTime) result = true;   
  }
}

la while rende il codice bloccante, in pratica è come funziona internamente la millis.
certo, al contrario della millis nel while puoi mettere altro codice che vuoi, ma se poi vuoi creare differenti temporizzazioni contemporanee (per esempio ogni 3 sec. fai X, però ogni 2,7 sec fai Y e ogni pressione del tatsto fai Z) impazzisci per niente.

Al posto del while usa il loop stesso, e in pratica anzichè usare la flag a true per uscire dal ciclo e eseguire il tuo codice, usi la flag a true per eseguire il codice :slight_smile: