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.
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.
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 ?
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()
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.