Usare più delay contemporaneamente

Mi spiegate gentilmente come posso utilizzare 2 daley che hanno dei compiti diversi contemporaneamente???

Se il tuo problema è comunque eseguire le due cose indipendentemente ed avere dei ritardi indipendenti, allora ... devi cambiare strategia, non usare la delay() ma usare, in modo opportuno, la millis() ...

... studiati prima QUESTO articolo di Leo, dopo di che studiati QUESTO altro.

Guglielmo

Fabio, benvenuto. :) Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0 e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0 - qui una serie di schede by xxxPighi per i collegamenti vari: http://forum.arduino.cc/index.php?topic=146152.0 - qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0 - qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

Grazie a tutti per avermi risposto così velocemente... Però non ho capito ad esempio come faccio a creare un semaforo con il millis().

Non puoi avere 2 delay contemporaneaente. Un delay blocca Arduino per il tempo definito. Usa millis() come descritto nel esempio "wait without delay" allegato al IDE. Ciao Uwe

Si che si puó utilizzare 2 delay per svolgere mansioni diverse…
Con il ciclo for ho sperimentato questa cosa…

for (int i =0, i <10 , i++ )
{
digitalWrite (led, HIGH);
delay (500);
digitalWrite (led, LOW);
delay (500);
}

Quindi otteniamo un lampeggio di un led per circa 10 secondi
Un deley é usato per il ritardo del led fra spento e acceso.
Il ritardo intrinsego é il numero di volte con la quale impostiamo un ciclo for
Percio 500+500 =1000 *10 volte =10000=lampeggio per 10 secondi

@alessiomariucci adesso prova a far lampeggiare un LED per 10 secondi 2 volte al secondo e l' altro per 20 secondi 3 volte. Ciao Uwe

@ alessiomariucci : ma ti pare che se era così banale gli rispondevamo in quel modo ???

Guglielmo

fabio22: Grazie a tutti per avermi risposto così velocemente... Però non ho capito ad esempio come faccio a creare un semaforo con il millis().

Se hai letto attentamente i due link che ti ho messo, dovresti aver capito che il trucco è creare delle temporizzazioni NON bloccanti usando delle strutture del tipo :

if(millis() - myPreviousMillis > myInterval) {
  ...
  cose da fare allo scadere del periodo voluto
  ...
}

All'inizio non è semplice ... devi ricordare che sei in un LOOP infinito (la funzione loop()) e quindi, in continuazione giri e incontri condizioni di questo tipo con cui scheduli degli eventi.

Quei due articoli che ti ho messo prima ... non vanno solo letti ... vanno studiati e capiti passo passo XD XD XD

Guglielmo

alessiomariucci: Quindi otteniamo un lampeggio di un led per circa 10 secondi Un deley é usato per il ritardo del led fra spento e acceso. Il ritardo intrinsego é il numero di volte con la quale impostiamo un ciclo for Percio 500+500 =1000 *10 volte =10000=lampeggio per 10 secondi

Madame Ada Lovelace si sta rivoltando nella tomba... :roll_eyes:

leo72: Madame Ada Lovelace si sta rivoltando nella tomba... :roll_eyes:

Donna GENIALE ... ti rendi conto che il prossimo anno è il bicentenario della sua nascita (1815) ??? Questa, 200 anni fa ... già teorizzava di algoritmi e macchine di calcolo ...

... "chapeau !" !!!

Guglielmo

Chissà perché gente del genere non nasce più! :sweat_smile: Ieri a Firenze hanno festeggiato i 450 anni dalla morte di Michelangelo Buonarroti, altro personaggio leggermente famoso 8)

Ad esempio ragazzi come si può creare un semafero con millis()

Io lo fatto con il daley in questo modo:

void setup() {

 pinMode(8,OUTPUT); 
 pinMode(10,OUTPUT);
 pinMode(9,OUTPUT);

  }

void loop() {
   

  delay (2000) ;
     digitalWrite (8, HIGH); // LED ROSSO
    digitalWrite (9, LOW); // led VERDE
    digitalWrite (10, LOW); // led GIALLO 
     

 delay (2000) ;
     digitalWrite (8, LOW); // led rosso
     digitalWrite (9, HIGH); // led vede
    digitalWrite (10, LOW); // led rosso
    
    
    

 delay (1000) ;
     digitalWrite (8, LOW); // led rosso
     digitalWrite (9, HIGH); // led vede
    digitalWrite (10, HIGH); // led rosso
    
    delay (00);
  
    }

edit by mod: per favore includi il codice usando gli appositi tag code

Scusa Fabio ma ... li hai STUDIATI i link che ti ho dato in QUESTO post ??? :astonished: :astonished: :astonished:

Perché dalla domanda sembra che tu non li abbia neanche guardati ... :roll_eyes:

Guglielmo

fabio22: Gli ho dato una fatta lettura

Ehhhh ??? :astonished: :astonished: :astonished:

Guglielmo

Ad esempio in questo codice lui mi dovrebbe far lampeggiare prima il led(13) e dopo il led(12) alternandosi continuamente…

int led_b, led_r, led_v,led_c, time1, time;
  boolean v, r, b;
 
  void setup(){
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  led_b = millis();
  led_r = millis();
  led_v = millis();
  led_c=millis();
  v = false;
  r = false;
  b = false;
  }
   
  void loop (){
  time = millis();
  time1 = millis();
  verde();

  blu();
  }
 
  void verde() {
  if((led_v+1000)<time){
  digitalWrite(13,HIGH);
  if ((led_v+2000)<time){
    digitalWrite(13,LOW);
  led_v = millis();
  }
  }
  }
 


 
void blu() {
if((led_b+2000)<time1){
digitalWrite(12,HIGH);
if((led_b+3000)<time1){
digitalWrite(12,LOW);
led_b = millis();
}
}
}

Però ho notato dopo che si accende il led(13) e dopo il led(12) si accendono contemporaneamente per dopo ricominciare da capo… Come mai?

Fabio, perdona ... ... spiega esattamente, step-by-step, quello che vorresti veder funzionare e poi proviamo a scrivere un codice ... decente ... XD XD XD

Guglielmo

Intanto la ringrazio per la sua pazienza... Allora io vorrei far lampeggiare 2 led uno al contrario dell'altro

Per "uno al contrario dell'altro" ... intendi che quando uno è acceso l'altro è spento ??? Perché questo è banale e non vedo l'uso di due rami di controllo separati ... :roll_eyes:

Guglielmo

Mi potrebbe far vedere il codice come deve essere per capire sta cavolo di funzione che ancora non lo potuta capire…