"Resettare" Dei lampeggi del LED

const int bluPin = 10;
const int redPin = 9;
const int greenPin = 11;
const int bottone = 8;
int T_prec_bottone = HIGH;
int Lampeggio = 1000;
unsigned long T_Blink;
unsigned long TempoBlu = 200;
unsigned long TempoRosso = 3000;
unsigned long TempoVerde = 5000;
unsigned long TempoReset = 10000;
unsigned long tempo_pulsante;
volatile unsigned long tempo_premuto;
unsigned long tempo;
volatile unsigned long tempo_iniziale_bottone;
unsigned long tempoprecedente = 0;
    int i=1; //variabile per il conteggio secondi bottone premuto


void setup()
{    
 Serial.begin(9600);
 pinMode(bluPin, OUTPUT);
 pinMode(redPin, OUTPUT);
 pinMode(greenPin, OUTPUT);
 pinMode(bottone, INPUT_PULLUP);
}

void loop() {  
tempo=millis();
if (digitalRead(bottone)==LOW){  //controllo se il pulsante è premuto
  tempo_iniziale_bottone = millis();
  while(digitalRead(bottone)==LOW){  //controllo per quanto tempo è premuto
    tempo_premuto = millis();

    if (tempo_premuto -tempo_iniziale_bottone == Lampeggio){ //se è stato premuto per \ secondo farò un lampeggio di 10 ms
      digitalWrite(bluPin, HIGH);
      delay (10);
      digitalWrite(bluPin, LOW);
Serial.println(i);
i++;
  Lampeggio=Lampeggio+990;
  } 
}


if (tempo_premuto - tempo_iniziale_bottone >= TempoBlu && tempo_premuto - tempo_iniziale_bottone < TempoRosso)
{//se il tempo in cui il bottone è premuto è compreso tra questi due tempi
  unsigned long T_ciclo=millis(); 
  unsigned long t_blu=millis();
  bluup();  //eseguo la mia funzione di fade up
  while (T_ciclo - t_blu <= 60000 ){ //e tengo acceso il led per 1 minuto
    digitalWrite(bluPin, HIGH);
    T_ciclo=millis();
    }
bludown(); //per poi spegnerlo con fade down
  Lampeggio=1000; //reimposto il tempo di lampeggio a 1 secondo (relativo)
  i=1;
}  


if ( tempo_premuto - tempo_iniziale_bottone >= TempoRosso && tempo_premuto - tempo_iniziale_bottone < TempoVerde ){
  redup();   //se il tempo in cui il bottone è premuto è compreso tra questi due tempi accendo e spengo il led
  reddown();
  Lampeggio=1000;
  i=1;
}

if (tempo_premuto - tempo_iniziale_bottone >= TempoVerde && tempo_premuto - tempo_iniziale_bottone < TempoReset){
  greenup(); //se il tempo in cui il bottone è premuto è compreso tra questi due tempi accendo e spengo il led
  greendown();
  Lampeggio=1000;
  i=1;
}


//nel caso tenga premuto per più di 10 secondi, non faccio nulla.
if (tempo_premuto - tempo_iniziale_bottone >= TempoReset )
{
  digitalWrite(bluPin, LOW); 
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, LOW);
  Lampeggio=1000;
  i=1;
}
}
}



void redup () { //accende il led rosso
     int valoreFade = 1;
while (valoreFade <= 255 ) {    
     
    unsigned long tempocorrente = millis(); 
    const long intervallo = 10;
    if (tempocorrente - tempoprecedente >= intervallo){ 
    tempoprecedente = tempocorrente;
    valoreFade++;
     }   
    analogWrite(redPin, valoreFade);      //impostiamo la luminosità del LED      
} 
}

void reddown () { //spegne il led rosso
     int valoreFade = 255;
while (valoreFade >= 1 ) {    
     
    unsigned long tempocorrente = millis(); 
    const long intervallo = 10;
    if (tempocorrente - tempoprecedente >= intervallo){ 
    tempoprecedente = tempocorrente;
    valoreFade--;
     }   
    analogWrite(redPin, valoreFade);      //impostiamo la luminosità del LED      
} 
}

void bluup () { //accende il led blu
     int valoreFade = 1;
while (valoreFade <= 255 ) {    
     
    unsigned long tempocorrente = millis(); 
    const long intervallo = 10;
    if (tempocorrente - tempoprecedente >= intervallo){ 
    tempoprecedente = tempocorrente;
    valoreFade++;
     }   
    analogWrite(bluPin, valoreFade);      //impostiamo la luminosità del LED      
} 
}

void bludown () { //spegne il led blu
     int valoreFade = 255;
while (valoreFade >= 1 ) {    
     
    unsigned long tempocorrente = millis(); 
    const long intervallo = 10;
    if (tempocorrente - tempoprecedente >= intervallo){ 
    tempoprecedente = tempocorrente;
    valoreFade--;
     }   
    analogWrite(bluPin, valoreFade);      //impostiamo la luminosità del LED      
} 
}


void greenup () {//accende il led verde
     int valoreFade = 1;
while (valoreFade <= 255 ) {    
     
    unsigned long tempocorrente = millis(); 
    const long intervallo = 10;
    if (tempocorrente - tempoprecedente >= intervallo){ 
    tempoprecedente = tempocorrente;
    valoreFade++;
     }   
    analogWrite(greenPin, valoreFade);      //impostiamo la luminosità del LED      
} 
}

void greendown () { //spegne il led verde
     int valoreFade = 255;
while (valoreFade >= 1 ) {    
     
    unsigned long tempocorrente = millis(); 
    const long intervallo = 10;
    if (tempocorrente - tempoprecedente >= intervallo){ 
    tempoprecedente = tempocorrente;
    valoreFade--;
     }   
    analogWrite(greenPin, valoreFade);      //impostiamo la luminosità del LED      
} 
}

Questo è il programma che ho creato, funziona a dovere anche se è da perfezionare, ho preso in mano Arduino 2 giorni fa XD, quindi perdonatemi se è poco elegante.

il funzionamento è semplice, in base al tempo in cui tengo premuto il pulsante, ho tre tipi diversi di accensione di led, tenendolo premuto per 10 secondi spengo i led che si trovavano accesi, è come se resettassi il tutto.

A me piace crearmi delle subroutine e richiamarle a piacimento.

Ho cercato di usare la funzione millis per non "bloccare" il programma, tuttavia riscontro le seguenti anomalie:

  1. nella fase di fadeup e fadedown il micro esegue solo quel comando.
  2. una volta che tengo il led blu acceso per 1 minuto, qualsiasi altra funzione non viene accettata, se tengo premuto per 10 secondi il pulsante, non spengo nulla.

la cosa principale con i pulsanti è il debounce

poi se puoi semplificare semplifica
perche scrivere 150 righe se ne bastano 45?

Stai facendo la misura del tempo premuto con millis, ma devi fare il fade anche con millis e non restare dentro nel ciclo while per il fade.

Ciao Uwe

elrospo:
la cosa principale con i pulsanti è il debounce

https://www.arduino.cc/en/Tutorial/Debounce

poi se puoi semplificare semplifica
perche scrivere 150 righe se ne bastano 45?

a cosa mi serve la funzione debounce se leggo il tempo di pressione tel tasto e non la sua pressione?

scrivo 150 righe per farlo funzionare, poi lo compatto in 45

uwefed:
Stai facendo la misura del tempo premuto con millis, ma devi fare il fade anche con millis e non restare dentro nel ciclo while per il fade.

Ciao Uwe

non coprendo bene cosa hai scritto...

mi stai dicendo che nel fade il micro rimane bloccato in quanto richiamo spesso millis?

puoi farmi un'esempio?

kurtzisa:
non coprendo bene cosa hai scritto...

mi stai dicendo che nel fade il micro rimane bloccato in quanto richiamo spesso millis?

puoi farmi un'esempio?

No, dico che rimane nel Fade e non controlli il pulsante

Ciao Uwe

Non essendoti ancora presentato Ti invitiamo a presentarti QUI (dicci quali conoscenze hai di elettronica e di programmazione) e a leggere il regolamento QUI se non lo hai già fatto.

Comunque benvenuto sul forum.

Attilio