Problemi con l'uso della funzione Millis

Salve a tutti, sono uno studente dell'indirizzo di Automazione dell'Istituto Tecnico A.Meucci di Firenze e sono abbastanza nuovo nell'ambito della programmazione, ho esperienza con DEV C/C++, Algobuild e PLC e stavo costruendo un programma che mi permettesse di tenere acceso un led verde di base e dopo aver premuto 10 volte un pulsante di spegnere il led verde e di accenderne uno rosso che rimaneva acceso per 5 secondi, prima usavo il delay, ma vorrei provare ad usare la funzione millis() poiché ho letto che era una funzione che a differenza del delay() permetteva al programma di non bloccarsi. Il problema è che ora non si accende più il Led rosso mentre prima si, vorrei che qualcuno mi aiutasse a capire dove è l'errore.
P.S. So che in fondo c'è scritto delay (5000) ma non saprei come sostituire il fatto che il led rimane acceso per 5 secondi.
Grazie in anticipo. Il codice è il seguente.

const int LedR=9;
const int LedV=10;
const int Pulsante=8;
int Stato;
int StatoPrecedente;
int Contatore=0;
unsigned long Tempo;


void setup() {
 pinMode (LedV, OUTPUT);
 pinMode (LedR, OUTPUT);
 pinMode (Pulsante, INPUT);
 Serial.begin(9600);
}

void loop() 
{
digitalWrite (LedV,HIGH);
digitalWrite (LedR, LOW);
Stato = digitalRead(Pulsante);
if(Stato==LOW&&StatoPrecedente==HIGH)
{ 
Contatore=Contatore+1;
Serial.print("Tempo: ");
Tempo = millis();
Serial.print(Tempo);
}
StatoPrecedente=Stato;
if (Contatore>10){
digitalWrite (LedV,LOW);
digitalWrite (LedR,HIGH);
delay (5000);
Contatore=0;
}
}

Buongiorno e benvenuto :slight_smile: ,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (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 tutto il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (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.

Guglielmo

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:
P.P.S.: Inoltre leggi attentamente il punto 17.2 del suddetto regolamento e metti a posto anche il codice. Grazie.

Purtroppo la logica con cui si scrive un programma che usa millis() (... e che quindi NON si arresta mai) rispetto ad uno in cui si utilizza il delay() (... con consegunete arresto del programma), è TOTALMENTE diversa ...

... posso solo consigliarti di studiarti come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che ti sarà tutto più chiaro e riuscirai a scrivere il codice come si deve :wink:

Guglielmo

Inoltre con questo codice

void loop() 
{
digitalWrite (LedV,HIGH);
digitalWrite (LedR, LOW);

Il led verde resta sempre acceso.
Prima di postare il codice premi contemporaneamente, nell'ide di arduino, i tasti CTRL e T questo permette di rendere il codice più leggibile.

Ciao leonidas8899,
bella gatta da pelare è il millis. :slight_smile:
Prova a dare uno sguardo al mio post " Risolto-Problema visualizzazione con sevseg".
Ti domanderai e che chazzecca sevseg con millis?
Nulla,
però in fondo al post ce un esempio di uso del millis che poi e simile al led BilnkWithoutdelay e che potrebbe esserti utile come esempio per per far lampeggiare i tuoi led.

Ciao Lollo65