ÍNDICE DE CONTEÚDO
- Franzininho WiFi: Display 7 Segmentos TM1637
- Franzininho WiFi: Primeiros passos na Arduino IDE
- Franzininho WiFi: Explorando as GPIOs com Arduino
- Franzininho WiFi: Leitura de entradas analógicas com Arduino
- Franzininho WiFi: PWM (Pulse Width Modulation) com Arduino
- Franzininho WiFi: Comunicação Serial (UART) com Arduino
- Franzininho WiFi: Servo Motor com Arduino
- Franzininho WiFi: Web Server
- Franzininho WiFi: Display OLED
- Franzininho WiFi: Sensor de temperatura e umidade DHT22
- Franzininho WiFi: Sensor de temperatura DS18B20
- Franzininho WiFi: Display LCD 16×2 com comunicação I2C
Introdução
O display de 7 segmentos certamente tornou-se um dos componentes mais utilizados para exibir informações alfanuméricas em diversas aplicações, como despertador, voltímetro, controladores de velocidade, entre outras. Esse display exige uma menor complexidade em sua construção, sendo composto por LEDs individuais com seus espaços separados (segmentados). Devido a essa simplicidade, o custo é menor em comparação com outros modelos da mesma categoria.
A desvantagem em utilizar esse display é por conta de exigir pelo menos sete pinos individuais de controle e um de alimentação (cátodo ou ânodo comum) para imprimir letras ou números, o que, em alguns projetos, pode tornar-se um problema. Sabendo disso, vamos apresentar neste artigo um exemplo de projeto utilizando o módulo TM1637 (Figura 2), o qual leva o nome do próprio circuito integrado (CI). O módulo possui interface de comunicação I2C e dispõe de quatro displays de 7 segmentos, o que possibilita reproduzir ou criar diferentes aplicações. Caso tenha interesse em conhecer mais sobre o CI, acesse o datasheet.
Instalação da Biblioteca
Vamos instalar a biblioteca TM1637Display.h , para auxiliar na configuração do canal I2C e acessar os métodos para imprimir na tela letras e/ou números em nosso exemplo de projeto. Siga os passos abaixo para realizar a instalação. Acesse: Ferramenta -> Gerenciador de Bibliotecas (Tools -> Manager Libraries):
Após acessar o Gerenciador de Bibliotecas (Manager Libraries), aguarde até que uma janela semelhante à mostrada na figura abaixo seja exibida. Digite “TM1637” no campo de texto e aguarde a conclusão da pesquisa.
Embarcados Experience 2024: Evento Presencial
Participe do Embarcados Experience 2024 em São Paulo. Conhecimento técnico, palestras, workshops e oportunidade de networking com profissionais experientes.
Procure pela biblioteca “TM1637” criada por Avishay Orpaz e clique em “Install” para concluir a instalação. Em seguida, clique em “Close“. Agora estamos prontos para utilizar a biblioteca:
Biblioteca TM1637
Nesta seção vamos abordar os métodos presentes dentro da biblioteca “TM1637.h”. Para mais informações sobre cada método acesse o repositório no GitHub.
setBrightness()
Configura a intensidade do brilho no display.
1 |
void setBrightness(uint8_t brightness ,bool on); |
- brightness : número entre 0 (baixa intensidade) a 7 (maior intensidade)
- on : liga ou desliga o display
setSegments()
Mostra na tela caracteres especiais ou pequenas palavras inserido dentro de um array de bytes sendo cada elemento representando um dígito. Cada bit representa um segmento do display (bit 0 é o segmento A, bit 1 segmento B e assim por diante).
1 |
void setSegments(const uint8_t segments[] ,uint8_t length,uint8_t pos,); |
- segments : array que contém os caracteres especiais
- length : número de digitos modificados
- pos : em qual display vai começar a mostrar ( 0 – mais a esquerda e 3 – mais a direita)
clear()
Limpa toda a tela, ou seja, desliga de cada segmento.
1 |
void clear(); |
encodeDigit()
Converte números entre 0 – 15 em código entendido pelo display de 7 segmentos.Numéro entre 10-15 são convertidos em dígitos decimais.
1 |
static uint8_t setSegments( uint8_t digit); |
- digit : digito a ser codificado
showNumberDecEx()
Mostra na tela número decimais utilizando controle de pontos.
1 |
uint8_t showNumberDecEx( uint8_t num, uint8_t dots,bool leading_zero,uint8_t length,uint8_t pos); |
- num : número que será mostrado
- dots : esse parâmetro é uma máscara de bits, correspondente a cada ponto no display. Confira se seu display possui todas as possibilidades de uso.
- 0b10000000 : para mostrar o ponto no dígito mais à esquerda no formato 0.000
- 0b01000000 : para mostrar o ponto no formato 00.00
- 0b00100000 : para mostrar o ponto no formato 000.0
- 0b11100000 : para mostrar o ponto no formato 0.0.0.0
- leading_zero : true – para mostrar os zeros, false – deixa os espaço vazio (LED apagados)
- length : número de digitos mostrados
- pos : em qual display vai começar a mostrar ( 0 – mais a esquerda e 3 – mais a direita)
showNumberDec()
Mostra na tela número decimais.
1 |
uint8_t showNumberDec( uint8_t num,bool leading_zero,uint8_t length,uint8_t pos); |
- num : número que será mostrado
- leading_zero : true – para mostrar os zeros, false – deixa os espaço vazio (LED apagados)
- length : número de digitos mostrados
- pos : em qual display vai começar a mostrar ( 0 – mais a esquerda e 3 – mais a direita)
Materiais Necessários
Os materiais necessários para desenvolver nossa aplicação são:
- Placa Franzininho WiFi
- Módulo Display 7 Segmento com TM1637
- Jumpers
- Arduino IDE
Circuito
A seguir temos a montagem do circuito. O módulo comunica-se via I2C, verifique as conexões antes de ligar o display.
- VCC : conectado ao 3.3v
- GND : conectado ao GND da placa Franzininho
- CLK : pino responsável por receber clock da comunicação I2C, conectado a GPIO 9
- DIO: pino recebe os dados da comunicação I2C para escrever no display, conectado a GPIO 8
Código
No projeto proposto, faremos uma demonstração de uso com o módulo TM1637 e os recursos que a biblioteca pode oferecer quando utilizada em nossos projetos. Abaixo segue o código, e caso tenha alguma dúvida, volte à seção “Biblioteca TM1637“.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#include <TM1637Display.h> #define SCL 9 #define SDA 8 // Declara o objeto TM1637Display TM1637Display display(SCL, SDA, DEFAULT_BIT_DELAY); // Define o padrão para exibir o retângulo const uint8_t ret[] = { SEG_A|SEG_F|SEG_E|SEG_D, SEG_A|SEG_D, SEG_A|SEG_D, SEG_A|SEG_B|SEG_C|SEG_D }; const uint8_t one_seg[] = { SEG_G }; const uint8_t turn_off_one_seg[] = { 0x00 }; // Função que realiza uma animação no display void animation() { int i; // Animação de ida for (i = 0; i < 4; i++) { display.setSegments(one_seg, 1, i); // Mostra o segmento no índice i delay(500); display.setSegments(turn_off_one_seg, 1, i); // Desliga o segmento no índice i } // Animação de volta for (i = 3; i >= 0; i--) { display.setSegments(one_seg, 1, i); delay(500); display.setSegments(turn_off_one_seg, 1, i); } } void setup() { // Inicializa a comunicação serial na velocidade de 115200 bps Serial.begin(115200); // Define a intensidade luminosa do display (0-7) display.setBrightness(5); // Limpa o display display.clear(); // Formato para mostrar hora e minuto (14:15) int time_in_display = (14 * 100) + 15; display.showNumberDecEx(time_in_display, 0b11100000, true); delay(1500); display.clear(); // Cria um retângulo no display display.setSegments(ret, 4, 0); delay(1500); display.clear(); // Mostra o número -10 no display display.showNumberDec(-10); delay(1500); display.clear(); // Mostra o número 15 no display (com o sinal de menos) display.showNumberDec(15, true); delay(1500); display.clear(); // Mostra o número 20 no display (sem o sinal de menos) com dois dígitos (20) display.showNumberDec(20, false, 2, 1); delay(2000); display.clear(); } void loop() { // Executa a animação animation(); } |
Simule esse projeto no Wokwi: https://wokwi.com/projects/370090219547815937
Explicação do Código
Incluir a biblioteca para acessar os métodos e configurar a comunicação I2C
1 |
#include <TM1637Display.h> |
Define os pinos da comunicação I2C (Serial Clock e Serial Data)
1 2 |
#define SCL 9 #define SDA 8 |
Declarar o construtor incluindo os parâmetros de pinos (SCL e SDA) e o tempo de resposta para escrita dados no barramento, por padrão é 100 milisegundo (DEFAULT_BIT_DELAY), mas pode ser alterado de acordo com o projetista.
1 2 |
// Declara o objeto TM1637Display display ( SCL, SDA, DEFAULT_BIT_DELAY) ; |
Vetor contendo o identificador de cada segmento do display para criar elementos específicos, nesse caso vamos utilizar para criar um retângulo com segmentos especificos de cada um dos displays.
1 2 3 4 5 6 7 |
const uint8_t ret[] = { SEG_A|SEG_F|SEG_E|SEG_D, SEG_A|SEG_D, SEG_A|SEG_D, SEG_A|SEG_B|SEG_C|SEG_D }; |
Vetor contendo o identificador de apenas um segmento do display.
1 2 3 4 |
const uint8_t one_seg[] { SEG_G }; |
Vetor contendo o identificador para apagar o segmento do display.
1 2 3 4 |
const uint8_t turn_off_one_seg[] { 0x00 }; |
Função que criar uma animação utilizando um único segmento do display, nesse caso acessa o vetor declarado anteriormente, one_seg
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void animation() { int i; for(i = 0; i<4;i++) { display.setSegments(one_seg,1,i); delay(500); display.setSegments(turn_off_one_seg,1,i); } for(i =3 ;i>=0;i--) { display.setSegments(one_seg,1,i); delay(500); display.setSegments(turn_off_one_seg,1,i); } } |
No setup vamos configurar a intensidade luminosa do display e limpar a tela. Diferente das outras bibliotecas que estejam acostumados, não há um método begin().
1 2 3 4 |
// 0 -7 a intensidade luminosa do display display. setBrightness (5); // Limpa tela do display display.clear(); |
Após essa etapa vamos começar a demo do display mostrando como podemos utilizar em aplicações que envolvam temporizadores (cronômetro, relógio, despertadores), aguardar 1,5 segundo e limpar a tela.
1 2 3 4 5 |
// Formato para mostrar hora e minuto int time_in_display = (14 * 100)+ 15; display.showNumberDecEx(time_in_display, 0b11100000,true); delay(1500); display.clear(); |
Exemplo de utilizar um caractere especial(normalmente para letras) para imprimir na tela, aguarda um tempo e limpa a tela
1 2 3 4 |
// Criar um retângulo display.setSegments(ret,4,0); delay(1500); display.clear(); |
Nessa etapa demo vamos apresentar formas de colocar na tela número negativo, positivos e como posicionar na tela utilizando os mesmo métodos.
1 2 3 4 5 6 7 8 9 |
display.showNumberDec(-10); delay(1500); display.clear(); display.showNumberDec(15, true); delay(1500); display.clear(); display.showNumberDec(20, false, 2, 1); // Mostra na tela _10_ delay(2000); display.clear(); |
No loop, vamos chamar a função responsável por criar a animação de um segmento.
1 2 3 4 |
void loop() { animation(); } |
Conclusão
Nesse artigo apresentamos de uma prática como utilizar o módulo TM1637 em seus projetos e como podemos utilizar para interagir com sensores ou atuadores. A desvantagem do módulo em utiliza displays de 7 segmentos é a limitação em criar letras o que pode agregar mais valor para aplicação. Como sugestão, procure por outros modelos de display que possuem mais segmentos na tela, estes modelos podem imprimir mais caracteres por tela. Por outro lado, as vantagens em utilizar este módulo deve-se pelo fato de simplificar o projeto e de criar animações de um feito simples e fácil. Portanto, convidamos os entusiastas a conhecerem mais sobre o projeto Franzininho e compartilhar seu projetos ou ideias em forma de artigo ou vídeo.