regolare luminosita' luce pwm con 1 tasto

tate_1 = digitalRead(12);  
 state_2 = digitalRead(13);
 
 if (state_1 == HIGH)
 {
   brightness = brightness + 2;
   delay(30);
 }
 
 if (brightness > 255)
 {
   brightness = 255;
 }

ciao a tutti, io vorrei fare un dimmer con un tasto.
quello che ho scritto arriva al massimo ma non so come farlo ritornare a 0…
avevo pensato ad uno che se premo a impulsi sale e se tengo premuto si spegne ma per me e’ acora troppo.
dove sbaglio in quello che ho scritto per farlo scendere?
ggrazie mille

Ti complichi la vita inutilmente! Non esiste motivo di non utilizzare due pulsanti.

Comunque se vorresti portare a zero dopo raggiunto il valore 255, assegni alla variabile il valore zero.

Se invece arrivati al valore 255 vorresti decrementare come prima aumentavi, usa una variabile, quando arrivi a zero alla variabile viene assegnato il valore 2, cosi incrementa, quando arrivi al valore 255 alla variabile viene assegnato il valore -2, cosi decrementa.

int numero=2;
void loop(){
 
     if (state_1 == HIGH){

               brightness = brightness + numero;
               delay(30);
      }
 
     if (brightness >=255){ // Arrivato al valore massimo modo decrementa

           numero=-2;
     }else if (brightness<=0){//Arrivato al valore minimo modo aumenta

           numero=2;
     }
}

pippero1979:
avevo pensato ad uno che se premo a impulsi sale e se tengo premuto si spegne

Il funzionamento "classico" di un dimmer a un pulsante è il seguente:

  • Se tengo premuto vario la luminosità, quando arriva al massimo ricomincia a scendere, e quando arriva al minimo ricomincia a salire (il minimo potrebbe anche non essere del tutto spento).
  • Se faccio solo un click spengo del tutto, o riaccendo all'ultima luminosità impostata.

Mi sembra un ottimo esercizio.

Se faccio solo un click
Considera una pressione più breve di 500~700ms. Dopo tale tempo comincia a variare.

grazie mille, ma non ho ancora capito bene come come leggere la pressione lunga o corta del tasto, hai qualcosa da suggerirmi da poter leggere ?

con il listato che mi hai dato, non riesco a spegnere completamente, sono io che sbaglio qualcosa oppure ce qualcosa di altro?

Finché il tasto non è premuto, una variabile unsigned long, che chiamiamo t, si aggiorna continuamente con il valore di millis(); quando lo premi, t non di aggiorna più. Se millis()-t supera un certo valore, il pulsante è stato premuto a lungo.

e come comando si usa pulse in giusto?

pippero1979:
grazie mille, ma non ho ancora capito bene come come leggere la pressione lunga o corta del tasto, hai qualcosa da suggerirmi da poter leggere ?

Dai un'occhiata qui.

Federico

a parte il listato, l integrato mi serve??

Dalle spiegazioni che ti hanno dato puoi scrivere già un codice senza l’utilizzo di elettronica aggiuntiva.

Tutti i post di danno un informazione utile, messi insieme portano alla soluzione del problema.

Un esempio, potrebbero esserci errori da correggere ma la logica è questa

/*Variabili globali dichiarate fuori dalle funzioni loop() e setup() */

int numero=2;
unsigned long t=0;
unsigned long tempo=0;
 
void loop(){
 
     if (state_1 == HIGH){ // Quando il pulsante viene premuto

         tempo=millis()-t;
         if(tempo>=700){// Se il pulsante è stato premuto allungo 

               // Incremento fino al valore massimo, poi decremento fino al valore minimo
               brightness = brightness + numero;

               if (brightness >=255){ // Arrivato al valore massimo modo decrementa

                   numero=-2;
               }else if (brightness<=0){//Arrivato al valore minimo modo aumenta

                   numero=2;
               }// end if
               delay(30);
         }
      }else{
           if(tempo>0 && tempo<500){ // Pulsante rilasciato rapidamente
               brightness=0; // spengo
           }
           tempo=0;
           t=millis(); // Se il tasto non è premuto t è uguale a millis()
      }// end if
 
     
}// end loop()

pippero1979:
a parte il listato, l integrato mi serve??

No, puoi usare tranquillamente il debounce software.
Naturalmente quello è solo un esempio di gestione dei pulsanti

Federico

Basta un condensatore da 100~220nF in parallelo al tasto: in un attimo non ci pensi più, senza doverti poi chiedere se non funziona perché c'è un errore nell'antirimbalzo software o altrove.

perfetto, grazie a tutti
ed un sincero auguri di di buone feste a tutti!!
grazie ancora