sw e led

salve ragazzi sto realizzando un piccolissimo firmware di prova, ma qualcosa non mi quadra.
vorrei che quando premo uno switch(sw) una volta , il del si accenda e rimanga quale fino a che non ri-premo il tasto, pare una cosa facilissima ma non lo riesco a fare.
vi posto lo sketch

int sw=44;
int led=40;
 void setup()
 {
   pinMode(sw,INPUT);
   pinMode(led,OUTPUT);
   
 }
 
 void loop()
 {
 int stato=LOW;
 int val=LOW;
 val=digitalRead(sw);
 if(val==HIGH&&stato==LOW)
 {stato=HIGH;
 digitalWrite(led,HIGH);}
 if(val==HIGH&&stato==HIGH)
 {stato=LOW;
 digitalWrite(led,LOW);}
 
 
 }

con questo programma:
il led rimane accesso sempre, quando premo il tasto si spegne, se lo rilascio, il led si riaccende.
mi aiutate?
grazie!

Sí é giusto. lo sketch fa quello che deve fare (col aiuto del Bouncing del pulsante).
Per fare quello che vuoi TU togli il
int stato=LOW;
dal loop() e mettilo prima del setup()
fai la stessa cosa anche con
int val=LOW;
e poi fai il debonce dal pulsante.
Ciao Uwe

Esiste una cosa che si chiama barra spaziatrice: usala! :stuck_out_tongue: :stuck_out_tongue:

grazie a tutti per le risposte.
ho effettuato queste modifiche ( varibili di stato, val prima del setup e antirimbalso), ma non funziona.
cosa c'è che non va??? vi allego il codice!

int sw=44;
int led=40;
 int stato=LOW;
 int val=LOW;
 void setup()
 {
   pinMode(sw,INPUT);
   pinMode(led,OUTPUT);
   
 }
 
 void loop()
 {

 val=digitalRead(sw);
 if(val==HIGH)
 {delay(10);
 if(val==HIGH && stato==LOW)
 {stato=HIGH;
 digitalWrite(led,HIGH);}
 if(val==HIGH && stato==HIGH)
 {stato=LOW;
 digitalWrite(led,LOW);}
 }
 
 }

e
http://www.arduino.cc/playground/code/bounce

I contatti del pulsante quando chiude o apre saltella qualche volta prima che fa contatto. Questo saltellare vede un circuito elettronico come 4-5 aperture/chiusure del tasto e percui certi sketch non funzionano come speri.

Ciao Uwe

Probabilmente la cosa dipende dalla mancanza di un resistore di pull-up, ma anche il software è un po' macchinoso. prova così:

...
 boolean stato = LOW;
 boolean val = HIGH;                    // pulsante che chiude verso massa
...
   pinMode(sw, INPUT_PULLUP);   // inserisce resistore di pull-up interno da 20k con pulsante che chiude verso massa
...
  val=digitalRead(sw);

  if(val == LOW) {                      // pulsante premuto
    stato = !stato                       // inverti stato
    digitalWrite(led, stato);
    delay(100);                          // ritardo per evitare lampeggi tipo "roulette"
  }
...

Ettore Massimo Albani