BlinkWithoutDelay con interruttore o pulsante

salve a tutti, la mia terza domanda..

se faccio partire lo sketch di BlinkWithoutDelay parte con il led spento per 1 secondo (i secondi ora sono 5),

qualsiasi sistema provo per farlo partire non dopo il reset ma con interruttore o pulsante con Buttonstate, arduino non conta i primi 5 secondi (led spento), ma parte a led acceso o con meno secondi, dipende quando inserisco l'interruttore.

in realtà questo sketch é un esempio delle mille prove fatte, diverso da quello mio, ma rispecchia a ciò che mi serve. in pratica mi serve far partire BlinkWithoutDelay esattamente come parte lui (e così come é) da reset (led spento per 5 secondi) ma con comando esterno. grazie

const int ledPin =  13;   
int ledState = LOW;             
long previousMillis = 0;         
int start = 10;        //aggiunto questa
long interval = 5000;   

void setup() {
  pinMode(10, INPUT);     //aggiunto questa
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
    start = digitalRead (10); //aggiunto questa

if ( start==HIGH) {          //aggiunto questa
    unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval) {
     previousMillis = currentMillis;   

 if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;


    digitalWrite(ledPin, ledState);
  }
}              //aggiunto questa
}

Non ho capito. Ma vuoi farlo partire dopo 5 secondi in ogni caso oppure solo se viene premuto il pulsante? Mi spiego. L'Arduino viene acceso. Il codice aspetta 5 secondi e poi fa partire il lampeggio. Se l'utente preme il pulsante prima dei 5 secondi, il lampeggio inizia prima. Oppure il lampeggio non deve iniziare finché l'utente non ha premuto il pulsante?

E se lo ripreme che deve succedere?

i millis mi stanno facendo impazzire, ho provato anche con secTimer e swrtc, metro.

do alimentazione ad Arduino e non deve succedere nulla, pigio i pulsante e BlinkWithoutDelay deve iniziare a contare i 5 secondi (come fa in origine) per poi accendere il led,

se pigio il pulsante mentre sta contando, deve ripartire da zero a ricontare i 5 secondi per poi accendere il led.

una volta che ho capito questo, posso continuare a sviluppare lo sketch :)

#define STARTBUTTON (const byte)10
#define LEDPIN (const byte)13

int ledState = LOW;             
unsigned long previousMillis = 0;         
boolean start = LOW;
boolean active = 0;
unsigned long interval = 1000;   
unsigned long previousTimer = 0;     
unsigned long timerInterval = 5000;

void setup() {
  pinMode(STARTBUTTON, INPUT);
  pinMode(LEDPIN, OUTPUT);      
}


void loop()
{
  unsigned long currentMillis = millis();
  start = digitalRead (STARTBUTTON);
  delay(10); // debounce

  if (start == HIGH){
    previousTimer = currentMillis;
  }

  if(currentMillis - previousTimer > timerInterval) {
    active = 1;
    previousMillis = currentMillis;
    ledState = LOW; 
  }
  else{
    active = 0;  
  }

  if (active == 1) {
    if(currentMillis - previousMillis > interval) {
      previousMillis = currentMillis;   
      ledState != ledState;
    }
  }
  else{
    ledState = LOW;  
  }

  digitalWrite(LEDPIN, ledState);
}

E' ancora da perfezionare perché dopo 5 secondi premuto o non premuto il blinck parte, ma è un inizio. Devi sfruttare una seconda variabile di stato associata al pulsante, forse ne serve anche una terza. :(

scusa il ritardo lo sketch non funziona e comunque per il momento ho rinunciato :sleeping:

Prova un pò così?

const int ledPin =  13;   
int ledState = LOW;
long previousMillis = 0;         
const int startPin = 10;        //aggiunto questa
long interval = 5000;   
boolean start = false;

void setup() {
  pinMode(startPin, INPUT);     //aggiunto questa
  pinMode(ledPin, OUTPUT);      
  digitalWrite(ledPin, ledState);
}

void loop()
{
if (start==false){
    start = digitalRead (startPin); //aggiunto questa
}
else {          //aggiunto questa
unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval) {
     previousMillis = currentMillis;   

 if (ledState == LOW)
      ledState = HIGH;
 else
      ledState = LOW;


    digitalWrite(ledPin, ledState);
  }
}              //aggiunto questa
}

Scusa ma non ho la possibilità di testarlo ora