Aiuto lampeggio led con millis

Ciao a tutti, sto cercando di realizzare un circuito semplicissimo così strutturato… 2 led, 1 deviatore (o pulsante, è uguale). In condizioni normali, quindi pulsante aperto 1 led lampeggia e l’altro sta spento, quando chiudo il pulsante il led che prima lampeggiava diventa acceso fisso e il secondo led idem, si accende fisso ma dopo un piccolo intervallo dal primo. Ho già provato a scrivere il codice senza millis e nessun problema, eccolo qua:

#define LED1 13
    #define LED2 12      
    #define BUTTON 7                
    int val = 0;                  
    int vecchio_val = 0;       
    int stato = 0;                
      
    void setup() {  
      pinMode(LED1, OUTPUT);  
      pinMode(LED2, OUTPUT);  
      pinMode(BUTTON, INPUT);       
    }  
      
    void loop() {  
      val = digitalRead(BUTTON);  
      
       
      if ((val == HIGH) && (vecchio_val == LOW)){  
        stato = 1 - stato;  
        delay(15);                
      }   
      
      vecchio_val = val;            
      
        if (stato == 1) {  
        digitalWrite(LED1, HIGH);
      digitalWrite(LED2, LOW);   
        delay(500);              
        digitalWrite(LED1, LOW);
        digitalWrite(LED2, LOW);  
        delay(500);               
      }  
      else {  
        digitalWrite(LED1, HIGH);
        delay(800);
        digitalWrite(LED2, HIGH);  
      }  
    }

@pablos Il codice da Te proposto é inacettabie. O usi delay o non lo usi. Non ha senso che usi un delay(1500); combinato con un delay fatto con millis(). Riprova. Ciao Uwe

Secondo me non ha senso mescolare ritardi fatti con delay() con ritardi realizzati con millis() sopratutto se il ritardo con delay() é cosí lungo.

Vediamo cosa dicono gli altri. Ciao Uwe

Raga io vorrei un aiuto, non complicarmi la vita!!!!!!!!! ;-)

Dai su, non si può usare un minimo di sarcasmo in questo forum!!!!!!! L'ho provato adesso, intanto ovviamente (a parte gli scherzi) grazie infinite per la scrittura completa dello sketch e non di "indizi", così posso ragionare realmente sul codice e carpirne il funzionamento... In effetti è raro trovare una risposta completa al primo tentativo, anche se capisco che in effetti gli "indizi" sono stimolanti per la crescita personale di chi chiede l'aiuto... come ti dicevo l'ho appena provato, appena lanciato il led A lampeggia ed il B sta spento, come gli do l'ingresso il led A si fissa e dopo il delay si fissa anche il B. Il fatto è che pare non torni alla situazione iniziale con il rilascio del pulsante!

nytro81: Raga io vorrei un aiuto, non complicarmi la vita!!!!!!!!! ;-)

ma.... sperando di aver "capito bene" un led che lampeggia e uno spento con un interruttore che sta nella posizione aperta appena l'interruttore si chiude il led lampeggiante diventa diventa fisso e dopo un pò di tempo si accende fisso anche l'altro led, se l'interruttore viene messo nella posizione aperta si riparte da capo un led lampeggia e uno spento,

se mi dai conferma continuo

è quello che ho capito anch io.
la mia proposta:

 #define LED1 13
    #define LED2 12      
    #define BUTTON 7                
             
    int stato_button = 0;    // stato pressione pulsante
    
    unsigned long time1 = millis();     
    unsigned long time2 = millis(); 
    unsigned int lampeggio1 = 500;  // tempo per lampeggio LED 1
    unsigned int ritardo2 = 1000;     // ritardo accensione LED 2
      
    void setup() 
    {  
      pinMode(LED1, OUTPUT);  
      pinMode(LED2, OUTPUT);  
      pinMode(BUTTON, INPUT); 
      digitalWrite(LED1, HIGH);    // lampeggio incomincia con LED1 acceso
      digitalWrite(LED2, LOW);  
    }  
      
    void loop() 
    {  
      if (digitalRead(BUTTON)==1)   //Pulsante premuto
      {
        if ( stato_button == 0 )        // primo ciclo col pulsante premuto 
        {
        stato_button = 1;
        time2 = millis();                    // memorizza tempo per il ritardo
        digitalWrite(LED1, HIGH);    // accende LED1
        }
      if ( stato_button == 1 )         // accende LED2 con ritardo
        {
        if (millis() - time2 > ritardo2)  // controllo se ritardo é giá passato.
          {
          digitalWrite(LED2, HIGH);   // accende LED2
          }
        }        
      }
      else                                      // pulsante non premuto o rilasciato
      {
        if ( stato_button == 1 )       // primo ciclo con pulsante rilasciato
          {
          digitalWrite(LED2, LOW);  // spegne LED 2
          stato_button = 0;
          time1 = millis();                 // memorizza tempo per il lampeggio 
          digitalWrite(LED1, LOW);  // lampeggio parte con LED1 spento  
          }  

        if (millis() - time1 > lampeggio1)  // controllo se tempo lampeggio é passato 
          {
          digitalWrite(LED1, !digitalRead(LED1));  // inverte stato LED1
          time1 = millis();
          }      
        } 
    }

(compila senza errori con IDE0022. Non ho provgato su un Arduino.)
Ciao Uwe

uwefed: è quello che ho capito anch io. la mia proposta:

 #define LED1 13
    #define LED2 12      
    #define BUTTON 7                
             
    int stato_button = 0;    // stato pressione pulsante
    
    unsigned long time1 = millis();     
    unsigned long time2 = millis(); 
    unsigned int lampeggio1 = 500;  // tempo per lampeggio LED 1
    unsigned int ritardo2 = 1000;     // ritardo accensione LED 2
      
    void setup() 
    {  
      pinMode(LED1, OUTPUT);  
      pinMode(LED2, OUTPUT);  
      pinMode(BUTTON, INPUT); 
      digitalWrite(LED1, HIGH);    // lampeggio incomincia con LED1 acceso
      digitalWrite(LED2, LOW);  
    }  
      
    void loop() 
    {  
      if (digitalRead(BUTTON)==1)   //Pulsante premuto
      {
        if ( stato_button == 0 )        // primo ciclo col pulsante premuto 
        {
        stato_button = 1;
        time2 = millis();                    // memorizza tempo per il ritardo
        digitalWrite(LED1, HIGH);    // accende LED1
        }
      if ( stato_button == 1 )         // accende LED2 con ritardo
        {
        if (millis() - time2 > ritardo2)  // controllo se ritardo é giá passato.
          {
          digitalWrite(LED2, HIGH);   // accende LED2
          }
        }        
      }
      else                                      // pulsante non premuto o rilasciato
      {
        if ( stato_button == 1 )       // primo ciclo con pulsante rilasciato
          {
          digitalWrite(LED2, LOW);  // spegne LED 2
          stato_button = 0;
          time1 = millis();                 // memorizza tempo per il lampeggio 
          digitalWrite(LED1, LOW);  // lampeggio parte con LED1 spento  
          }  

       if (millis() - time1 > lampeggio1)  // controllo se tempo lampeggio é passato          {          digitalWrite(LED1, !digitalRead(LED1));  // inverte stato LED1          time1 = millis();          }              }    }



(compila senza errori con IDE0022. Non ho provgato su un Arduino.)
Ciao Uwe

l'ho caricato su arduino uno e funziona benissimo

Ottimo, avete capito alla perfezione, grazie mille a tutti!!!

Ma Tu hai capito come funziona il mio Sketch? Ciao Uwe

uwefed: Ma Tu hai capito come funziona il mio Sketch? Ciao Uwe

;)

Si grazie della domanda, ho letto per filo e per segno il tuo codice e penso di averlo compreso appieno, grazie mille Uwe