[RISOLTO]come bloccare il lampeggio di un led?

Il programma del post 17 ha il pulsante bloccante

Calcola i tempi in una maniera bruttissima

E quando si rilascia il pulsante non termina correttamente il ciclo perché non tiene conto del tempo di pressione del pulsante

Quello del post 10 invece ha qualche problema col calcolo dei tempi di pressione del pulsante, ma a parte quello sembra andare

Questo non capivo: perché lo OP ha scartato quel programma

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.

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

Come è già nel post 17

Che però è bloccante e sbaglia i conti dei tempi al rilascio del pulsante

Come avevo già scritto io.

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ù.

Così alla pressione del pulsante fa ripartire i tempi

Sembra invece che lo OP voglia solo sospendere ma non azzerare il ciclo

Ridomando allo op:

Il programma al #17 cosa aveva di sbagliato?

nid69ita:
Secondo te @LpAsi sa cosa è quel calcolo ?

Potrebbe rispondere lui, non credi?

Anch'io non so cosa è quel calcolo, ma credo sia solo per dimostrare il non bloccante del programma

Basta toglierlo

A me pare di avergli dato tutte e due le soluzioni.
Hai visto il programma al post 17 ? Secondo te un utente alle prime armi lo capisce ?

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

¿?

No, dai, non ci credo

Significa non conoscere le basi

Mi astengo

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

È sparito un post?

Quello al quale rispondevo al 30?

Si qulcuno ha eliminato un post, ma non so dire quale

C1P8:
Significa non conoscere le basi

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)

Io ho fatto in tempo a vederlo il post eliminato

E lascio allo op il consiglio di studiare, ma veramente

E poi mi fermo, perché riconosco le imprese troppo ardue

@NiD9iTa o 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

int ledState = LOW;
unsigned long previousMillis = 0;
unsigned long interval = 3000;
const byte led = 5;
const byte Pulsante = 7;

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

void loop(){
if(digitalRead(Pulsante)==HIGH)
  { previousMillis = millis();   // tiene conto del tempo passato
    return;   // esce senza fare il codice scritto qui sotto
  }
  unsigned long tempo = millis();
  if (tempo - previousMillis >= interval)
  { previousMillis = tempo;
    if (ledState == LOW)
    { ledState = HIGH;
      interval=5000;
    }
    else
    { ledState = LOW;
      interval=3000;
    }
    digitalWrite(led, ledState);
  }
  
}

Comunque @fabpolli io ho provato a leggere e capire il link che mi avevi mandato ma non riesco a stare concentrato essendo che sono dislessico.

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)

questo è quello che devo fare:

led acceso 5 secondi
led spento 3 secondi

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

Adesso si capisce meglio @nid69ita?

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

  1. metti la riga unsigned long tempo = millis(); come prima cosa nella loop()
  2. aggiungi una variabile unsigned long tempoPulsante=0; tra le variabili globali
  3. prima del ciclo while(pulsante) poni tempoPulsante=0;
  4. 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
  5. 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.

Guglielmo