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); }