Introdução
Neste artigo, vamos construir um indicador de nível utilizando o microcontrolador Franzininho C0 e uma barra de LEDs (BarGraph). O objetivo é criar um sistema capaz de medir e exibir o nível de um determinado parâmetro (como o nível de um tanque de água, por exemplo) de maneira visual e intuitiva.
Para isso, utilizaremos um potenciômetro como sensor de entrada, que simulará a variação do nível a ser medido. Configuraremos o ambiente de desenvolvimento com o CubeMx, e escreveremos o código necessário para que o Franzininho C0 possa interpretar os sinais do potenciômetro e controlar o BarGraph.
Componentes necessários
- 1 Franzininho C0
- 1 Potenciômetro 10k ohms
- 1 Barra Gráfica de LEDs
- 10 Resistores de 300 ohms
Conexões Hardware
Configurando 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 seguida, configuraremos os GPIOs. Clique sobre os pinos PA0,PA1, PA2, PA3, PA4, PA5, PA6,PA7, PB6, PB7 e selecione para cada um “GPIO_Output”.
- Para facilitar a escrita e compreensão do código, renomeie os pinos de acordo com a tabela e imagem abaixo:
| PB7 | LED_DEZ |
| PB6 | LED_NOVE |
| PA0 | LED_OITO |
| PA1 | LED_SETE |
| PA2 | LED_SEIS |
| PA3 | LED_CINCO |
| PA4 | LED_QUATRO |
| PA5 | LED_TRES |
| PA6 | LED_DOIS |
| PA7 | LED_UM |
- O potenciômetro, será conectado no pino PA8, logo habilite o ADC nesse pino.
- Ainda na configuração do ADC, em “NVIC Settings” habilite a interrupção.
- Por fim, gere o código em “Project” > “Generate Code”.
Implementando o código
- Abra o arquivo em Core > Src > main.c
- Nesse exemplo, estaremos utilizando o ADC por interrupção, portanto, modifique a função main com o seguinte código:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
HAL_ADCEx_Calibration_Start(&hadc1); // Rotina de calibração do ADC
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start_IT(&hadc1); // Inicia ADC interrupcao
}
/* USER CODE END 3 */
}
- Adicione a função HAL_ADC_ConvCpltCallback:
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {
uint32_t leituraPotenciometro = HAL_ADC_GetValue(&hadc1);
int ledCount = leituraPotenciometro * 10 / 4095; // 10 LEDs e 2^12-1
desligaLeds();
if(ledCount >= 1) HAL_GPIO_WritePin(GPIOA, LED_UM_Pin, GPIO_PIN_SET);
if(ledCount >= 2) HAL_GPIO_WritePin(GPIOA, LED_DOIS_Pin, GPIO_PIN_SET);
if(ledCount >= 3) HAL_GPIO_WritePin(GPIOA, LED_TRES_Pin, GPIO_PIN_SET);
if(ledCount >= 4) HAL_GPIO_WritePin(GPIOA, LED_QUATRO_Pin, GPIO_PIN_SET);
if(ledCount >= 5) HAL_GPIO_WritePin(GPIOA, LED_CINCO_Pin, GPIO_PIN_SET);
if(ledCount >= 6) HAL_GPIO_WritePin(GPIOA, LED_SEIS_Pin, GPIO_PIN_SET);
if(ledCount >= 7) HAL_GPIO_WritePin(GPIOA, LED_SETE_Pin, GPIO_PIN_SET);
if(ledCount >= 8) HAL_GPIO_WritePin(GPIOA, LED_OITO_Pin, GPIO_PIN_SET);
if(ledCount >= 9) HAL_GPIO_WritePin(GPIOB, LED_NOVE_Pin, GPIO_PIN_SET);
if(ledCount >= 10) HAL_GPIO_WritePin(GPIOB, LED_DEZ_Pin, GPIO_PIN_SET);
}
Esta é a função de callback chamada quando a conversão ADC é completada. Aqui está o que acontece:
- Leitura do ADC: O valor do ADC é obtido usando HAL_ADC_GetValue.
- Cálculo de LEDs: O valor lido é mapeado para um valor entre 0 e 10, correspondendo ao número de LEDs que devem estar acesos.
- Desligar LEDs: Chama desligaLeds para desligar todos os LEDs antes de acendê-los de acordo com o que foi medido no ADC.
- Acender LEDs: Liga os LEDs de acordo com o valor calculado em ledCount.
- Adicione a função desligaLeds e lembre-se de incluir seu protótipo de função no início do código.
/* USER CODE BEGIN PFP */
void desligaLeds(); // Prototipo funcao
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void desligaLeds(){
HAL_GPIO_WritePin(GPIOA, LED_UM_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, LED_DOIS_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, LED_TRES_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, LED_QUATRO_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, LED_CINCO_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, LED_SEIS_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, LED_SETE_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, LED_OITO_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, LED_NOVE_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, LED_DEZ_Pin, GPIO_PIN_RESET);
}
- O código 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 da imagem abaixo ou utilizar um cabo USB como explicado no tutorial: https://embarcados.com.br/gravar-franzininho-c0-via-stm32cubeprogrammer/
Funcionamento
Conclusão
Neste tutorial, aprendemos a construir um indicador de nível utilizando o microcontrolador Franzininho C0 e uma barra de LEDs (BarGraph). Através de um potenciômetro como sensor de entrada, configuramos o ambiente de desenvolvimento com CubeMx e escrevemos o código necessário para que o Franzininho C0 interpretasse os sinais do potenciômetro e controlasse o BarGraph.






