Go Down

Topic: sw e led (Read 502 times) previous topic - next topic

damosound

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
Code: [Select]

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!

uwefed

#1
Oct 06, 2012, 07:23 pm Last Edit: Oct 06, 2012, 07:26 pm by uwefed Reason: 1
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

tuxduino

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

damosound

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!
Code: [Select]
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);}
}

}

uwefed

http://en.wikipedia.org/wiki/Debounce#Contact_bounce
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

cyberhs

#5
Oct 07, 2012, 02:29 am Last Edit: Oct 07, 2012, 02:53 am by cyberhs Reason: 1
Probabilmente la cosa dipende dalla mancanza di un resistore di pull-up, ma anche il software è un po' macchinoso. prova così:

Code: [Select]

...
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

Go Up