Seu projeto está indo muito bem. De repente é necessário adicionar um botão, mas não há nenhum pino do microcontrolador disponível. O que fazer? Utilizar entrada e saída no mesmo pino!
Neste post veremos como utilizar o circuito abaixo para dobrar a funcionalidade de um pino do microcontrolador: acionar um LED e ler um botão através do mesmo pino.

Inscreva-se em nossa lista de emails para ser avisado sobre novos posts em resumos semanais.
Entrada e saída no mesmo pino
A parte superior do circuito já é bem conhecida, onde um LED é acionado (ligado e desligado) através de um IO do microcontrolador. Nível baixo no pino liga o LED e nível alto no pino desliga o LED.
A parte inferior do circuito também é bem conhecida. O botão curto-circuita o pino ao terra enquanto o pino possui um resistor de pull-up interno. O pino lê nível alto com o botão solto e nível baixo com o botão pressionado.
Aqui o truque é juntar ambas funções entrada e saída no mesmo pino. Mas com o poder, vêm as responsabilidades! Precisamos tomar alguns cuidados para o funcionamento correto do circuito.
Não podemos configurar o pino como saída em nível alto (OUTPUT HIGH), pois pressionando o botão criará um curto-circuito que provavelmente vai danificar o circuito de saída do pino, podendo até danificar o microcontrolador inteiro!
Outra configuração que não deve ser usada é de entrada sem pull-up (INPUT), pois o LED causará uma queda de tensão que pode colocar o pino do microcontrolador em uma região instável, causando consumo desnecessário e incapacidade de realizar a leitura do botão neste estado.
Não podemos ligar o LED e realizar a leitura do botão ao mesmo tempo. Mas podemos desligar o LED, realizar a leitura do botão e restaurar o estado anterior do LED. Isso tudo mais rápido do que nossos olhos podem perceber.
Outro fato a se levar em consideração é que o LED ligará quando o botão for pressionado.
E caso o microcontrolador não possuir pull-up interno no pino em uso é necessário adicionar um resistor externo de pull-up, em paralelo com o LED e resistor (do pino para +VCC).
Configurações do pino
Abaixo vemos a lista dos estados que devemos (ou não) utilizar para entrada e saída no mesmo pino.
LED BOTÃO INPUT_PULLUP DESLIGADO Leitura do botão OUTPUT LOW LIGADO Não é possível ler o botão Use apenas como estado intermediário: INPUT possível incapacidade de ler o botão Nunca usar em momento algum: OUTPUT HIGH curto-circuito destrutivo
Código de exemplo
Abaixo temos um código em C++/Arduino para exemplificar como deve ser feita a troca de estados para ligar/desligar o LED e ler o botão.
Note que na função led_off() não podemos pinMode(INPUT_PULLUP) no lugar do par pinMode(INPUT) e digitalWrite(HIGH), pois não sabemos em que ordem ela realiza a troca dos estados.
// C++/Arduino
#define LED_BUTTON 13
bool led_state = false; // false:OFF, true:ON
void led_on(void) {
led_state = true;
// LED_BUTTON = OUTPUT LOW
// Nesta ordem para evitar estado OUTPUT HIGH
digitalWrite(LED_BUTTON, LOW); // Desabilita pull-up
pinMode(LED_BUTTON, OUTPUT); // Saída em nível baixo
}
void led_off(void) {
led_state = false;
// LED_BUTTON = INPUT PULLUP
// Nesta ordem para evitar estado OUTPUT HIGH
pinMode(LED_BUTTON, INPUT); // Entrada
digitalWrite(LED_BUTTON, HIGH); // Habilita pull-up
}
bool button_read(void) {
bool button;
// LED_BUTTON = INPUT PULLUP
led_off();
// Talvez seja necessário um pequeno delay
// delayMicrosseconds(10);
// Ler estado do botão
button = !digitalRead(LED_BUTTON);
// Restaura LED_BUTTON se necessário
if(led_state) {
led_on();
}
return button;
}
void setup() {
led_off();
}
void loop() {
led_on();
led_off();
if(button_read()) {
// Botão pressionado
}
else {
// Botão solto
}
}
Compartilhe!
Gostou do post? Foi útil? Clique abaixo e compartilhe com seus amigos!
Veja mais posts sobre Hardware.
Era isso o que precisava.
Mas que pena, que só vejo Arduino nessa internet.
Parece que os PICs e compiladores para tais estão sumindo!