Però non capisco cosa sbaglio, se creo il blink senza pulsate è tutto ok, il led lampeggia, ma e inserisco un pulsate, ottengo che il led resta fisso, mentre secondo me dovrebbe lampeggiare, non capisco perchè non lo fa cosa sbaglio?
Ho fatto anche la prova con 2 led, così da vedere un led che lampeggia ed uno che viene comandato dal pulsante, questo fa solo on ed off senza lampeggio.
Vi allego il link di tinkercad, ovviamente ho fatto la prova su Arduino con basetta di prova ed ottengo lo stesso effetto, anche il led che emette pochissima luce (quello sotto pulsante), mentre l'altro fa una luce normale.
Rispetto allo sketch postato in precedenza, nel simulatore ho spostato il delay dopo la pressione del pulsante prima del cambio statoP, aumentandolo a 100ms
Ho sostituito while con if, ma sempre lo stesso risultato ottengo
Inoltre ho creato due variabili per il tempo, una per ogni led, sperando di risolvere, ma nulla non lampeggia il led2, ne con la sua variabile tempo, ne con quella in comune all'altro led
In pratica vorrei creare un lampeggio del led indipendente dal pulsante (quello chiamato led), poi un secondo led, led2, che dovrebbe lampeggiare comandato dal pulsante, quindi premo il pulsante e inizia il lampeggio del led2 finché non ripremo per spegnere.
Invece led2 rimane o spento o acceso fisso.
Ciao, sto cercando di capire meglio come funziona millis(), la mia idea era questa:
un led lampeggia sempre, il secondo deve lampeggiare quando premo il pulsante e spegnersi quando lo ripremo (il pulsante deve avere uno stato).
Volevo solo capire come fare, a prescindere se devono avere la stessa cadenza o no, se ho capito bene se uso dt, t0 e stato per entrambi dovrebbero avere la stessa frequenza di lampeggio, viceversa se aggiungo altre due variabili per millis(), quindi dt1 e t1 posso avere due lampeggi indipendenti ovviamente dovrei aggiungere anche una seconda variabile stato per il secondo led.
Correggimi se sbaglio.
Non capisco però perchè sotto pulsante non avviene il lampeggio, non capisco dove sbaglio.
Fai una funzione che seleziona lo stato e un'altra che accende e spegne il LED ogni volta che è trascorso il tempo dipendente dallo stato. Nel loop ci saranno solo queste due funzioni.
A quel punto puoi facilmente fare le verifiche opportune per stabilire dov'è l'errore, per esempio forzando lo stato a un valore fisso, oppure facendo in modo che il LED non lampeggi, ma si accenda o si spenga a ogni pressione del tasto.
Potresti anche fare due o tre funzioni diverse per il pilotaggio del LED, che possono anche avere lo stesso nome mettendo come commento quelle disattivate.
il secondo deve lampeggiare quando premo il pulsante e spegnersi quando lo ripremo (il pulsante deve avere uno stato).
Esatto ci sono due diverse fasi di funzionamento, e il pulsante fa passare da una all'altra.
Non capisco però perchè sotto pulsante non avviene il lampeggio, non capisco dove sbaglio.
Il cambio di stato avviene, ma poi se rilasci il pulsante la parte di codice che dovrebbe controllare il timeout per il lampeggio del secondo led non viene più eseguita, perché è scritta dentro l'if del pulsante.
Grazie ragazzi, seguendo i vostri consigli ho capito l'errore, almeno spero
Ho riscritto da zero il codice seguendo i consigli ed adesso funziona, quindi credo di averlo scritto in maniera corretta oppure ho avuto fortuna
Ho inserito led3, per capire pure la differenza di funzione con e senza else, in pratica il led3 rimane all'ultimo stato che ha alla pressione del pulsante, mentre led2 essendo dentro else ritorna in LOW.
Sì... else (statoP == LOW); non significa nulla. Basta else, dato che LOW è l'unica alternativa.
Poi, in caso di else, led3 rimane paralizzato...
Anche quel delay(300) è veramente brutto... Se proprio vuoi fare l'antirimbalzo software, prendi il tempo in uint32_t t_antirimb e leggi il pulsante solo se millis()-t_antirimb è maggiore di 300ms.