Construindo um Indicador de Nível com Franzininho C0 e Bargraph

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

  1. Abra STM32Cube , crie um novo projeto e selecione o microcontrolador de destino “STM32C011F6P6”. 
  1. 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.
  1. 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”. 
  1. Para facilitar a escrita e compreensão do código, renomeie os pinos de acordo com a tabela e imagem abaixo:
PB7LED_DEZ
PB6LED_NOVE
PA0LED_OITO
PA1LED_SETE
PA2LED_SEIS
PA3LED_CINCO
PA4LED_QUATRO
PA5LED_TRES
PA6LED_DOIS
PA7LED_UM
  1. O potenciômetro, será conectado no pino PA8, logo habilite o ADC nesse pino.
  1. Ainda na configuração do ADC, em “NVIC Settings” habilite a interrupção. 
  1. Por fim, gere o código em “Project” > “Generate Code”.

Implementando o código

  1. Abra o arquivo em Core > Src > main.c 
  1. 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 */
}
  1. 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.
  1. 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);
}
  1. 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. 

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Hardware » Construindo um Indicador de Nível com Franzininho C0 e Bargraph

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: