[RISOLTO]come bloccare il lampeggio di un led?

Io devo bloccare il lampeggio di un led con un pulsante facendolo rimanere nello stato in cui è e quando mollo il pulsante riprende da dove è stato bloccato con il lampeggio.

questo è il codice:

int led = 5;
int Pulsante = 7;
unsigned long tempo;                // memorizza il tempo da quando Arduino è stato avviato
unsigned long lampeggio_time = 0;   // memorizza il tempo alla fine di ogni ciclo di lampeggio
unsigned long lampeggio_due = 0;
unsigned long lampeggio_uno = 0;
unsigned long lampeggio_two = 0;
unsigned long lampeggio_tre = 0;
boolean Puls = LOW;

int tempo_high=5000;     // tempo in millisecondi in cui il led deve rimanere acceso
int tempo_low=3000;     // tempo in millisecondi in cui il led deve rimanere spento

void setup() 
{ 
 pinMode(led, OUTPUT);
 pinMode(Pulsante, INPUT);

}

void loop(){
 
  Puls = digitalRead(Pulsante);
  tempo=millis();              //memorizza i millisecondi nella variabile tempo
  
   if(tempo>lampeggio_time+tempo_low){
    digitalWrite(led, HIGH);
   }else {
     lampeggio_uno=millis();
     if(Puls == HIGH){
      digitalWrite(led, HIGH);
       lampeggio_due=millis();
     }else {
       if(Puls == LOW){
       (tempo>lampeggio_due+(lampeggio_uno-tempo_low));
       }
     } 
   }
   if(tempo>lampeggio_time+(tempo_low+tempo_high)){
    digitalWrite(led, LOW);    
    lampeggio_time=millis();
   }else {
     lampeggio_tre=millis();
     if(Puls == HIGH and (led, LOW)){
       digitalWrite(led, LOW);
       lampeggio_two=millis();
       (tempo>lampeggio_two+(lampeggio_tre-(tempo_low+tempo_high)));
     }
   }
}

per favore aiutatemi che non riesco a farlo
Grazie Lpasi

Buonasera,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag:

[code] _il _tuo_ codice_ [/code]

così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo.

Grazie, purtroppo nella foga del momento ho dimenticato le buone maniere.
Ho prontamente rimediato.
Scusa ancora.

Adesso potranno rispondermi??

Lpasi:
Io devo bloccare il lampeggio di un led con un pulsante facendolo rimanere nello stato in cui è e quando mollo il pulsante riprende da dove è stato bloccato con il lampeggio.

In che senso devi bloccarlo ? Non si capisce nulla.

Tu hai un led che lampeggia con tempo acceso e tempo spento diversi ?
Almeno questo è quello che capisco io. Il pulsante serve solo a bloccare ?
Se si, allora cancella tutto, fai solo il codice del lampeggio con millis() e poi ....
un bel ciclo while() che fa nulla finchè il tasto è premuto (ovvero digitalRead() del pulsante ==HIGH)

while(digitalRead(Pulsante)==HIGH) { delay(10); }

Per il lampeggio, parti dall'esempio BlinkWithoutDelay.

io ho un led che lampeggia 5 secondi acceso e 3 secondi spento, io devo metterlo in pausa il tempo e bloccare il led nello stato in cui è poi al rilascio del pulsante il led riprende a lampeggiare da dove è stato bloccato e il tempo riparte.
Adesso si capisce meglio?

nid69ita:
Non si capisce nulla. Tu hai un led che lampeggia con tempo acceso e tempo spento diversi ?
Almeno questo è quello che capisco io. Il pulsante serve solo a bloccare ?

Il codice che hai sotto mano è molto confusionario, ci sono alcune istruzioni che non servono a nulla Es.

(tempo>lampeggio_due+(lampeggio_uno-tempo_low));

Poi le verifiche effettuate con tempo (che contiene millis() ) possono essere migliorate, così come sono si prestano a problemi se l'apparata resta acceso abbastanza per far andare in overflow il valore restituito da millis, ti consiglio di dare un occhio qui per capire come scriverlo meglio.
Se posso suggerire ti direi di ripartire da zero con la stesura del codice, limitandoti a far lampeggiare il led come hai descritto tu (5 secondi acceso, 3 spento) giocando però con solo tre variabili, una che ti indica lo stato del led (acceso o spento) una che ti indica quando è stato acceso (millis) e infine la terza che contiene quanto dovrà stare in quello stato (quando passi da acceso a spento e viceversa aggiornerai il suo valore di conseguenza)
Ignorando per il momento la necessità di mettere in pausa il tempo per mezzo del pulsante.
Quando nel loop avrai ottenuto il risultato voluto allora aggiungere il pulsante che "mette in pausa" non sarà difficile (si tratterà di memorizzare un nuovo tempo e poi farne la differenza al rilascio)

Grazie per il link, ho provato a rifarlo

eccolo:

int led = 5;
int Pulsante = 7;
unsigned long tempo;                // memorizza il tempo da quando Arduino è stato avviato
unsigned long lampeggio_time = 0;   // memorizza il tempo alla fine di ogni ciclo di lampeggio
boolean Puls = LOW;

int tempo_high=5000;     // tempo in millisecondi in cui il led deve rimanere acceso
int tempo_low=3000;     // tempo in millisecondi in cui il led deve rimanere spento

void setup() 
{ 
  pinMode(led, OUTPUT);
  pinMode(Pulsante, INPUT);

}

void loop(){
  
   Puls = digitalRead(Pulsante);
   tempo=millis();              //memorizza i millisecondi nella variabile tempo
   
    if(tempo>lampeggio_time+tempo_low){
     digitalWrite(led, HIGH);
    }
    if(tempo>lampeggio_time+(tempo_low+tempo_high)){
     digitalWrite(led, LOW);    
     lampeggio_time=millis();
    }
}

può andare bene così?
mi manca solo il passaggio del pulsante che non ho capito come fare

Lpasi:
può andare bene così?

Ti funziona ? Fa il lampeggio 5 sec acceso e 3 sec spento ?

E aggiungo, le condizioni deli due if che controllano lo scorrere del tempo non sono ancora corrette "formalmente"; nell'articolo che ho linkato specifica che occorre usare un'altra forma per scongiurare il problema owerflow, dedicaci un po' più di tempo per studiarlo al meglio, tanto millis e lo scorrere del tempo e come gestirlo ti servirà nel 90% dei casi su ogni progetto quindi è bene impararne la logica bene fin dai primi progetti

posso consigliarti di provare questo?

#define LED 13
#define PULSANTE 7
unsigned long tempo; // memorizza il tempo da quando Arduino è stato avviato
unsigned long aggiunto; // memorizza il tempo aggiuntivo del pulsante
unsigned long totale; // il tempo totale tra durata stato attuale e attesa pulsante
boolean puls; // stato pulsante
boolean stato; //stato precedente pulsante
boolean statoled; // stato attuale del led
#define ACCESO 5000 // tempo in millisecondi in cui il led deve rimanere acceso
#define SPENTO 2500 // tempo in millisecondi in cui il led deve rimanere spento

void setup()
{
   pinMode(LED, OUTPUT);
   pinMode(PULSANTE, INPUT_PULLUP);
}

void loop()
{
   puls = !digitalRead(PULSANTE);

   if (stato != puls)
   {
      stato = puls;

      // premuto o rilasciato il pulsante
      if (stato)
      {
         //premuto
         aggiunto = millis();
      }
      else
      {
         //rilasciato
         totale = totale + millis() - aggiunto;
      }
   }

   if (!stato)
   {
      // solo se il pulsante non è premuto
      if (statoled)
      {
         // led acceso
         //conttrollo se lo devo spegnere
         if (millis() - tempo > totale)
         {
            tempo = millis();
            statoled = 0;
            totale = SPENTO;
         }
      }
      else
      {
         // led spento
         // controllo se lo devo accendere
         if (millis() - tempo > totale)
         {
            tempo = millis();
            statoled = 1;
            totale = ACCESO;
         }
      }
   }

   if (stato)
   {
      digitalWrite(LED, statoled * ((millis() / 100) % 2));
   }
   else
   {
      digitalWrite(LED, statoled);
   }
}

è scritto per pulsanti in input-pullup, devi metterlo a massa non al più

la ragione dovrebbe essere evidente

non è bloccante, come si vede provando a tenere premuto il pulsante durante l'accensione:
il led invece di stare acceso lampeggia velocemente, a dimostrare che il programma non è bloccante

se non ti è chiaro qualcosa chiedi

nid69ita:
Ti funziona ? Fa il lampeggio 5 sec acceso e 3 sec spento ?

Si si funziona, mi manca solo aggiungere la parte del pulsante.

¿?

Non capisco

C1P8:
Non capisco

Cosa non capisci?

Al post numero 4 cosa ti ho scritto ?

nid69ita:

while(digitalRead(Pulsante)==HIGH) { delay(10); }

Dove devo metterlo nel codice?

io ho provato così:

int led = 5;
int Pulsante = 7;
unsigned long tempo;                // memorizza il tempo da quando Arduino è stato avviato
unsigned long lampeggio_time = 0;   // memorizza il tempo alla fine di ogni ciclo di lampeggio
boolean Puls = LOW;

int tempo_high=5000;     // tempo in millisecondi in cui il led deve rimanere acceso
int tempo_low=3000;     // tempo in millisecondi in cui il led deve rimanere spento

void setup() 
{ 
  pinMode(led, OUTPUT);
  pinMode(Pulsante, INPUT);

}

void loop(){
  
   Puls = digitalRead(Pulsante);
   tempo=millis();              //memorizza i millisecondi nella variabile tempo
   
    if(tempo>lampeggio_time+tempo_low){
     digitalWrite(led, HIGH);
    }
    if(tempo-tempo_low>lampeggio_time+tempo_high){
     digitalWrite(led, LOW);    
     lampeggio_time=millis();
    }
    while(digitalRead(Pulsante)==HIGH) { 
      delay(10); 
    }
}

solo che non funziona come dovrebbe.
cosa dovrei sistemare per farlo funzionare?

Sei sulla strada sbagliata, ripeto il suggerimento del post #6, concentrati sul risucir a far lampeggiare il led con due tempistiche differenti, quando sei riuscito a fare quello, e solo quando quella fuzionalità sia corretta al 100% (ovvero tempistiche rispettate e codice scritto in modo corretto potrai implementare la parte del pulsante. Per come la vedo io tentrar di mettr pezze ad un codice errato senza comprendere cosa succeda e cosa faccia il programma non porta da nessuna parte.

Lpasi:
Dove devo metterlo nel codice?

Al posto della tua riga Puls = digitalRead(Pulsante);
Per me poi funzionerà, non saprei altrimenti cosa intendi con non funziona come dovrebbe.
Quando tieni premuto il tasto Arduino si blocca, quando lo rilasci riprende da dove era.
Io l'ho provato ma non con il tuo codice

Poi, il programma funzionerà, ma ... ha parecchi difetti, primo tra tutti, come ti ha detto fabpolli, il come calcoli le if del tempo

Partiamo da BlinkWithoutDelay esempio ufficiale, lampeggio ogni 3 secondi e con il calcolo dei tempi usando millis() corretti (no problema overflow):

int ledState = LOW;
unsigned long previousMillis = 0;
unsigned long interval = 3000;
const byte pinLed = 5;
const byte pinPulsante = 7;
void setup() 
{ pinMode(pinLed, OUTPUT);
  pinMode(pinPulsante,INPUT);
}
void loop() 
{ unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) 
  { previousMillis = currentMillis;
    if (ledState == LOW) 
    { ledState = HIGH;  
    } 
    else 
    { ledState = LOW;  
    }
    digitalWrite(pinLed, ledState);
  }
}

Qui però c'e' un solo intervallo, 3000=3 sec quindi dobbiamo variarlo a 5000 quando accendi e rimetterlo a 3000 quando spegni, posto ora solo la loop:

void loop()
{ unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  { previousMillis = currentMillis;
    if (ledState == LOW)
    { ledState = HIGH; 
      interval=5000;
    }
    else
    { ledState = LOW; 
      interval=3000;
    }
    digitalWrite(pinLed, ledState);
  }
}