项目背景
项目硬件组成

主控单元采用自行设计的STM32H533开发板,具备强大的处理能力和丰富的外设接口,能够高效地处理传感器采集到的数据,并控制其他模块的正常运行。

传感器模块基于MLX90640红外热成像传感器,该传感器具有高分辨率、高精度和快速响应的特点,能够实时获取周围环境的温度分布信息。

舵机模块采用180°舵机,通过控制舵机的转动角度,可以改变传感器的检测方向,从而扩大检测范围。

按键模块包括蓝色启动按键和红色停止按键,用户可以通过按键方便地控制报警系统的启动和停止。

蜂鸣器模块则在检测到高温时发出响亮的警报声,提醒用户及时采取措施。


功能框图及说明

按键模块:蓝色按键用于启动报警系统,当用户按下蓝色按键时,系统开始工作,舵机开始转动,传感器开始采集温度数据。红色按键用于停止报警系统,当用户按下红色按键时,系统停止工作,舵机停止转动,传感器停止采集数据。
主控单元:接收按键模块的指令,控制舵机模块的转动和传感器模块的数据采集。同时,对传感器采集到的温度数据进行分析处理,当检测到温度超过70℃时,向蜂鸣器模块发送报警指令。
传感器模块:采用MLX90640红外热成像传感器,实时采集周围环境的温度分布信息,并将数据传输给主控单元。
舵机模块:根据主控单元的指令,进行定向转动,改变传感器模块的检测方向,从而扩大检测范围。
蜂鸣器模块:接收主控单元的报警指令,当检测到高温时发出响亮的警报声,提醒用户及时采取措施。
电源模块:为整个系统提供稳定的电源供应,确保各个模块能够正常工作。
功能设计及说明
主控单元设计

主控单元采用自行设计的STM32H533开发板,该开发板基于STM32H533微控制器,具有高性能、低功耗、丰富的外设接口等特点。开发板上集成了电源管理电路、调试接口电路等,为系统的稳定运行提供了保障。主控单元通过I2C接口与MLX90640传感器进行通信,读取传感器采集到的温度数据。同时,通过PWM信号控制舵机的转动角度,实现对传感器检测方向的调整。此外,主控单元还通过GPIO接口与按键模块和蜂鸣器模块相连,实现对系统的启动、停止和报警功能的控制。本次设计的主控单元采用的全接口引出的模式,主要是为了能够更多的适配DIY应用的使用场景。
传感器模块设计

MLX90640是一款高分辨率的红外热成像传感器,能够提供32×24像素的温度分布图像。该传感器具有快速响应、高精度、低噪声等优点,能够在-40℃至+300℃的温度范围内进行准确测量。在本设计中,我们将MLX90640传感器安装在一块定制的电路板上,通过杜邦线与主控单元相连。传感器模块的工作原理是通过红外探测器接收周围物体发出的红外辐射,并将其转换为电信号,然后经过内部的信号处理电路进行处理,最终输出温度数据,本次焊接并没有电源部分,是直接通过3.3V进行供电。
舵机模块设计
舵机模块采用SG90 180°舵机,该舵机具有体积小、扭矩大、控制精度高等特点。舵机的控制信号为PWM信号,通过改变PWM信号的占空比,可以控制舵机的转动角度。在本设计中,主控单元通过输出不同占空比的PWM信号,控制舵机在0°至180°范围内进行定向转动,从而改变传感器模块的检测方向,扩大检测范围。这里主要设计的是结构,能够更好的契合舵机的固定要求和转动需求。
软件设计

这里面主要包含的有MLX90640驱动,其使用的接口是I2C接口,支持400kHz的高速通信频率,我们通过STM32CubeMX配置I2C:

软件代码部分主要包括接口的配置和初始化以及单次采集的函数:
uint8_t MLX90640_Read(uint16_t Saddress,uint16_t nWords,uint16_t *ndata)
{
uint8_t data[832*2];
uint16_t data16=0;
HAL_I2C_Mem_Read(&hi2c1 ,MLX90640_SlaveAddress,Saddress,I2C_MEMADD_SIZE_16BIT,data,nWords*2,0x100);
for(uint16_t i = 0;i<nWords;i++)
{
data16 = data[i*2];
data16 <<= 8;
data16 |= data[i*2+1];
(*(ndata+i)) = data16;
}
return 0;
}
uint8_t MLX90640_Write(uint16_t address,uint16_t Word)
{
uint8_t data[2];
data[0] = Word>>8;
data[1] = Word;
HAL_I2C_Mem_Write(&hi2c1 ,MLX90640_SlaveAddress,address,I2C_MEMADD_SIZE_16BIT,data,2,0x100);
return 0;
}
void DelaySysTick_ms(uint16_t nms)
{
HAL_Delay(nms);
}
void MLX90640_Init(void)
{
DelaySysTick_ms (80);
MLX90640_SetRefreshRate(MLX90640_SlaveAddress, 1);
MLX90640_SetChessMode(MLX90640_SlaveAddress);
status = MLX90640_DumpEE(MLX90640_SlaveAddress,EE);
status = MLX90640_ExtractParameters(EE,&mlx90640);
}
void MLX90640_collect(void)
{
status = MLX90640_GetFrameData(MLX90640_SlaveAddress,Frame);
Vdd = MLX90640_GetVdd(Frame,&mlx90640);
Ta = MLX90640_GetTa(Frame,&mlx90640);
Tr = Ta - TA_SHIFT;
MLX90640_CalculateTo(Frame,&mlx90640,emissivity,Tr,Temp);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM12) {
HAL_IncTick();
if(Alarm_flag == 0)
LEDTim_cnt++;
collect_cnt++;
if(collect_cnt>=2)
{
collect_cnt = 0;
if(Scan_Mode == 1)
collect_flag = 1;
}
if(LEDTim_cnt >= 2)
{
LEDTim_cnt = 0;
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
if(Scan_Mode == 1)
{
if(Ave_flag == 0)
{
Ave_cnt++;
if(Ave_cnt == 5)
Ave_flag = 1;
}
else
{
Ave_cnt--;
if(Ave_cnt == 0)
Ave_flag = 0;
}
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,Ave_Buff[Ave_cnt]);
}
}
}
}
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == KEY_Blue_Pin)
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
Scan_Mode = 1;
maxtem = 0;
}
if(GPIO_Pin == KEY_Red_Pin)
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_GPIO_WritePin(Buzzer_GPIO_Port, Buzzer_Pin, GPIO_PIN_RESET);
Scan_Mode = 0;
}
}
while (1)
{
HAL_Delay(10);
if(collect_flag == 1)
{
uint16_t max = 0;
MLX90640_collect();
for(uint16_t i = 0;i<768;i++)
{
if(Temp[i] > max)
max = Temp[i];
}
maxtem = max;
if(maxtem > 1100)
{
Alarm_flag = 1;
HAL_GPIO_WritePin(Buzzer_GPIO_Port, Buzzer_Pin, GPIO_PIN_SET);
}
else
{
Alarm_flag = 0;
HAL_GPIO_WritePin(Buzzer_GPIO_Port, Buzzer_Pin, GPIO_PIN_RESET);
}
collect_flag = 0;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
演示视频说明

详细内容可观看完整视频。
通过演示视频,可以清晰地看到高温报警系统能够快速、准确地检测高温环境,并及时发出警报,具有较高的实用性和可靠性。
