Introdução
Você já percebeu como os postes de luz acendem automaticamente ao anoitecer? Isso ocorre devido à presença de um sensor que detecta a luminosidade do ambiente. Esse sensor, conhecido como Fotoresistor ou LDR (Light Dependent Resistor), desempenha esse papel importante nos sistemas de iluminação automatizada. Neste tutorial, vamos simular esse funcionamento utilizando a Franzininho C0.
Componentes necessários
- 1 Sensor de Luminosidade LDR
- 1 LED
- 1 resistor 300 ohms
- 1 resistor 10k ohms
- 1 franzininho C0
Montagem circuito
Configuração CubeMx
- Abra STM32Cube , crie um novo projeto e selecione o microcontrolador de destino “STM32C011F6P6”.
- Vá para a página de configurações de relógio e em HCLK digite 48 MHz para a frequência de saída desejada do sistema. Pressione a tecla “Enter” e deixe o aplicativo resolver os divisores/multiplicadores PLL necessários para atingir a taxa de clock desejada. Depois volte para a página de configuração dos pinos, selecione “Trace and Debug” e habilite “Serial Wire.
- Em Analog > ADC1 habilite o “IN5” e mantenha as demais configurações ADC no modo padrão.
- Configure o pino “PB6” como “TIM1_CH3”. Em Timers > TIM1, selecione “Internal Clock” para o Clock Source e “PWM Generation CH3” para o Channel3. Ajuste o Prescaler para 48-1 e o Counter Period para 1000-1. Para mais detalhes sobre os valores escolhidos, consulte o tutorial disponível em: https://embarcados.com.br/entendendo-o-controle-pwm-e-aplicando-no-franzininho-c0/
- Por fim, gere o código em “Project” > “Generate Code”.
Implementando o código
- Abra o arquivo em Core > Src > main.c
- Crie as seguintes variáveis globais:
uint32_t leitura;
uint32_t pwm;- Modifique a função principal com o seguinte:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM1_Init();
// Inicia o PWM no canal especificado
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
while (1)
{
// leitura ADC pelo meotod polling
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 1000) == HAL_OK) {
leitura = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
// Inverte a lógica: quanto maior a leitura do ADC (mais luz), menor o PWM
pwm = 1000 - ((leitura * 1000) / 4095);
// Atualiza a intensidade do LED
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, pwm);
}
}
Esse código integra a funcionalidade de leitura do ADC e controle PWM.
- HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3): inicia a geração de PWM no canal 3 do TIM1.
- HAL_ADC_Start(&hadc1): inicia a conversão no ADC1.
- HAL_ADC_PollForConversion(&hadc1, 1000): espera até que a conversão seja completada ou até que expire o tempo máximo definido (1000 ms).
- HAL_ADC_GetValue(&hadc1): obtém o valor digital convertido pelo ADC1.
- Calculando o valor de pwm – pwm = 1000 – ((leitura * 1000) / 4095): cálculo é feito com base na leitura do ADC. A fórmula inversa garante que quanto maior a leitura do ADC (mais luz no ambiente), menor será o valor do PWM (led desligado).
- __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, pwm): define o ciclo de trabalho do PWM no canal 3 do TIM1. Aqui, pwm é calculado com base na leitura do ADC, determinando a intensidade do sinal PWM enviado para o dispositivo controlado.
- O código modificado pode ser visto na imagem abaixo:
Gravação do código
Ao finalizar o código, partiremos para gravação. Nessa etapa você pode utilizar o ST-Link seguindo as conexões adequadas ou utilizar um cabo USB como explicado no tutorial: https://embarcados.com.br/gravar-franzininho-c0-via-stm32cubeprogrammer/.
Funcionamento
Conclusão
Neste tutorial prático ensinamos criar uma iluminação automatizada com LDR e Franzininho C0. Utilizando ADC para capturar dados analógicos do ambiente e PWM para controlar a intensidade do LED.





