Entrada e saída no mesmo pino

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.

Entrada e saída no mesmo pino (LED + Botão)
Entrada e saída no mesmo pino (LED + Botão)

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.

Autor: Djones Boni

Engenheiro Eletricista e Eletrônico. Professor de Engenharia Eletrônica na UTFPR Toledo. Interesses: Sistemas eletrônicos embarcados e de tempo real.

Um comentário em “Entrada e saída no mesmo pino”

  1. era isso que precisava, mas que pena,
    só vejo arduino nessa inernet, parece que os pics e compiladores para tals estao sumindo!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *