Pages: [1]   Go Down
Author Topic: sw e led  (Read 426 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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!
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21252
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: October 06, 2012, 12:26:20 pm by uwefed » Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Esiste una cosa che si chiama barra spaziatrice: usala!    smiley-razz smiley-razz
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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);}
 }
 
 }
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21252
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 37
Posts: 1298
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
...
 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
« Last Edit: October 06, 2012, 07:53:51 pm by cyberhs » Logged

Pages: [1]   Go Up
Jump to: