基于stm32单片机的红外测温报警系统
  • 0、毕业设计选题原则说明(重点)
  • 1、项目简介
  • 1.1 系统构成
  • 1.2 系统功能
  • 1.3 演示视频
  • 2、部分电路设计
  • 2.1 STM32单片机核心板电路设计
  • 2.2 MLX90614红外测温电路设计
  • 2.3 OLED液晶显示电路设计
  • 3、部分代码展示
  • 3.1 MLX90614获取温度代码
  • 3.2 传感器初始化
  • 3.3 OLED初始化
  • 4、资料下载


0、毕业设计选题原则说明(重点)

  • 选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的!
  • 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。
  • 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业证而已!!!
  • 当你明白这一点后,作毕业设计的要求就是在满足老师的要求后,越简单越好,这样不但容易去做,而且你自己也容易去理解,掌握,同样也能花最少的钱!!!
  • 满足老师的要求,这个没办法,毕竟他是决定你是否能通过答辩的人。
  • 每年都有很多同学找到我的时候,后悔当初为什么要把功能写的那么复杂,后悔没有提前找我咨询一下!所以在这里提醒同学们,提交开题报告之前一定要多想想,咨询下以往的学长学姐,不要自己随便写一堆提交上去!!!

1、项目简介

1.1 系统构成

  • stm32单片机+按键电路+LED电路+蜂鸣器电路+OLED显示电路+MLX90614红外测温电路。

1.2 系统功能

  • 功能介绍:
  • 1、检测到有人或物体时使用红外测温传感器测量温度
  • 2、OLED屏幕显示温度与温度报警阈值
  • 3、通过按键可设置温度报警阈值
  • 4、温度正常绿色LED亮,温度异常红色LED亮并且蜂鸣器报警
  • 5、检测到有人或物体时测量并显示温度,若温度超出报警阈值则报警;未检测到人或i物体则不显示温度,不报警。

1.3 演示视频

2、部分电路设计

2.1 STM32单片机核心板电路设计

  • STM32单片机最小系统是确保STM32系列单片机能够正常工作的最基本电路配置,通常包括电源电路、晶振电路、复位电路。这些组件共同为单片机提供稳定的工作环境和必要的时钟信号,确保单片机能够准确地执行程序指令。
  • 电源电路:为单片机提供稳定的工作电压,通常采用3.3V电源供电。电源电路的设计要保证单片机在不同工作条件下都能获得稳定的电压输出,以确保单片机的正常工作。
  • 晶振电路:提供单片机工作所需的时钟信号。晶振电路通过晶振和电容组成,为单片机提供稳定的工作脉冲,确保单片机的定时和同步需求。
  • 复位电路:实现单片机的复位功能,类似于电脑的重启。复位电路通过电容和电阻的配合,实现单片机在上电启动时的自动复位,以及通过手动按键实现复位功能,保证单片机在程序跑飞或异常情况下能够重新开始执行程序。
  • 单片机最小系统原理图如下图所示:

2.2 MLX90614红外测温电路设计

  • MX90614是一款由迈来芯公司提供的低成本,无接触温度计。输出数据和物体温度呈线性比例,具有高精度和高分辨率。TO-39金属封装里同时集成了红外感应热电堆探测器芯片MLX81101(温度是通过PTC或是PTAT元件测量)和信号处理专用集成芯片MLX90302,专门用于处理红外传感器输出信号。用以阻碍可见光和近红外光辐射的光学滤波器(可传播长波)集成在封装内提供对环境和日光的免疫。滤波器的波长通带为5.5到14μm。由于集成了低噪声放大器、17位模数转换器和强大的数字信号处理芯片 MLX90302,使得高精度和高分辨度的温度计得以实现。一个附加的片上温度传感器用来测量芯片的温度。测量完两个传感器的输出后,对应的环境温度和物体温度被计算出。计算所得物体温度和环境温度存储在MLX90302的RAM单元,温度分辨率为0.01℃,并可通过两线 SMBus(系统管理总线)兼容协议接口(IIC与之兼容)(0.02℃分辨率)或是10位PWM(脉宽调制)输出模式输出。MLX90614出厂温度范围都进行过校准,传感器测量的温度为视场里所有物体温度的平均值。
  • MLX90614 系列模块是一组通用的红外测温模块。 在出厂前该模块已进行校验及线性化,具有非接触、体积小、精度高,成本低等优点。被测目标温度和环境温度能通过单通道输出,并有两种输出接口,适合于汽车空调、室内暖气、家用电器、手持设备以及医疗设备应用等。
  • MLX90614的出厂校准温度范围很广:环境温度-40 ~ 125 ˚C,物体温度-70 ~ 382.2 ˚C。传感器测量的温度为视场里所有物体温度的平均值。MLX90614 室温下的标准精度为±0.5ºC。医疗应用版本的传感器可在人体温度范围内达到±0.1ºC 的精度。
  • 引脚说明
  • 其具体电路原理图如下图所示:
  • 基于stm32单片机的红外测温报警系统_stm32

  • 实物图:
  • 基于stm32单片机的红外测温报警系统_单片机_02

2.3 OLED液晶显示电路设计

  • 常见的OLED模块驱动芯片,不同的驱动芯片具有不同的特点和适用场景,具体选择应根据显示屏的分辨率、接口类型和功能需求来确定。

OLED(有机发光二极管)显示模块的驱动芯片种类繁多,常见的一些驱动芯片包括:

  1. SSD1306:常用于128x64和128x32分辨率的OLED显示屏,具有低功耗、SPI和I2C接口等特点。
  2. SSD1351:适用于彩色OLED显示屏,支持高分辨率显示,具有SPI接口和高速刷新率。
  3. SH1106:常用于128x64和128x32分辨率的OLED显示屏,支持SPI和I2C接口,低功耗高对比度。
  4. UC1701:应用于128x64和128x32分辨率的OLED显示屏,具有低功耗、SPI和I2C接口以及图形显示功能。
  5. ST7735:适用于彩色OLED显示屏,支持SPI接口,具有高分辨率和快速刷新速度。
  6. SH1107:用于分辨率为128x64和128x32的OLED显示屏,具有SPI和I2C接口以及高对比度。
  • 其具体电路原理图如下图所示:
  • 基于stm32单片机的红外测温报警系统_课程设计_03

  • 实物图如下:
  • 基于stm32单片机的红外测温报警系统_课程设计_04

3、部分代码展示

3.1 MLX90614获取温度代码

u16 SMBus_ReadMemory(u8 slaveAddress, u8 command)
{
    u16 data;                        // Data storage (DataH:DataL)
    u8 Pec;                                // PEC byte storage
    u8 DataL=0;                        // Low data byte storage
    u8 DataH=0;                        // High data byte storage
    u8 arr[6];                        // Buffer for the sent bytes
    u8 PecReg;                        // Calculated PEC byte storage
    u8 ErrorCounter;        // Defines the number of the attempts for communication with MLX90614

    ErrorCounter=0x00;                                // Initialising of ErrorCounter
        slaveAddress <<= 1;        //2-7???????
        
    do
    {
repeat:
        SMBus_StopBit();                            //If slave send NACK stop comunication
        --ErrorCounter;                                    //Pre-decrement ErrorCounter
        if(!ErrorCounter)                             //ErrorCounter=0?
        {
            break;                                            //Yes,go out from do-while{}
        }

        SMBus_StartBit();                                //Start condition
        if(SMBus_SendByte(slaveAddress))//Send SlaveAddress ???Wr=0????????
        {
            goto        repeat;                            //Repeat comunication again
        }
        if(SMBus_SendByte(command))            //Send command
        {
            goto        repeat;                            //Repeat comunication again
        }

        SMBus_StartBit();                                        //Repeated Start condition
        if(SMBus_SendByte(slaveAddress+1))        //Send SlaveAddress ???Rd=1????????
        {
            goto        repeat;                     //Repeat comunication again
        }

        DataL = SMBus_ReceiveByte(ACK);        //Read low data,master must send ACK
        DataH = SMBus_ReceiveByte(ACK); //Read high data,master must send ACK
        Pec = SMBus_ReceiveByte(NACK);        //Read PEC byte, master must send NACK
        SMBus_StopBit();                                //Stop condition

        arr[5] = slaveAddress;                //
        arr[4] = command;                        //
        arr[3] = slaveAddress+1;        //Load array arr
        arr[2] = DataL;                                //
        arr[1] = DataH;                                //
        arr[0] = 0;                                        //
        PecReg=PEC_Calculation(arr);//Calculate CRC
    }
    while(PecReg != Pec);                //If received and calculated CRC are equal go out from do-while{}

        data = (DataH<<8) | DataL;        //data=DataH:DataL
    return data;
}
float SMBus_ReadTemp(void)
{   
  return (SMBus_ReadMem
  ory(SA, RAM_ACCESS|RAM_TOBJ1)*0.02-273.15);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.

3.2 传感器初始化

static void DeviceInit(void)
{
    /* 初始化数据 */
  memset((void *)&device_data, 0, sizeof(DeviceData));
  device_data.temp_up = 32.5;
  
  Beep_Init();   /* 初始化蜂鸣器 */
  LED_Init();    /* 初始化LED */
  KEY_Init();    /* 初始化按键 */
  DI_Init();     /* 初始化物体检测模块 */
  
  OLED_Init();   /* 初始化OLED */
  SMBus_Init();
  /* 屏幕显示数据 */
  OLED_ShowString(1, 1, "T:");
  OLED_ShowString(1, 5, ".");
  OLED_ShowString(2, 1, "UP:");
  OLED_ShowString(2, 8, ".");
  
  /* 测试设置是否损坏 */
  BUZZER_ON       /* 打开蜂鸣器 */
  LED1_ON();      /* 打开红色LED */
  LED2_ON();      /* 打开绿色LED */
  Delay_ms(500);  /* 等待500ms */
  BUZZER_OFF      /* 关闭蜂鸣器 */
  LED1_OFF();     /* 关闭红色LED */
  LED2_OFF();     /* 关闭绿色LED */
  Delay_ms(500);  /* 等待500ms */
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

3.3 OLED初始化

void OLED_Init(void)
{
	uint32_t i, j;
	
	for (i = 0; i < 1000; i++)			//上电延时
	{
		for (j = 0; j < 1000; j++);
	}
	
	OLED_I2C_Init();			//端口初始化
	
	OLED_WriteCommand(0xAE);	//关闭显示
	
	OLED_WriteCommand(0xD5);	//设置显示时钟分频比/振荡器频率
	OLED_WriteCommand(0x80);
	
	OLED_WriteCommand(0xA8);	//设置多路复用率
	OLED_WriteCommand(0x3F);
	
	OLED_WriteCommand(0xD3);	//设置显示偏移
	OLED_WriteCommand(0x00);
	
	OLED_WriteCommand(0x40);	//设置显示开始行
	
	OLED_WriteCommand(0xA1);	//设置左右方向,0xA1正常 0xA0左右反置
	
	OLED_WriteCommand(0xC8);	//设置上下方向,0xC8正常 0xC0上下反置

	OLED_WriteCommand(0xDA);	//设置COM引脚硬件配置
	OLED_WriteCommand(0x12);
	
	OLED_WriteCommand(0x81);	//设置对比度控制
	OLED_WriteCommand(0xCF);

	OLED_WriteCommand(0xD9);	//设置预充电周期
	OLED_WriteCommand(0xF1);

	OLED_WriteCommand(0xDB);	//设置VCOMH取消选择级别
	OLED_WriteCommand(0x30);

	OLED_WriteCommand(0xA4);	//设置整个显示打开/关闭

	OLED_WriteCommand(0xA6);	//设置正常/倒转显示

	OLED_WriteCommand(0x8D);	//设置充电泵
	OLED_WriteCommand(0x14);

	OLED_WriteCommand(0xAF);	//开启显示
		
	OLED_Clear();				//OLED清屏
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.