Aggiungendo quella riga prima dell'ultima graffa che chiude la loop, dovrebbe bloccarsi quando tieni premuto.
Quando rilasci, da verificare, perchè la millis() comunque ha continuato ad aumentare.
Se poi però il pulsante quando premuto deve tenere conto del tempo passato allora invece di quel while() se premi pulsante, aggiorni il tempo (memorizzato in previousMillis ) ed esci:
void loop()
{ if(digitalRead(pinPulsante)==HIGH)
{ previousMillis = millis(); // tiene conto del tempo passato
return; // esce senza fare il codice scritto qui sotto
}
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);
}
}
C1P8:
Come è già nel post 17
Che però è bloccante e sbaglia i conti dei tempi al rilascio del pulsante
Come avevo già scritto io.
@C1P8, stiamo cercando di farlo arrivare per gradi, partendo dall'esempio base BlinkWithoutDelay,
secondo me @LpAsi è uno studente che deve poi spiegare al professore cosa ha fatto.
Quello del post 17 sarà anche funzionante (come di base lo era l'ultima versione di @LpAsi, ma è anche pieno di parti che poi devi spiegarle, digitalWrite(LED, statoled * ((millis() / 100) % 2
Secondo te @LpAsi sa cosa è quel calcolo ? Cerchiamo di fare esempi con un codice semplice, senza troppi aggiunte che per un principiante sono solo delle difficoltà in più.
nid69ita: @C1P8, stiamo cercando di farlo arrivare per gradi, partendo dall'esempio base BlinkWithoutDelay,
secondo me @LpAsi è uno studente che deve poi spiegare al professore cosa ha fatto.
Stessa senzasione ed è in quest'ottica che, dal mio puntodi vista, è bene evitare di fornire il programma fatto (anche swe più o meno) ma limitarsi ad indicare una possibile strada efar fare a lui il programma e poi eventualmente correggerlo se ci sono errori, l'impressione è che come spesso avviene, sta aspettando la pappa fatta senza metterci impegno e studio
Concordo poi con l'analsi di @C1P8 su come dovrebbe funzionare il programma, ovvero led acceso da due secondi premo il pulsante, quando lo rilascio il led dopo alri tre deve spegnersi.
Ma ben mi guardo dal suggerire oltre fintantoché non arriva all'obiettivo minimo da solo
Post #22 e post #24 hai due versioni funzionanti, che si comportano un maniera leggermente diversa con il pulsante. Ripeto funzionanti, non capisco perchè aggiungi tempo2
Non sarebbe ne il primo ne l'ultimo che abbagliato dalla favoletta "con Arduino è semplice fare tutto ciò che si desidera" che crede di riuscire ad arrivare all'obiettivo copiando ed incollando senza dover imparare nulla (e non mi sto riferendo a questo utente specifico sia chiaro)
Tonellate di esempi tuti uguali su vari "blog" o "siti personali" che persone che pensano di poter spiegare come "nussun altro prima" le solite basi emagari vai a vedere e non c'è la resistenza sui led, programmi scritti alla "penis canem" con l'ambizione di monetizzare dalle pubblicità tramite il sito o cose così.
Poi tra non molto arriverà la solita ondata di progetti per la maturità "vi prego aiutatemi devo consegnare domani" talmente innovativi che con un po' di volontà si riuscirebbe davvero a farli con il copia-incolla dal web ma manco quello, da qui credo nasca la regola nel regolamento di non fornire programmi ecc.
Poi chiaro non è una violazione grave che porta alla chiusura (tipo alta tensione)
Lpasi: @Nid69ita ho provato a fare come mi hai consigliato il led si ferma nello stato in cui è quando premo il pulsante ma il tempo va avanti lo stesso
Ti ho messo due soluzioni, se tieni premuto il pulsante, uno tiene conto del tempo mentre l'altro non ne tiene conto.
Siccome non ho capito bene quel che vuoi fare, penso che una delle due soluzioni sia quella che vuoi.
Il programma è lo stesso, cambia solo il blocco if(pulsante) o ciclo while(pulsante)
premo il pulsante, il led rimane fermo nello stato in cui si trova senza variare il tempo.
ad esempio se il led s ferma nello stato acceso a 2,7 secondi quando lascio il pulsante deve rimanere acceso altri 2,3 secondi e continuare il lampeggio
Si ora mi è più chiaro. Sono in ufficio, non riesco a seguire il thread per bene.
Per quello che vuoi fare, allora tutto il tempo per cui tieni premuto il tasto deve essere aumentato ad interval
Se passati 2,7 sec, tieni premuto es. 10 sec. allora al rilascio interval dovrà essere +10 sec
Quindi
metti la riga unsigned long tempo = millis(); come prima cosa nella loop()
aggiungi una variabile unsigned long tempoPulsante=0; tra le variabili globali
prima del ciclo while(pulsante) poni tempoPulsante=0;
dovrai cambiare nel ciclo while(pulsante), non devi fare previousMillis = millis();
ma devi aumentare tempoPulsante di un tot ed uscire .... cerca di arrivarci da solo
cambia aggiungendo: if (tempo - previousMillis >= interval + tempoPulsante)
ovvero il tempo da superare è interval + tutto il tempo che hai premuto il pulsante.
Lpasi:
... io ho provato a leggere e capire il link che mi avevi mandato ma non riesco a stare concentrato essendo che sono dislessico.
Ti assicuro che qui capiamo perfettamente la problematica e le difficoltà che incontri, ma ...
... purtroppo la programmazione richiede obbligatoriamente attenzione e concentrazione , oltre che parecchio studio.
Ora, date le difficoltà, io ti consiglio di abbandonare per un istante tutto il progetto e cominciare a studiare, un piccolo pezzo per volta, le varie cose che ti sono state indicate da studiare. Quando con i tuoi tempi riterrai di aver assimilato il tutto, riprendi in mano il problema (NON il programma che mi sembra abbastanza incasinato) e ricomincia da capo, UN passo alla volta, sftuttando quello che sei riuscito ad imparare con la dovuta calma e con i dovuti tempi. Vedrai che un passetto per volta arriverai a sviluppare il programma che vuoi fare.