Interruttore a tre posizioni e Arduino

luca 01/08/2014 2

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

2 Comments »

  1. Mark 18/10/2015 at 13:02 - Reply

    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?

    • luca 19/10/2015 at 08:25 - Reply

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

Leave A Response »

Questo sito usa i cookie per poterti offrire una migliore esperienza di navigazione maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi