Interruttore a levetta, contatore e arduino

Spero la domanda non sia troppo banale.

Vorrei collegare un interruttore a levetta ad arduino in modo che ogni volta che premo la levetta si vada ad incrementare una variabile che uso come contatore.

Per far questo devo collegare un morsetto dell'interruttore all'uscita da 3.3v di arduino e l'altro ad un ingresso analogico e verificare quando quel pin ha un valore alto e quindi incrementare la variabile?

Ciao, devi usare un pin digitale e settarlo come input; guarda questa immagine:


Come vedi il pulsante è collegato al pin digitale 2 e viene alimentato a 5V.
La resistenza di pulldown da 10K (collegata a massa) serve per evitare variazioni di lettura quando il pulsante non è premuto, in questo caso il pin avrà stato logico basso. Quando premi il pulsante sul pin 2 arriveranno 5V quindi leggerà stato logico alto; la resistenza serve inoltre per non fare un cortocircuito.
Ti occorre anche fare un debounce software visto che devi incrementare una variabile, prova questo sketch:

const int pulsante = 2;
int valPulsante = 0;
int valUltimoPulsante = 0;
int variabile = 0;

void setup()
{
pinMode(pulsante,INPUT);
delay(2000);
Serial.begin(9600);
}

void loop()
{
valUltimoPulsante = valPulsante;
valPulsante = digitalRead(pulsante);
if(valUltimoPulsante == HIGH && valPulsante == LOW)
{
variabile++;
Serial.println(variabile);
}
}

Se non fai il controllo sul pulsante vedresti la variabile aumentare a dismisura mentre in questo modo la variabile incrementa solo quando il pulsante viene rilasciato.
Buon divertimento :wink:

Ti ringrazio moltissimo! :slight_smile:

E' tutto molto chiaro!

Gli interuttori quando vengono azionati o rilaschiati non chiudono subito ma la levetta che tocca il contatto fa qualche balzo. Elettricamente vedi che si sono 2-3 impulsi prima che l'interuttore chiude.
Devi fare il debounce.

http://arduino.cc/it/Tutorial/Debounce
http://www.arduino.cc/playground/Code/Bounce

Ciao Uwe

Ti ringrazio, stavo appunto leggendo dei documenti riguardo al debounce: non pensavo ci potesse essere questo problema! :slight_smile:

Il pulsante che ho io ha tre morsetti: i primi due sono in corto circuito, mentre il primo e il terzo sono un circuito aperto.
Quando premo il pulsante, la situazione si inverte.

Io ho collegato un morsetto ai 5V e l'altro morsetto al pin digitale 8, lasciando il terzo morsetto libero (non l'ho collegato a GND perchè temevo un corto circuito tra 5V e GND).
Il problema è che la variabile aumenta sempre.

Come posso fare?

inverti la logica che stai usando adesso nel software cambia high con low e viceversa. (forse hai sbagliato i collegamenti all'interruttore)

Ho provato a invertire la logica, ma non va lo stesso.

Praticamente, appena premo il pulsante, il contatore si incrementa da solo velocemente.

Quello che faccio ora è semplicemente portare i 5V direttamente nell'ingresso digitale 8 di arduino nel momento in cui chiudo il circuito.
Praticamente, un morsetto dell'interruttore è a 5V, l'altro al pin 8 in modo che quando premo il pulsante i due morsetti vanno in corto e sul pin digitale ho i 5v.

Solo che non funziona :slight_smile:

Il terzo morsetto è quello che va in corto con il morsetto da 5V quando si preme l'interruttore, quindi non l'ho collegato per evitare casini.
Dovrei collegarlo?

no, quel pulsante è a 2 stati, normalmente chiuso e normalmente aperto, tu devi scegliere di usarne uno e scrivere il software in base a quello.
Se hai scelto di usare la modalità normalmente aperto, si comporterà comeun pulsante standard, quindi se hai collegato tutto per bene ed hai usato il codice che ti hanno postato prima dobrebbe funzionare.

Quello che hai tu è un deviatore, non un pulsante... in pratica il pin centrale dovrebbe essere contatto comune (verificalo col tester).
Per farlo funzionare come un normale pulsante collega il filo che parte dal pin dell'arduino sul pin comune dell'interruttore mentre gli altri li colleghi rispettivamente a 5V e massa come da schema (occhio a non mettere 5V o massa sul pin comune, altrimenti fai un corto!).
La resistenza di pulldown sul pin di arduino devi sempre metterla.
Per ottenere lo stesso funzionamento del pulsante sempre se usi il codice che ti ho postato l'altra volta devi azionare il pulsante due volte, quindi da posizione normale (massa) lo attivi per la prima volta e mandi 5V verso l'ingresso di arduino che leggerà HIGH, poi lo riporti alla posizione originale in modo che arduino legge ancora LOW e vedrai che il codice ti ritorna a funzionare.
Ciao

Allora, sì, in effetti c'è un pin comune che è uno di quelli esterni.

Facendo i collegamenti come avete suggerito, ora il contatore funziona solo che l'incremento della variabile a volte è di uno, a volte è di tre o quattro per ogni volta che premo.

Quindi, se premo una volta avanza di uno, se premo nuovamente magari il contatore salta al valore quattro e così via.
Diciamo che non è preciso.. come mai?

Ho collegato il resistore da 10K a GND (ho provato anche a metterlo sul pin di arduino, ma nulla, il valore è sempre poco preciso.

La risposta alla tua domanda c'è già.... leggi quello che ti ha detto uwefed :slight_smile:
Scusa la domanda idiota, ma non faresti prima a usare un pulsante al posto del deviatore?
Ciao

Perfetto ragazzi!
Ho usato la libreria per il debounce ed ora va benissimo! :slight_smile:

La resistenza di pulldown la metto sul pin GND di Arduino vero?
Non la metto tra deviatore e pin digitale, giusto?

Per evitare fluttuazioni dei valori, mi conviene mettere la resistenza di 10K tra l'uscita del deviatore ed il pin digitale di arduino, vero?

O è lo stesso se la metto tra GND e pin del deviatore?

P.S. uso il deviatore perchè devo simulare un contatto.