Este artigo vai lhe ensinar como controlar um display de 7 segmentos com ESP32-C6 – anodo comum. Já vimos tais displays de 7 segmentos antes, aqui, na configuração de catodo comum. Agora estamos controlando um de anodo comum.
Anodo comum significa que o pino “positivo” ou 3,3 V/5 V deste display é o comum. Cada outro pino precisa ser colocado em 0 V/GND para que o segmento acenda. Veja a imagem abaixo para detalhes (a da direita).

Controlar tal display é fácil o bastante, tudo o que você precisa fazer é acender o segmento correspondente (A..G ou DP) no momento certo. Não há necessidade de multiplexação, mas você precisa de oito pinos disponíveis do seu microcontrolador (isso é uma desvantagem). Por exemplo, para fazer o número um (1), você precisa que os segmentos B e C acendam.
Hardware
Estamos usando um Xiao ESP32-C6 (da SeeedStudio) para este experimento, mas ele deve funcionar com literalmente qualquer Arduino. Isso se deve ao fato de que estamos usando apenas funções comuns do Arduino, como digitalWrite() e millis(). Também há a necessidade de um resistor para cada segmento/LED, estou usando 8x 820 Ohm, mas você pode diminuir para 220 Ohm cada, se quiser.


Código/Firmware
Conforme dito antes, estamos usando código Arduino com Arduino IDE para programar e controlar este display. Se você for usar qualquer placa, exceto as “comuns”, você precisa instalar suporte para ela no Arduino IDE (como visto aqui). Decidi criar um esboço que conta de 0 a 9 e vice-versa, incrementando o contador a cada 500 ms (meio segundo).
Um dos “bons problemas” que você tem com um display LED de 7 segmentos é como converter um inteiro (um número) em cada segmento para acender. Não há matemática ou física pronta para ser usada, você tem que dizer manualmente que (por exemplo) o número 8 acende cada segmento.
O que eu fiz foi criar uma função chamada “displayControl(integer-here)” que pega um número (em “integer-here”) e faz um monte de cláusulas IF. Se o número que veio foi “0” faz isso, se foi “5” faz aquilo e assim por diante. Então eu faço digitalWrite() em cada pino com o correspondente “0” ou “1” que foi decidido acima.
Olhe para o código abaixo. Observe que ele não é bloqueante, significa que não usa delay() e você pode usá-lo lado a lado com qualquer outro código. O que eu faço é controlar o tempo e inserir a declaração IF a cada 500 ms; no resto do tempo, o Arduino está livre para executar qualquer outro código.
long oldtime= 0;
int i= 0;
void setup() {
// put your setup code here, to run once:
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(D5, OUTPUT);
pinMode(D6, OUTPUT);
pinMode(D7, OUTPUT);
pinMode(D8, OUTPUT);
pinMode(D9, OUTPUT);
pinMode(D10, OUTPUT);
}
void displayControl(int seg){
int segments[8]= {0};
if(seg == 0 || seg > 9){ // DP, g, f, ....
segments[0]=1;
segments[1]= 1;
segments[2]=0;
segments[3]=0;
segments[4]=0;
segments[5]=0;
segments[6]=0;
segments[7]=0;
}else if(seg == 1){ // DP, g, f, ....
segments[0]=1;
segments[1]=1;
segments[2]=1;
segments[3]=1;
segments[4]=1;
segments[5]=0;
segments[6]=0;
segments[7]=1;
}else if (seg == 2){ // DP, g, f, ....
segments[0]=1;
segments[1]=0;
segments[2]=1;
segments[3]=0;
segments[4]=0;
segments[5]=1;
segments[6]=0;
segments[7]=0;
}else if(seg == 3){ // DP, g, f, ....
segments[0]=1;
segments[1]=0;
segments[2]=1;
segments[3]=1;
segments[4]=0;
segments[5]=0;
segments[6]=0;
segments[7]=0;
}else if(seg == 4){ // DP, g, f, ....
segments[0]=1;
segments[1]=0;
segments[2]=0;
segments[3]=1;
segments[4]=1;
segments[5]=0;
segments[6]=0;
segments[7]=1;
}else if(seg == 5){ // DP, g, f, ....
segments[0]=1;
segments[1]=0;
segments[2]=0;
segments[3]=1;
segments[4]=0;
segments[5]=0;
segments[6]=1;
segments[7]=0;
}else if(seg == 6){ // DP, g, f, ....
segments[0]=1;
segments[1]=0;
segments[2]=0;
segments[3]=0;
segments[4]=0;
segments[5]=0;
segments[6]=1;
segments[7]=0;
}else if(seg == 7){ // DP, g, f, ....
segments[0]=1;
segments[1]=1;
segments[2]=1;
segments[3]=1;
segments[4]=1;
segments[5]=0;
segments[6]=0;
segments[7]=0;
}else if(seg == 8){ // DP, g, f, ....
segments[0]=1;
segments[1]=0;
segments[2]= 0;
segments[3]=0;
segments[4]=0;
segments[5]=0;
segments[6]=0;
segments[7]=0;
}else if(seg == 9){ // DP, g, f, ....
segments[0]=1;
segments[1]=0;
segments[2]=0;
segments[3]=1;
segments[4]=1;
segments[5]=0;
segments[6]=0;
segments[7]=0;
}
digitalWrite(D3, segments[0]);
digitalWrite(D4, segments[1]);
digitalWrite(D5, segments[2]);
digitalWrite(D6, segments[3]);
digitalWrite(D7, segments[4]);
digitalWrite(D8, segments[5]);
digitalWrite(D9, segments[6]);
digitalWrite(D10, segments[7]);
}
void loop() {
// put your main code here, to run repeatedly:
if(millis() - oldtime > 500){ // enters the display function every "x" milisseconds
oldtime= millis();
if(i < 10){ // counts from 0 to 9
displayControl(i); //sends an integer between 0 and 9 to the display
i++;
}else{
i= 0;
}
}
}
Resultado final
O código acima itera sequencialmente entre 0 e 9 inteiros, quando atinge 9 ele volta para 0 na próxima iteração. Esta é uma aplicação simples apenas para demonstrar que é possível automatizar tais tarefas no Arduino. Veja o vídeo e sinta-se à vontade para comentar abaixo ou no Youtube.
Deixe um comentário