Con il piccolo tutorial di oggi vi mostrerò come è possibile, utilizzando un solo PIN analogico di Arduino, leggere la posizione di un interruttore a tre posizioni.
Un interruttore a tre posizioni (a volte definito ON-OFF-ON o SPTT) presenta 3 PIN: il comune (centrale) e i due di uscita. Quando la levetta è in alto o in basso, il PIN comune è connesso ad uno dei due PIN di uscita; quando la levetta è in posizione centrale, il PIN comune non è connesso a nulla.
Utilizzando due sole resistenze, possiamo leggere la posizione della levetta con un PIN analogico di Arduino:
Per capire il significato dello schema sopra riportato, verifichiamo cosa succede nelle tre posizioni della levetta:
- quando la levetta è in posizione centrale (2), il PIN AN0 è collegato a 5V tramite R1 (pull-up): il valore letto da Arduino sarà circa 1023
- quando la levetta è in alto (3), il PIN AN0 è collegato al centro di un partitore resistivo formato da R1 ed R2. Essendo le due resistenze di pari valore, la tensione vista da AN0 sarà circa 2.5V e quindi il valore letto da Arduino sarà circa 512
- quando la levetta è in basso (1), il PIN AN0 è collegato direttamente a massa; il valore letto da Arduino sarà circa 0.
Lo sketch sarà allora molto semplice:
#define BUTTON_PIN A0 int previousState; void setup() { Serial.begin(9600); previousState = 0; } void loop() { int analogValue = analogRead(BUTTON_PIN); int actualState; if(analogValue < 100) actualState = 1; else if(analogValue < 900) actualState = 3; else actualState = 2; if(previousState != actualState) { previousState = actualState; Serial.print("Button state: "); Serial.println(actualState); } } |
Lo sketch utilizza una soglia di tolleranza sui valori letti.
Demo
Vista la semplicità del circuito, l’ho realizzato su una millefori:
Luca thanks for the code. I would like to add another 3-way switch so I would have two. But i’m not a coder so I don’t know how to do it. Can you help?
Hi Mark, simply use a different analog PIN (for example A1):
#define BUTTON_PIN2 A1
int analogValue2 = analogRead(BUTTON_PIN2);
...