accendere dimmare e spegnere un led con un solo tasto

Ciao a tutti, come sempre le cose semplici possono essere le piu difficili. Come da titolo ho delle difficolta a accendere, spegnere e dimmare un led (collegato ad una uscita digitale di un arduino mega e pilotato da un n-mosfet) con UN solo tasto.

Ho cercato tanto ma non riesco a trovare una soluzione che vada bene.

Ho visto che forse si potrebbe usare la libreria buttons ma ce poca documantazione.

Il programma dovrebbe essere semplicissimo, se premo una volta il tasto il led si accende, se lo ripremo si spegne, e se lo tengo premuto comincia a dimmarsi e al rilascio memorizza il valore..

Forse qualcuno ha qualche suggerimento... :) :)

c'è ad esempio la libreria oneButton https://github.com/mathertel/OneButton che fà tutto lei

esempio

#include "OneButton.h" // https://github.com/mathertel/OneButton

OneButton button(A1, true);  // Pulsante collegato tra pin A1 e GND
const byte ledPin = 11 ;         // Led collegato al pin PWM 11
byte ledState = LOW;     
int val_analog = 0 ;

void setup() {
  Serial.begin(115200);
  Serial.println("Starting ...");
  pinMode(ledPin,OUTPUT); 
   
  button.attachClick(click1);
  button.attachDoubleClick(doubleclick1);
  button.attachLongPressStart(longPressStart1);
  button.attachLongPressStop(longPressStop1);
  button.attachDuringLongPress(longPress1);
}

void loop() {
  button.tick();

   delay(10);
}
//********************************************************
// This function will be called when the button1 was pressed 1 time
void click1() {
  Serial.println("Button click.");
  ledState = !ledState ;
  digitalWrite(ledPin, ledState);
}

// This function will be called when the button1 was pressed 2 times in a short timeframe.
void doubleclick1() {
  Serial.println("Button doubleclick.");
}

// This function will be called once, when the button1 is pressed for a long time.
void longPressStart1() {
  Serial.println("Button longPress start");
 }

// This function will be called often, while the button1 is pressed for a long time.
void longPress1() {
  Serial.print("Button longPress...  ");
  val_analog++ ;
  if (val_analog >255) val_analog = 0;
  delay(20);
  Serial.println(val_analog);
  analogWrite(ledPin,val_analog);
}

// This function will be called once, when the button1 is released after beeing pressed for a long time.
void longPressStop1() {
  Serial.println("Button longPress stop");
}

Acceso con una pressione breve, spento con una seconda pressione breve e variare la luminosità con una pressione lunga permanente (al raggiungimento del massimo si inizia a diminuire e viceversa)

Vuoi ripetere i varialuce della Relco :) ... il tuo scopo finale è collegarlo a un triak e variare la luce di una lampada 220? Se è così, fai molto prima a usare quel dispositivo.

@pablos OP cita un N-mosfet, quindi credo che non sia da usare in alternata.

infatti non è quello che ho detto, "replicare" per poi applicare un triack è ben diverso, tu trovi una ragione nel prendere un leddino da solo poverello che già fa una luce inutile e dimmerarla? Comunque ho fatto una domanda, niente di transcindentale

pablos: prendere un leddino da solo poverello che già fa una luce inutile e dimmerarla?

Sarà un leddone-one (come quello dei faretti) o striscia di led ;)

pablos: niente di transcindentale

Anche da qui :)

inanzitutto brunello grazie questa libreria funzione veramente bene e anche il codice è comprensibile.. In poche parolie avevo aquistato un 12v in dc a 12v out pwm della qtl o qlt che funzionava proprio cosi, ma purtroppo ho fatto un corto, si è subito rotto il processore e non volevo aquistarne uno nuovo dato che ho tanti arduini e il circuito lato mosfet era ancora buono. cmq si deve pilotare 4 led da 12v dc e dimmarli.

i triac vengono usati tanto in ac, in dc si possono anche usare.. i mosfet vanno sempre bene :D :D :D