• 5
    回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【 2025 DigiKey 杯】基于MLX90640的高温报警系统

项目背景

       在工业生产、消防安全以及日常生活等诸多场景中,高温环境的监测与及时报警至关重要。传统的高温检测方式往往存在检测范围有限、响应速度慢、智能化程度低等缺点。为了克服这些问题,本设计以智能与创意为出发点,利用先进的红外热成像技术,结合高性能的主控单元,开发了一款基于MLX90640的高温报警系统。该系统能够实时、准确地检测周围环境的温度,当检测到温度超过设定阈值时,及时发出警报,并通过舵机的转动扩大检测范围,有效提高了高温检测的效率和可靠性。

项目硬件组成

       本高温报警系统主要由主控单元、传感器模块、舵机模块、按键模块和蜂鸣器模块组成。

       主控单元采用自行设计的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中的处理,就是对各种标志位的判断,停止之后不进行检测:
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 */
  }

演示视频说明

      为了更直观地展示高温报警系统的工作过程和功能特点,我们制作了详细的演示视频。演示视频主要包括以下几个部分:
      系统启动与停止:展示按下蓝色按键后,系统启动的过程,包括舵机的初始化转动和传感器的数据采集。展示按下红色按键后,系统停止工作的过程,包括舵机停止转动和传感器停止采集数据。
      正常检测状态:展示系统在正常检测状态下,舵机持续转动,传感器实时采集温度数据,并将数据显示在串口调试助手上的过程。
      高温报警状态:通过加火焰模拟高温环境,当传感器检测到温度超过70℃时,系统立即停止舵机转动,并发出响亮的警报声。同时,串口调试助手上显示高温报警信息。
      高温消失恢复检测:当加热源移开后,温度逐渐降低,当温度低于70℃时,系统停止报警,舵机继续转动,恢复正常的检测状态。
      实际视频展示如下,这里放一个动图看一下动态:

    详细内容可观看完整视频。

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

总结与展望

      基于MLX90640的高温报警系统是以智能与创意为出发点,结合先进的红外热成像技术和高性能的主控单元,实现了对高温环境的实时、准确监测和及时报警。该系统具有检测范围广、响应速度快、智能化程度高等优点,能够广泛应用于工业生产、消防安全、日常生活等领域。通过实际测试和演示视频的展示,验证了系统的可行性和可靠性。实际上对于运动部件可以进一步进行优化,比如使用步进电机实现更加准确的运行控制,加入一些无线扩展能力,采用锂电池供电等等,这些都是我们后续集成可以考虑的方向。
全部回复(5)
正序查看
倒序查看
dyzero
LV.3
2
03-12 13:41

【DigiKey杯点评】+ 

还需要做一下结构设计。另外考虑下转动角度的设计,还包括上下扫描,可以借鉴下摄像头的设计。

0
回复
旻旻旻
LV.8
3
03-15 22:37

【DigiKey杯点评】+ 

方案展示了从硬件模块选型、功能框图设计到软件驱动(如I2C通信、PWM控制)的具体实现过程,并提供了关键代码片段和实物演示,具有较好的可复现性和参考价值。

这个方案它选用SG90舵机、独立按键等常见元件,在实现核心功能的同时,控制了硬件成本,使其作为一个原型或特定场景下的报警装置具有可行性。

有点遗憾的是交互与数据呈现方式单一,报警仅依赖蜂鸣器,在无人值守时效果有限,噪音太大也可能听不到,不起作用。而且缺乏如LCD屏之类的,可以实时查看温度分布图像,这样不太直观形象,希望可以后续增加。另外,希望可以集成温度校准和图像处理算法,提升测温准确性。

0
回复
fzwwj95
LV.7
4
03-24 17:21

【DigiKey杯点评】MLX90640 配合舵机扫描来做高温报警,这个思路比普通单点测温更聪明,覆盖范围和场景适应性都更好。主控、热成像、执行和报警模块的搭配也比较合理,是一个很典型的实用型安全监测方案。

0
回复
only one
LV.8
5
03-26 00:03

结合高性能的主控单元,开发了一款基于MLX90640的高温报警系统。该系统能够实时、准确地检测周围环境的温度,检测是否准确?

0
回复
only one
LV.8
6
03-26 23:53

识别准确吗?

0
回复