Arduino Playground is read-only starting December 31st, 2018. For more info please look at this Forum Post

Dois botões e um pino

Dentro do chip Atmega presente na placa Arduino, existem resistores de pull-up (isto é, conectados entre os pinos do Arduino e a alimentação de 5 volts) muito práticos, acessíveis via software por meio do uso da função digitalWrite() quando o pino está ajustado como entrada.

O esboço a seguir explora esses resistores de pull-up sob controle por software. A idéia é que, quando usamos um resistor externo de 200 kohms ligado à terra, o pino reportará LOW se o resistor interno estiver desligado. Quando ligado, entretanto, o resistor externo será sobrecarregado e o pino reportará HIGH.

Uma desvantagem do esquema (sempre há um porém, não é mesmo?) é que não se pode saber quando os dois interruptores foram apertados ao mesmo tempo, pois nesse caso o esboço admitirá que apenas o SW2 foi o botão pressionado. A função do resistor de 10 kohms é prevenir um curto-circuito caso um usuário mais teimoso ouse apertar os dois botões simultaneamente. Esse resistor poderá ser removido se for usado um interruptor de estados mutuamente excludentes.

Código

/*
 * Ler_Dois_Botões_Com_Um_Pino
 * Lê dois interruptores ou um botão on-off com um pino do Arduino
 * Paul Badger 2008 
 * Baseado em uma ideia da EDN (Electronic Design News)
 *
 * Explora o resistor pull-up disponível em cada E/S e pino analógico
 * A ideia é que o resistor de 200K à terra forçará o pino de entrada a reportar LOW quando o 
 * resistor de pull-up (20K) for desligado, mas quando ligado, 
 * sobrecarregará o resistor de 200K e o pino reportará HIGH.
 *
 * Diagrama esquemático (nem acredito que fui eu que desenhei esse esquemazinho ascii)     
 *
 *
 *                             +5 V
 *                                |
 *                                \
 *                                /   
 *                                \    10K
 *                                /
 *                                \
 *                                |
 *                               /    SW1
 *                              /       
 *                                |
 *            digital pin ________+_____________/\/\/\____________   ground              
 *                                |               
 *                                |               200K to 1M  (not critical)
 *                               /   
 *                              /        SW2
 *                                |
 *                                |
 *                              _____   
 *                               ___     ground
 *                                _
 *
 */


#define swPin 2                 // pino de entrada - nota: sem ponto-e-vírgula após #define
int stateA, stateB;             // variáveis a guardar estados dos botões
int sw1, sw2;                   // variáveis a representar estados dos botões 

void setup()                   
{
   Serial.begin(9600);
}

void loop()            
{
   digitalWrite(swPin, LOW);                   // desligue os resistores de pullup
   stateA = digitalRead(swPin);
   digitalWrite(swPin, HIGH);                  // ligue
   stateB = digitalRead(swPin);

   if ( stateA == 1 && stateB == 1 ){          // ambos estados HIGH - SW1 foi pressionado
      sw1 = 1;
      sw2 = 0;
   }
   else if ( stateA == 0 && stateB == 0 ){     // ambos estados LOW - SW2 foi pressionado
      sw1 = 0;
      sw2 = 1;
   }
   else{                                       // stateA HIGH e stateB LOW 
      sw1 = 0;                                 // nenhum botão apertado
      sw2 = 0;
   }  

   Serial.print(sw1);
   Serial.print("    ");     // espaçadores para formatar a saída
   Serial.println(sw2);

   delay(100);  
}