Innanzi tutto Salve a tutti, ho appena acquistato un arduino UNO e ci sto smanettando..
Ho iniziato con un semplice pulsante che accende un LED
#define LED 13 // LED collegato al pin digitale 13 #define BUTTON 7 // pin di input dove è collegato il pulsante
int val = 0; // si userà val per conservare lo stato del pin di input
int stato = 0; // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
pinMode(BUTTON, INPUT); // imposta il pin digitale come input
}
void loop() {
val = digitalRead(BUTTON); // legge il valore dell'input e lo conserva
// controlla che l'input sia HIGH (pulsante premuto)
// e cambia lo stato del led
if (val == HIGH) {
stato = 1 - stato;
}
if (stato == 1) {
digitalWrite(LED, HIGH); // accende il led
}
else {
digitalWrite(LED, LOW); //spegne il led
}
}
Il problema e' che devo premere il pulsante anche 3 volte perchè si accenda e spenga...
Inpreciso insomma...Ho sbagliato qualcosa o devo alimentare la scheda o......
posta anche il circuito, devi inserire una resistenza di pulldown tra il pulsante e la massa o rischi che le interferenze diano letture sbagliate. poi controlla in internet anche una cosa chiamata debounce ovvero il fatto che il programma non rilegga 2 volte o più consecutivamente lo stesso tasto
Perchè tu devi pensare che il loop viene eseguito tantissime volte e tu non hai implementato nessun sistema di debounce nel tuo script.
In questo modo mentre tu hai premuto il pulsante magari il loop si è eseguito 300 volte e il tuo led può risultare alla fine acceso come spento.
Il pin di ingresso non lo collegherei alla breadboard come lo hai collegato tu, accanto alla resistenza, ma dall'altra parte del pulsantino, com'è infatti anche sullo schema presente al link del debounce.
Inoltre io per il debounce uso questo codice:
byte val1=0;
byte val2=0;
byte change=0;
void setup() {
....
}
void loop() {
//funzione di Debounce per il pulsantino - da qui....
val1=digitalRead(BUTTON);
delay(10);
val2=digitalRead(BUTTON);
if (val1==val2) {
if (val1!=change) {
if (val1==LOW) {
//codice da eseguire
}
}
}
change=val1;
//... a qui
E' un debounce con un valore prefissato (10 ms) invece che di un valore variabile e fatto con l'uso del delay invece che col millis.
Non uso il millis semplicemente perché in 10 ms non credo che mi si spostino così tanto le orbite planetarie da alterare il continuum nel quale opera il mio pulsantino XD
leo72:
Il pin di ingresso non lo collegherei alla breadboard come lo hai collegato tu, accanto alla resistenza, ma dall'altra parte del pulsantino, com'è infatti anche sullo schema presente al link del debounce.
Perché? non capisco.
Ciao Patrick, abitiamo vicino.
Per primo serve SEMPRE una resistenza in serie al LED anche al pin 13 (nelle prime versioni era presente una resistenza ma da tante versioni non piú)
I 2 Problemi che hai con quel codice sono:
il debouce
che il loop() viene ripetute tante volte mentre schiacci il pulsante e percui cambia stato il Led tantissime volte. Lo stato del led quando molli il pulsant é casuale dal momento che lo molli.
per 2)
Una volta riconosciuto il tasto premuto, dopo il tempo di debouce, accendi il LED e memorizzi lo stato del pulsante in una variabile.
Tutte le prossime volte che controlli il pulsante se premuto controlli anche la variabile di stato e cosí puoi accorgertene se é la prima volta che viene trovato premuto o una seconda o n-esima volta.
Poi controlli anche se il tasto é stato rilasciato e lo memorizzi in una varabile, perché solo in quel caso sai che la prossima volta che trovi il pulsante schiacciato devi canbiare lo stato del LED.
pulsante: L L L L H H H H H H H H L L L L L L L H H H
variabile : 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1
LED: L L L L H H H H H H H H H H H H H H H L L L
finchè è un pulsante solo puoi mettere semplicemente un delay quando diventano già 2 pulsanti per fare qualcosa di serio puoi salvare l'ultimo pulsante premuto e quindi se è lo stesso premuto in quel momento controlli se è passato un certo tempo altrimenti lo dai buono
esempio facile facile (funzione)
non l'ho provato e l'ho buttato giù in 2 minuti ma dovrebbe funzionare, in pratica leggi lo sostituisci a digitalRead() e tra le parentesi metti il pin a cui è collegato il pulsante, la variabile delay indica il tempo di debounce, ma qui è per più pulsanti
a te basta
@superlol:
ma difatti lui deve gestire 1 pulsantino, quindi perché complicare tanto il codice?
@Uwe:
solo per una questione visiva. Quando sei alle prime armi fare le cose più semplici aiuta poi a capire anche eventuali problemi di impostazione del circuito, tutto qui. Quel collegamento dalla stessa parte dei contatti +5V e resistenza/massa può "incartare" le idee
leo72: @Uwe:
solo per una questione visiva. Quando sei alle prime armi fare le cose più semplici aiuta poi a capire anche eventuali problemi di impostazione del circuito, tutto qui. Quel collegamento dalla stessa parte dei contatti +5V e resistenza/massa può "incartare" le idee
Ora capisco. Ma non é intuitivo sapere che sempre 2 piedini del pulsante sono collegati internamente.
Ciao Uwe
leo72: @superlol:
ma difatti lui deve gestire 1 pulsantino, quindi perché complicare tanto il codice?
infatit poi gli ho messo il codice per un solo pulsante
ad ogni modo ho tolto anche l'inizializzazone della variabile lastime, bisogna dichiararla anche nel secondo scusate lo sbaglio