Tutorial STM32: Relógio Digital com Display 7 Segmentos

Este artigo unificado combina teoria e prática para desenvolver um relógio digital robusto com STM32O que é STM32 e por que usá-lo?O que é STM32 e por que usá-lo?Descubra os principais benefícios, arquitetura ARM Cortex-M e aplicações práticas dos microcontroladores STM32. Comece a inovar agora. e display de 7 segmentos. Abordamos desde a seleção de componentes até técnicas avançadas como multiplexação, uso do RTC interno, calibração e estratégias de depuração. Ideal para quem busca profundidade técnica e aplicação em sistemas embarcados.

Sumário🔗

2. Componentes e Materiais Necessários

3. Funcionamento do Display de 7 Segmentos

4. Montagem do Hardware

5. Lógica de Controle e Multiplexação

6. Programação do Relógio

7. Otimizações e Técnicas Avançadas

8. Testes, Depuração e Expansões

Introdução🔗

Desenvolver um relógio digital com STM32 e display de 7 segmentos é um projeto que envolve integração de hardware, temporização precisaUsando temporizadores para criar delays precisosUsando temporizadores para criar delays precisosDescubra como configurar temporizadores STM32 para criar delays precisos com polling, interrupções e DMA, otimizando energia em sistemas embarcados. e controle eficiente de periféricos. Este guia aborda tanto a teoria (funcionamento de displays, multiplexação) quanto a prática (código otimizado, configuração do RTC), incluindo dicas para reduzir consumo de energia e expandir funcionalidades.

Componentes e Materiais Necessários🔗

ComponenteEspecificações
MicrocontroladorSTM32F103C8T6 (Blue Pill) ou similar
Display de 7 segmentos4 dígitos, Common Cathode (exemplo)
Resistores220Ω–330Ω por segmento
Fonte de alimentação3.3V ou 5V (conforme display)
Cristal oscilador32.768 kHz (opcional para RTC preciso)
Protoboard e fiosPara conexões
SoftwareSTM32CubeIDE, STM32CubeMX

Funcionamento do Display de 7 Segmentos🔗

Um display de 7 segmentos consiste em 7 LEDs (a-g) e um ponto decimal (DP). Dois tipos são comuns:

  • Common Cathode: Todos os catodos são conectados a um pino comum (GND).
  • Common Anode: Todos os anodos são conectados a um pino comum (VCC).

Tabela de Ativação de Segmentos:

Dígitoabcdefg
01111110
10110000
...... (mapeamento completo no código exemplo)

Montagem do Hardware🔗

Diagrama de Conexões

graph TD STM32 -->|GPIOA0-GPIOA6| Segmentos[a, b, c, d, e, f, g] STM32 -->|GPIOB0-GPIOB3| Dígitos[D1, D2, D3, D4]

Configuração de Pinos no STM32

FunçãoPino STM32
Segmento aPA0
Segmento bPA1
......
Dígito 1 (D1)PB0
Dígito 2 (D2)PB1

Passos:

1. Configure os pinos dos segmentos (GPIOA) e dígitos (GPIOB) como saídas.

2. Para maior precisão, habilite o RTC com cristal externo de 32.768 kHz.

Exemplo de código para GPIOConfigurando e usando GPIOs no STM32Configurando e usando GPIOs no STM32Explore neste tutorial os fundamentos e configurações práticas dos GPIOs no STM32, com exemplos de LED, botões e modos alternativos.:

GPIO_InitTypeDef gpio;
gpio.Mode = GPIO_MODE_OUTPUT_PP;
gpio.Pin = GPIO_PIN_0 | GPIO_PIN_1 | ... | GPIO_PIN_6; // PA0-PA6 para segmentos
HAL_GPIO_Init(GPIOA, &gpio);

Lógica de Controle e Multiplexação🔗

Princípio da Multiplexação

Ative um dígito por vez em alta frequência (> 60 Hz) para evitar cintilação. A frequência por dígito é calculada como:

$$ f_{dígito} = \frac{f_{timer}}{n_{dígitos}} $$

Implementação:

void update_display(uint8_t digits[4]) {
    static uint8_t current_digit = 0;
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, GPIO_PIN_SET); // Desliga todos
    set_segments(digits[current_digit]);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 << current_digit, GPIO_PIN_RESET); // Liga o dígito atual
    current_digit = (current_digit + 1) % 4;
}

Temporização com Timer

Use um timerUsando temporizadores para criar delays precisosUsando temporizadores para criar delays precisosDescubra como configurar temporizadores STM32 para criar delays precisos com polling, interrupções e DMA, otimizando energia em sistemas embarcados. para interrupções periódicas (ex: 5 ms por dígito):

HAL_TIM_Base_Start_IT(&htim2); // TIM2 configurado para 5 ms

Programação do Relógio🔗

Uso do RTC Interno

Configure o RTC para contagem de segundos:

RTC_TimeTypeDef time;
time.Hours = 12;
time.Minutes = 0;
time.Seconds = 0;
HAL_RTC_SetTime(&hrtc, &time, RTC_FORMAT_BIN);

Loop Principal e Atualização do Display

while (1) {
    RTC_TimeTypeDef current_time;
    HAL_RTC_GetTime(&hrtc, &current_time, RTC_FORMAT_BIN);
    uint8_t digits[4] = {current_time.Hours / 10, current_time.Hours % 10,
                         current_time.Minutes / 10, current_time.Minutes % 10};
    update_display(digits);
}

Otimizações e Técnicas Avançadas🔗

1. Modo de Baixo ConsumoGerenciamento de energia e modos de baixo consumo no STM32Gerenciamento de energia e modos de baixo consumo no STM32Aprenda a reduzir o consumo de energia com os modos STM32, garantindo eficiência e prolongando a vida útil de baterias em sistemas embarcados.:

  • Ative SLEEP mode entre atualizações para reduzir consumo.
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

2. Calibração do RTC:

$$ \text{Erro} = \frac{\text{Valor LSI Medido} - 32.768}{32.768} \times 10^6 \text{ (ppm)} $$

3. Controle de Brilho:

Testes, Depuração e Expansões🔗

Estratégias de Teste

  • Verificação de Segmentos: Teste cada dígito individualmente antes da multiplexação.
  • Análise de Temporização: Use um osciloscópio para medir a frequência de atualização.

Depuração Comum

  • Problema: Display apagado.

Solução: Verifique resistores de limitação de corrente e conexões GND/VCC.

  • Problema: Cintilação excessiva.

Solução: Aumente a frequência do timerUsando temporizadores para criar delays precisosUsando temporizadores para criar delays precisosDescubra como configurar temporizadores STM32 para criar delays precisos com polling, interrupções e DMA, otimizando energia em sistemas embarcados. ou reduza o número de dígitos.

Expansões Propostas

1. Botões para Ajuste: Use interrupções GPIOConfigurando e usando GPIOs no STM32Configurando e usando GPIOs no STM32Explore neste tutorial os fundamentos e configurações práticas dos GPIOs no STM32, com exemplos de LED, botões e modos alternativos. para ajustar horas/minutos.

2. Sensor de Temperatura: Exiba dados de um DS18B20Sensores de temperatura e umidade: Integração DHT22/DS18B20 com STM32Sensores de temperatura e umidade: Integração DHT22/DS18B20 com STM32Descubra como integrar os sensores DHT22 e DS18B20 ao STM32 para projetos IoT, monitoramento ambiental e automação com log em cartão SD. alternando com o horário.

3. Wi-Fi/NTP: Sincronize o relógio via ESP8266.

4. Interface Gráfica: Adicione um display LCD para mostrar data e temperatura.

Exemplo de Código Integrado🔗

// Mapeamento dos dígitos (Common Cathode)
const uint8_t digitMap[10][7] = {
    {1,1,1,1,1,1,0}, // 0
    {0,1,1,0,0,0,0}, // 1
    {1,1,0,1,1,0,1}, // 2
    // ... (completar para outros dígitos)
};
// Interrupção do Timer para multiplexação
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    static uint8_t currentDigit = 0;
    HAL_GPIO_WritePin(GPIOB, DIGIT_PINS, GPIO_PIN_SET); // Desliga dígitos
    set_segments(digits[currentDigit]);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 << currentDigit, GPIO_PIN_RESET);
    currentDigit = (currentDigit + 1) % 4;
}

Este guia oferece um caminho completo para dominar a integração de displays de 7 segmentos com microcontroladores STM32Famílias de microcontroladores STM32: Uma visão geralFamílias de microcontroladores STM32: Uma visão geralProfundo mergulho nas famílias STM32, explorando arquitetura, aplicações e desempenho. Descubra dicas e casos práticos para projetos embarcados.. Combinando técnicas de hardware e software, você estará preparado para implementar soluções profissionais em sistemas embarcados.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados