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.
/*
* 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);
}