Pular para o conteúdo principal

Laboratório 08

Documentação de Apoio para Atividade de Laboratório

A documentação desta atividade de laboratório é complementar a documentação principal da disciplina.

Utilize como base a descrição apresentada no Moodle da disciplina.

TarefaTemplateInícioFimConteúdo
LAB08TPL0818-May-202625-May-2026Uso do STM32CubeMonitor; MQTT, IoT;

Conteúdo

Uso do STM32CubeMonitor; InfluxDB;

Verifique o seu ambiente de desenvolvimento

Git is the most widely used source-code management tool among professional developers.

  • Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
winget install --id Git.Git -e --source winget

Configurações do git:

git config --list --show-origin
Configure a ferramenta git

Configure o nome de usuário para todos os repositórios locais ligados às suas transações de commit:

git config --global user.name "Your Name"

Configure o email de usuário para todos os repositórios locais ligados às suas transações de commit:

git config --global user.email "you@example.com"

É recomendado verificar se a instalação do seu Git não está realizando nenhuma transformação entre LFs e CRLFs.

git config --global core.autocrlf false

Configure o git para usar o Visual Studio Code como editor padrão para tarefas como escrever mensagens de commit ou rebases interativos

git config --global core.editor "code --wait"

Habilite a coloração automática da saída da linha de comando do Git:

git config --global color.ui auto

Configura o Git para usar main como o nome do branch padrão sempre que você inicializar um novo repositório localmente:

git config --global init.defaultBranch main

Liste as configurações aplicadas:

git config --list --show-origin

STM32CubeMX is an initialization code generator.

  • STM32CubeMX is a graphical tool that allows a very easy configuration of STM32 microcontrollers and microprocessors, as well as the generation of the corresponding initialization C code for the Arm® Cortex®-M core or a partial Linux® Device Tree for Arm® Cortex®-A core, through a step-by-step process.

Crie um novo repositório com base no template do LAB08

Escolha o Grupo e entre com o comando abaixo para criar o repositório no GitHub:

Cole o comando abaixo no prompt aberto na pasta de trabalho!

Use o comando abaixo para criar o repositório no GitHub com base no template do laboratório LAB08:

gh repo create ELT73A-S22-2026-1-A/LAB08 --private -p ELT73A-LAB-TPL/LAB08 -c

Visualize o repositório:

gh repo view ELT73A-S22-2026-1-A/LAB08 --web

Abra o repositório clonado no VS Code:

code LAB08 --profile "STM32"

Instruções do LAB

Esta atividade de laboratório tem como objetivo utilizar o InfluxDB e STM32CubeMonitor. Cada item equivale a 10% da nota.

  • Crie um repositório (LAB08) via template (https://github.com/ELT73A-LAB-TPL/LAB08) na organização e clone;
  • Importe e compile o código da pasta TIM2EXTI0ADC1PWMDMA
  • Verifique a configuração dos periféricos;
  • Configure o executável e probes no STM32CubeMonitor;
  • Deploy e Dashboard no STM32CubeMonitor;
  • Configure o InfluxDB no Node-RED;
  • Teste de injeção de dados no InfluxDB;
  • Leitura do ADC e injeção de dados no InfluxDB;
  • Commit e push do Node-RED export flow;
  • Envie o link do repositório no GitHub (hyperlink);

Avaliação

  • Uso do template e código - 20%
  • Configuração do STM32CubeMonitor - 20%
  • Configuração e teste do InfluxDB - 20%
  • Leitura do ADC e injeção de dados no InfluxDB - 20%
  • Commit e push do Node-RED export flow - 20%
  • Link do repositório no GitHub (hyperlink) - 10%

Diagrama de pinos do STM32F4x1


STM32F4x1 microcontroller pinout diagram;


User Code

Timer 2 com interrupção e saída PWM no canal 1

Inicialize o Timer 2 com suporte a rotina de interrupção e saída PWM no canal 1:

Src/main.c
  /* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start_IT(&htim2,TIM_CHANNEL_1);
/* USER CODE END 2 */

User Key

Toggle no LED interno via interrupção do User Key:

Src/stm32f4xx_it.c
void EXTI0_IRQHandler(void)
{
/* USER CODE BEGIN EXTI0_IRQn 0 */

/* USER CODE END EXTI0_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(User_KEY_EXTI0_Pin);
/* USER CODE BEGIN EXTI0_IRQn 1 */
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
/* USER CODE END EXTI0_IRQn 1 */
}

ADC1 na interrupção do Timer 2

Inicie o ADC1 na interrupção do Timer 2:

Src/stm32f4xx_it.c
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */

/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
HAL_ADC_Start_IT(&hadc1);
/* USER CODE END TIM2_IRQn 1 */
}

Leitura do AN1 e atualização do valor de comparação do PWM

Na interrupção do ADC1, faça a leitura do AN1 e atualize o valor de comparação do PWM:
TIM2->CCR1 = HAL_ADC_GetValue(&hadc1);

Src/stm32f4xx_it.c
void ADC_IRQHandler(void)
{
/* USER CODE BEGIN ADC_IRQn 0 */

/* USER CODE END ADC_IRQn 0 */
HAL_ADC_IRQHandler(&hadc1);
/* USER CODE BEGIN ADC_IRQn 1 */
TIM2->CCR1 = HAL_ADC_GetValue(&hadc1);
/* USER CODE END ADC_IRQn 1 */
}

Tratamento do sinal de leitura do AN1

Src/stm32f4xx_it.c
void ADC_IRQHandler(void)
{
/* USER CODE BEGIN ADC_IRQn 0 */
uint16_t adc1in1;
float voltage;
/* USER CODE END ADC_IRQn 0 */
HAL_ADC_IRQHandler(&hadc1);
/* USER CODE BEGIN ADC_IRQn 1 */
adc1in1 = HAL_ADC_GetValue(&hadc1);
voltage = (adc1in1*3.3)/4095;
/* USER CODE END ADC_IRQn 1 */
}

STM32CubeMonitor

InfluxDB Inject Test

let adc1Value = Math.floor(Math.random()*4096); 
let adc2Value = Math.floor(Math.random()*4096);

msg.topic = "InfluxData"
msg.payload = {
"adc1in1": adc1Value,
"voltage1": (adc1Value * 3.3) / 4095,
"adc1in2": adc2Value,
"voltage2": (adc2Value * 3.3) / 4095,
"blueled": Math.round(Math.random())
}
return msg;

InfluxDB Query Test

from(bucket: "Grupo-X")
|> range(start: -1h)
|> filter(fn: (r) => r["_measurement"] == "test")
|> filter(fn: (r) => r["_field"] == "adc1in1" or r["_field"] == "adc1in2" or r["_field"] == "blueled" or r["_field"] == "voltage1" or r["_field"] == "voltage2")
|> last()
let adc1Value = msg.payload[0]._value;
let adc2Value = msg.payload[1]._value;
let led = msg.payload[2]._value;
let vol1 = msg.payload[3]._value;
let vol2 = msg.payload[4]._value;

msg.topic = "InfluxData"
msg.payload = {
"adc1in1": adc1Value,
"voltage1": vol1,
"adc1in2": adc2Value,
"voltage2": vol2,
"blueled": led
}
return msg;