Dicas

Controlando 2 Leds com um pino do Arduino

Você sabia que é possível ligar dois LEDs independentes em apenas um pino do Arduino? Hoje veremos como fazer isso e otimizar seus circuitos, especialmente quando estão faltando pinos em seus designs.

Em alguns projetos grandes podem ser necessárias técnicas para redução de pinos utilizados, visto que funções importantes ocupam a maioria das portas disponíveis. Algumas vezes podemos resolver isso utilizando microcontroladores maiores, como o Arduino Mega. Outras vezes estes custo se torna proibitivo e temos que “dar nosso jeito” de outra forma.

É aí que entram técnicas como a multiplexação e o charlieplexing, permitindo fazer “mais coisas” com menos portas do nosso Arduino. Porém algumas vezes nem é necessário colocar chips ou circuitos integrados a mais, se temos que ligar (por exemplo) apenas dois LEDs, existe uma forma fácil de resolver esta demanda.

O diagrama esquemático abaixo ilustra nossa solução, onde temos dois LEDs em série com o pino de controle no meio, entre eles. Colocando este pino em nível alto vai ligar o LED de baixo, já colocando-o em nível baixo vai ligar o LED de cima. 

Fonte: o autor

Mas e como desligar os dois LEDs? Para isso basta definir este pino digital como entrada, ele age como se tivesse “alta impedância”, não permitindo a circulação de nenhuma corrente. A explicação para o funcionamento deste circuito é a seguinte: colocando os dois LEDs em série, a tensão necessária para acioná-los é maior do que a tensão que a fonte pode oferecer, então eles não ligam.

Oferecendo-se uma tensão no pino entre eles faz com que um dos dois se energize, dependendo do nível lógico aplicado. No caso do circuito que montei eu utilizei 3,3V, insuficiente para os dois LEDs em série se energizarem.

Na prática este tipo de circuito funciona apenas com LEDs, visto que não é possível garantir um nível lógico consistente da forma que montamos o circuito, com dois LEDs em série. 

O circuito na prática

Montei o circuito em uma protoboard com dois LEDs verdes. Fiz um código para que a cada 500 milissegundos (0,5 segundos) um estado fosse atingido.

 

Fonte: o autor

Primeiro o LED “de cima”, acionado com nível lógico baixo; depois o LED “de baixo” acionado com nível lógico alto; finalmente nenhum dos dois LEDs, transformando o pino D1 em uma entrada digital.

Fonte: o autor

Primeiro o LED “de cima”, acionado com nível lógico baixo; depois o LED “de baixo” acionado com nível lógico alto; finalmente nenhum dos dois LEDs, transformando o pino D1 em uma entrada digital.

 

#define LED D1


long oldtime;
int counter= 1;


void setup() {
  // put your setup code here, to run once:
  pinMode(LED, OUTPUT);
 
}


void loop() {
  // put your main code here, to run repeatedly:
  if(millis() - oldtime > 500){
    oldtime= millis();


   
    if(counter == 1){
      pinMode(LED, OUTPUT);
      digitalWrite(LED, LOW);
      counter= counter + 1;
    }else if(counter == 2){
      digitalWrite(LED, HIGH);
      counter= counter + 1;
    }else{
      pinMode(LED, INPUT);
      counter= 1;
    }
   
  }
 
}
O vídeo abaixo exemplifica o código acima, aproveite:

https://youtube.com/shorts/JIolENvljAY?feature=share

Autor


Avatar

Clovis Fritzen

Engenheiro eletricista e técnico em eletrônica, tem um interesse por sistemas embarcados (aos quais chama de "plaquinhas") e eletrônica desde muito cedo. Tem um blog em Inglês (FritzenLab.net) e outro em Português (FritzenLab.com.br), onde posta tutoriais e reviews das "plaquinhas".