Recapitulando
Nas duas últimas aulas mostramos o uso dos Displays 7 de segmentos como dispositivos de saída, sejam eles usados individualmente ou com decodificadores BCD. Em ambos os exemplos utilizei funções que eu mesmo criei para exibir números.
No entanto existe uma biblioteca chamada SevSeg.h que facilita muito a nossa vida na hora de trabalhar com esses displays, por isso achei melhor criar outro post para aborda-la.
Conhecendo a Biblioteca SevSeg.h
Essa biblioteca funciona tanto para um único display de 7 segmentos com também para um conjunto de dois, três ou quatro displays em um único encapsulamento, mas que não estejam em módulos com circuitos que reduzam o número de pinos.
Para verificar sua compatibilidade, esse conjunto deverá conter os oito terminais para os segmentos a, b, c, d, e, f, g e ponto decimal, mais um terminal para cada dígito do conjunto, fora os terminais COMUM e CLN. A título de exemplo, um conjunto de displays de quatro dígitos terá quatorze terminais.
Nessa biblioteca temos uma classe chamada SevSeg a partir da qual instanciamos objetos de sete segmentos que ao serem iniciados devem receber como parâmetros:
- Se o display é do tipo cátodo ou anodo comum
- O número de dígitos que o display tem
- Uma matriz com os pinos de cada dígito do display (d1, d2, d3 e d4)
- Uma matriz com os pinos dos segmentos a, b, c, d, e, f, g e ponto decimal
- Um booleano se o limite de corrente será controlado por software
- Um booleano se o display deve atualizar com atrasos
- Um booleano se o display deve trabalhar com zeros iniciais
- Um booleano se o display deve desabilitar ponto decimal
A Montagem
Para ganhar tempo estou disponibilizando a montagem pronta que o estudante poderá salvar uma cópia no seu perfil. Essa primeira montagem é simples, funciona bem com uma única leitura a ser mostrada, mas não funcionará adequadamente para duas leituras como as de um DHT (temperatura e umidade). Para isso farei outra montagem.
![]() |
Montagem com display de 4 dígitos e potenciômetro |
Link: https://wokwi.com/projects/413923318385980417
O Sketch
Nesse Sketch temos a inclusão da biblioteca SevSeg.h na primeira linha. Caso o Wokwi falhe ao instalar a biblioteca para você, experimente clicar em Library Manager, depois no botão +, digite SevSeg e clique na biblioteca disponibilizada na lista.
![]() |
Inclusão manual de biblioteca no Wokwi |
Depois na linha 2, temos o instanciamento do objeto sevseg com base na classe SevSeg da biblioteca incluída. Como utilizarei um potenciômetro, estou declarando uma variável para armazenar o seu pino (A0 ou 14). Também estou declarando uma variável valor para armazenar inteiros da leitura desse potenciômetro.
O uso propriamente dito da SevSeg começa na função setup() onde declaramos variáveis para armazenar a quantidade de dígitos (linha 6) e uma matriz para armazenar os pinos dos dígitos em ordem crescente, isto é, do digito 1 ao 4 (linha 7).
Além disso declaramos uma matriz para armazenar os pinos dos segmentos do display em ordem crescente, isto é, do terminal A para o G, sendo o segmento do Ponto Decimal deixado por último. As demais variáveis e constantes são os parâmetros que configuram o funcionamento do display e que comentamos anteriormente.
A booleano resistor é falso porque o controle do limite da resistência não será feito por software. O tipo usa a macro COMMON_CATHODE porque optamos que o nosso display é do tipo cátodo comum, o mais encontrado no mercado, mas deixei comentado como seria se fosse outro tipo.
![]() |
Clicando no display podemos selecionar o tipo, número de dígitos e a cor dos segmentos |
Deixamos a iniciacomzeros false porque não queremos os valores sendo mostrados como 0001, 0007, 0010, etc e pontodecimal true porque nessa montagem quero que ele desabilite o ponto decimal.
Quanto a atualizacomatraso, a recomendação de todos os texto que encontrei pela Web é que devemos deixar como falso, mas não achei nenhuma explicação técnica coerente sobre isso. A explicação mais sincera e engraçada em um fórum foi algo como "Deixe falso, porque? Não faço ideia".
Ai finalmente temos a inicialização do objeto sevseg com o método begin() com todos os parâmetros acima citados. Depois é só configurar o brilho do objeto com setBrightness().
Na função loop(), para esse primeiro exemplo eu deixei o código bem simplificado. Estou apenas pegando a leitura do potenciômetro e mapeando sua escala de 0 a 1023 para a escala do display de 0 a 9999.
Depois foi só colocar o valor no display com o método setNumber() e atualizá-lo com refreshDisplay().
- #include "SevSeg.h"
- SevSeg sevseg;
- int potenciometro=14;
- int valor=0;
- void setup() {
- byte quantidade = 4;
- byte pdigitos[] = {10,11,12,13};
- byte psegmentos[] = {2,3,4,5,6,7,8,9};
- bool resistor = false;
- //byte tipo = COMMON_ANODE;
- byte tipo = COMMON_CATHODE;
- bool atualizacomatraso = false;
- bool iniciacomzeros = false;
- bool pontodecimal = true;
- sevseg.begin(tipo, quantidade, pdigitos, psegmentos, resistor,
- atualizacomatraso, iniciacomzeros, pontodecimal);
- sevseg.setBrightness(90);
- }
- void loop() {
- valor=map(analogRead(potenciometro),0,1023,0,9999);
- sevseg.setNumber(valor);
- sevseg.refreshDisplay();
- }
Repito que esse código atende a maioria dos problemas para mostrar uma leitura de sensor no display, mas o estudante terá dificuldades se forem duas leituras devido a uma série de detalhes sobre essa biblioteca. Por isso será vamos tratar de uma outra montagem
Outra montagem
Para essa segunda montagem também deixarei o link abaixo para ganharmos tempo e o aluno poder salvar uma cópia em seu perfil. O que teremos de diferente é o uso de um DHT22 no lugar do potenciômetro para pegar leituras de temperatura e umidade.
Fora isso a montagem é praticamente a mesma, mas repare pela imagem que, desta vez, eu preciso de números decimais e serão duas leituras, conforme pode ser visto no print do monitor serial.
![]() |
Montagem com SevSeg e DHT22 |
Link: https://wokwi.com/projects/414008148018127873
Segundo Sketch
O que vai mudar drasticamente é o código. Ele vai ter a biblioteca SevSeg com todos os elementos criados no código anterior, mas também tem a inclusão da biblioteca DHTLib com basicamente todos os elementos que criamos na aula de DHT. Clique aqui se você esqueceu.
Então teremos o objeto do display e o objeto do sensor com todas as variáveis e matrizes comentadas nos códigos anteriores, mas repare que na linha 7 a variável valor agora é um float porque eu vou precisar de temperaturas com números decimais.
Como precisarei de decimal, estou falando para o código não omitir o ponto decimal na linha 19.
Repare também que eu não criei uma variável temperatura ou umidade, porque eu pretendo continuar usando a mesma variável valor, só que em um momento ela mostrará temperatura e em outro a umidade, intercalando o uso do display.
Como vai intercalar entre um e outro, eu declarei uma variável booleana chamada intercala para controlar isso. Você já vai entender como. De diferente eu também vou iniciar o monitor serial para você também acompanhar as mudanças de leitura nele.
Agora vamos aquilo que é drasticamente diferente e complicado: Na função loop você reparou que tem um laço do tipo While que é rodado enquanto um determinado intervalo tempo é menor que 2000 milisegundos.
Repare que essa variável intervalo é número longo sem sinal que é inicializada atribuindo a ela o valor da função millis(). Essa função retorna o número de milissegundos passados desde que a placa Arduino começou a executar o programa atual. E o que o laço While está fazendo? Apenas atualizando o display.
Assim como eu quando olhei isso pela primeira vez, você deve estar pensando: "Nossa! Que lógica esdrúxula! Não era mais fácil colocar um Delay(2000)?"... Infelizmente não. Se você tentar substituir esse laço por um simples delay() passará horas como eu tentando rodar o programa sem sucesso.
Com o delay(), dependendo de como você fizer, uma hora o código pisca o resultado na tela e você não consegue ler ou fica colocando um dígito de cada vez e sem o delay() fica o tempo todo colocando a mesma leitura na tela.
A razão disso é que, com o laço, o comando de atualização é executado diversas vezes, dando a condição para uma leitura legível.
Depois dessa novidade o código é parecido com o da aula de DHT, isto é, eu atribuo a variável de verificação a leitura do DHT. Se a leitura for ok sem erros (linha 33) e passo a verificar a variável que intercala as leituras como eu havia dito que faria.
Se intercalar é verdadeiro, eu pego a leitura da umidade (linhas 34 a 37). Senão, eu pego a leitura de temperatura (linhas 38 a 41). Quando sair dessas condicionais if else eu pego a variável intercalar e faço ela ser o seu oposto, isto é, muda de false para true e vice-versa (linha 43).
Ai finalmente eu vou colocar o valor no display e temos outra novidade: No método setNumber() eu tenho outros parâmetros que no exemplo anterior não tinha usado. Vou explicar da direita para a esquerda.
Eu usei LOW para dizer que quero a leitura em um número decimal. Outra opção seria colocar HIGH e ele escreveria em hexadecimal, que pra nós não interessa. O parâmetro 1 diz pra ele que eu quero o primeiro dígito mostrando a primeira casa decimal.
No entanto o que realmente vai garantir o posicionamento correto do decimal será multiplicar o valor por 10. Entedeu?
- #include "SevSeg.h"
- #include <dht.h>
- SevSeg sevseg;
- dht sensor;
- #define pino 14
- int verificacao;
- float valor=0.0;
- bool intercala=false;
- void setup() {
- byte quantidade = 4;
- byte pdigitos[] = {10,11,12,13};
- byte psegmentos[] = {2,3,4,5,6,7,8,9};
- bool resistor = false;
- //byte tipo = COMMON_ANODE;
- byte tipo = COMMON_CATHODE;
- bool atualizacomatraso = true;
- bool iniciacomzeros = false;
- bool pontodecimal = false;
- sevseg.begin(tipo, quantidade, pdigitos, psegmentos, resistor,
- atualizacomatraso, iniciacomzeros, pontodecimal);
- sevseg.setBrightness(90);
- Serial.begin(9600);
- }
- void loop() {
- unsigned long intervalo = millis();
- while (millis() - intervalo < 2000)
- {
- sevseg.refreshDisplay();
- }
- verificacao = sensor.read22(pino);
- if (verificacao==DHTLIB_OK) {
- if (intercala){
- valor=sensor.humidity;
- Serial.print("Umidade: ");
- }
- else{
- valor=sensor.temperature;
- Serial.print("Temperatura: ");
- }
- }
- intercala=!intercala;
- sevseg.setNumber(valor*10,1,LOW);
- Serial.println(valor);
- }
Com esse exemplo encerro essa parte de display de 7 segmentos, mas sugiro a você fazer alguns testes com o setNumber() mudando aqueles parâmetros de comentei. Por exemplo, use 2 no lugar de 1, coloque HIGH no lugar de LOW. Enfim, brinque um pouco. Nos vemos na próxima.
Referências
ARDUINO. SevSeg. Disponível em <https://docs.arduino.cc/libraries/sevseg/> Acesso em 11 nov 2024.
ARDUINO E AUTOMAÇÃO. Como configurar displays de 7 segmentos no Arduino. Disponível em <https://www.arduinoeautomacao.com.br/ar/all-blogs/domotica/como-configurar-displays-de-7-segmentos-no-arduino> Acesso em 11 nov 2024.
ARDUINO FORUM. 7-segment Display Unit driven by SevSeg.h Library. Disponível em <https://forum.arduino.cc/t/7-segment-display-unit-driven-by-sevseg-h-library/883182> Acesso em 11 nov 2024.
USINA INFOR. Display 7 Segmentos Arduino: Tutorial para Projetos. Disponível em <https://www.usinainfo.com.br/blog/display-7-segmentos-arduino-tutorial-para-projetos/> Acesso em 11 nov 2024.