Come collegare molti pulsanti usando solo un pin di Arduino

Questo piccolo trucco vi servirà nei casi siate a corto di pin liberi nei vostri progetti con Arduino.

Infatti con un solo pin analogico riuscirete a leggere quanti pulsanti volete!

vediamo subito come, ecco lo schema di collegamento:


Ecco fatto, 4 pulsanti ed un solo pin analogico, ma con lo stesso sistema potete aggiungerne molti altri!

il principio è semplice, quando nessun pulsante è premuto Arduino legge i 5 volt che "arrivano" dalla resistenza da 4,7 K.



Quando il pulsante S1 è premuto Arduino legge 0 Volt, perchè il pin A0 viene collegato direttamente a GND.
Quando il pulsante S2 è premuto Arduino legge un valore di tensione un po' più alto. (dato dal partitore resistivo della resistenza da 4,7K e dalla prima da 1 KOhm)
Quando il pulsante S3 è premuto Arduino legge un valore di tensione ancora più alto. (dato dal partitore resistivo della resistenza da 4,7K e dalla serie di 2 resistenze da 1 KOhm)
Con il pulsante S4 otterrò un valore ancora più alto, e via di seguito.

Facciamo una prova pratica utilizzando l'esempio di Arduino "ReadAnalogVoltage"

  1. /*
  2.   ReadAnalogVoltage
  3.   Reads an analog input on pin 0, converts it to voltage, and prints the result to the serial monitor.
  4.   Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
  5.  This example code is in the public domain.
  6.  */
  7. // the setup routine runs once when you press reset:
  8. void setup() {
  9.   // initialize serial communication at 9600 bits per second:
  10.   Serial.begin(9600);
  11. }
  12. // the loop routine runs over and over again forever:
  13. void loop() {
  14.   // read the input on analog pin 0:
  15.   int sensorValue = analogRead(A0);
  16.   // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  17.   float voltage = sensorValue * (5.0 / 1023.0);
  18.   // print out the value you read:
  19.   Serial.println(voltage);
  20. }

Se avete collegato tutto nel modo giusto otterrete un valore di tensione diverso premendo i vari pulsanti, questo è il principio su cui si basa il nostro trucchetto.
Infatti poi qiuando leggeremo un diverso valore di tensione sul pin A0 faremo fare un'operazione diversa al nostro Arduino.

vediamo ora uno sketch di esempio per capire come utilizzare questo sistema nei nostri progetti:

  1. int led=13;
  2. void setup()
  3. {
  4.   Serial.begin(9600);
  5.   pinMode (led, OUTPUT);
  6. }
  7. void loop()
  8. {
  9.   int pulsante = lettura_pulsante();
  10.   Serial.println(pulsante);
  11.   switch (pulsante)
  12.   {
  13.   case 0:
  14.     digitalWrite (led, LOW);
  15.     break;
  16.   case 1:
  17.     digitalWrite (led, HIGH);
  18.     delay (100);
  19.     digitalWrite (led, LOW);
  20.     delay (100);
  21.     break;
  22.   case 2:
  23.     digitalWrite (led, HIGH);
  24.     delay (200);
  25.     digitalWrite (led, LOW);
  26.     delay (200);
  27.     break;
  28.   case 3:
  29.     digitalWrite (led, HIGH);
  30.     delay (300);
  31.     digitalWrite (led, LOW);
  32.     delay (300);
  33.     break;
  34.   case 4:
  35.     digitalWrite (led, HIGH);
  36.     delay (400);
  37.     digitalWrite (led, LOW);
  38.     delay (400);
  39.     break;
  40.   }
  41.   delay(10);  
  42. }
  43. int lettura_pulsante()
  44. {
  45.   int Value = analogRead(A0);
  46.   if (Value > 1000) return 0;
  47.   if (Value < 100) return 1;
  48.   if (Value < 200) return 2;
  49.   if (Value < 350) return 3;
  50.   if (Value < 500) return 4;
  51. }

Questo esempio fa lampeggiare in modo diverso il led di Arduino in base al pulsante premuto.
Per fare qualcosa di diverso alla pressione dei diversi pulsanti vi basterà cambiare i comandi nel ciclo Switch Case.

Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

3 commenti:

  1. Ottimo tutorial, molto utile e versatile. Grazie

    RispondiElimina
  2. perfetto
    stavo cercando proprio qualcosa di simile per pilotare un motore dc.
    non so se posso incollare illistato

    #include
    AF_DCMotor motor(3, MOTOR12_64KHZ); // crea il motore sull'uscita 3
    int led=13;

    void setup()
    {
    Serial.begin(9600);
    Serial.println("Motor test!");
    motor.setSpeed(255); // imposta la velocità a 255 - il massimo
    pinMode (led, OUTPUT);
    }
    void loop()
    {
    int pulsante = lettura_pulsante();
    Serial.println(pulsante);
    switch (pulsante)
    {
    case 0:
    digitalWrite (led, LOW);
    motor.run(RELEASE);
    break;
    case 1:
    digitalWrite (led, HIGH);
    motor.run(FORWARD);



    break;
    case 2:
    digitalWrite (led, HIGH);
    motor.run(BACKWARD);

    break;
    case 3:
    digitalWrite (led, HIGH);
    motor.run(RELEASE);
    delay (300);
    digitalWrite (led, LOW);
    delay (300);
    break;
    case 4:
    digitalWrite (led, HIGH);
    motor.run(RELEASE);
    delay (400);
    digitalWrite (led, LOW);
    delay (400);
    break;
    }
    delay(10);
    }
    int lettura_pulsante()
    {
    int Value = analogRead(A0);
    if (Value > 1000) return 0;
    if (Value < 100) return 1;
    if (Value < 200) return 2;
    if (Value < 350) return 3;
    if (Value < 500) return 4;
    }


    ma non mi da nessun tipo di errore speriamo in bene...
    a casa proverò

    RispondiElimina
  3. ciao , sai per caso come si fa a collegare 8 pulsanti ad arduino uno (su pin digitale) . Fino a 7 non mi da problemi quando aggiungo l'ottavo mi salta quello precedente. E' una cosa normale ??

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post