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
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);}
}
}
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.
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"
}
...