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!