Interruttore a tre posizioni e Arduino

by luca
2 comments

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:

3sbutton-1

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:

3sbutton-4 3sbutton-3

3sbutton-2

Related Posts

2 comments

Mark 18 ottobre 2015 - 13:02

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?

Reply
luca 19 ottobre 2015 - 08:25

Hi Mark, simply use a different analog PIN (for example A1):
#define BUTTON_PIN2 A1
int analogValue2 = analogRead(BUTTON_PIN2);
...

Reply

Leave a Comment

15 − undici =