Um driver de componente para o framework ESP-IDF projetado para controlar um LED RGB. Este driver utiliza o periférico LEDC (LED Control) do ESP32 para gerar sinais PWM (Pulse Width Modulation).
O design segue o padrão Singleton para garantir uma única instância de controle em todo o sistema e foi desenvolvido com foco na conformidade com o padrão de codificação MISRA C para maior robustez e segurança.
- Controle PWM: Utiliza o periférico LEDC para um controle preciso da intensidade de cada canal de cor.
- Controle de Estado: Permite ligar e desligar o LED independentemente da cor configurada.
- Memória de Cor: É capaz de restaurar a última cor definida ao ser religado.
- Cores Pré-definidas: Inclui macros para cores comuns (ex:
BLUE,ORANGE,LIME) para facilitar o uso. - Design Singleton: Garante que apenas uma instância do driver seja utilizada em todo o sistema.
- Fácil Integração: Projetado para ser adicionado como um componente em qualquer projeto ESP-IDF.
A configuração dos pinos GPIO é gerenciada internamente pelo componente. O usuário final só precisa obter a instância do driver e utilizar suas funções.
O exemplo abaixo demonstra como inicializar o driver e alternar entre diferentes cores e estados.
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "mlr_led_rgb.h"
void app_main(void)
{
// 1. Obtenha a instância única do driver
mlr_led_rgb_t *led = mlr_led_rgb_get_instance();
// 2. Inicialize o driver
led->init(led);
// 3. Alterne entre cores pré-definidas
while (1)
{
led->set_color(led, COBLI_BLUE);
vTaskDelay(pdMS_TO_TICKS(1000));
led->set_color(led, ORANGE);
vTaskDelay(pdMS_TO_TICKS(1000));
// Apaga o LED definindo a cor como preto
led->set_color(led, (rgb_color_t){0, 0, 0});
vTaskDelay(pdMS_TO_TICKS(1000));
// Liga novamente com a cor LIME
led->set_color(led, LIME);
vTaskDelay(pdMS_TO_TICKS(2000));
// Desliga o LED usando a função de estado
led->set_state(led, false);
vTaskDelay(pdMS_TO_TICKS(2000));
// Liga o LED, que restaurará a última cor (LIME)
led->set_state(led, true);
vTaskDelay(pdMS_TO_TICKS(2000));
}
}O driver é acessado através de um ponteiro para a sua struct de instância (mlr_led_rgb_t), que contém ponteiros para as funções de operação.
-
mlr_led_rgb_t* mlr_led_rgb_get_instance(void)- Descrição: Retorna o ponteiro para a única instância do driver (padrão Singleton).
-
void init(mlr_led_rgb_t *self)- Descrição: Inicializa os timers e canais do LEDC. Deve ser chamada uma única vez antes de qualquer outra operação.
-
void set_color(mlr_led_rgb_t *self, rgb_color_t color)- Descrição: Define a cor do LED RGB. Usar a cor
{0, 0, 0}efetivamente desliga o LED.
- Descrição: Define a cor do LED RGB. Usar a cor
-
void set_state(mlr_led_rgb_t *self, bool state)- Descrição: Liga (
true) ou desliga (false) o LED. Ao ligar, a última cor configurada é restaurada.
- Descrição: Liga (
-
void get_color(mlr_led_rgb_t *self, rgb_color_t *color)- Descrição: Obtém a última cor armazenada no driver.
-
void get_state(mlr_led_rgb_t *self, bool *state)- Descrição: Obtém o estado atual do LED (ligado ou desligado).