前述:
QQ:961209458
V X:F9986858
承接毕业设计。
设计的内容
本课题主要是设计一种基于STM32的MLX90614人体红外测温仪。全文主要阐述了非接触式人体体温测试仪的硬件设计和软件设计。硬件方面首先谈到了系统的总体设计,然后分别从红外线传感器,运算放大器,A/D转换,数据处理,显示部分等功能模块进行了论述并详细介绍了各个芯片的结构和功能,使系统具有稳定性好,精度高,测量安全,使用方便等特点。在软件方面,借助keil采用C语言来编写程序代码,具有编译速度快,运行效率高等优点。利用STM32F103C8T6单片机和MLX90614模块将测量的温度显示到OLED显示屏上面。
硬件方案
硬件设计主要包括复位电路,时钟电路,按键电路以及LED数码管显示电路, 由STM32F103C8T6单片机作为主控系统,以IIC协议(集成电路总线)作为通信介质,通过温度传感器MLX90614获取环境温度,以OLED作为显示器来显示数据和系统提示信息,且当从机系统采集到的温度值超过了系统设定的阀值时,报警模块进行报警。各单元之间相互协调配合,并且保证系统的正常运行。系统总设计框图如图1所示:
MLX90614 系列模块是一组通用的红外测温模块。在出厂前该模块已进行校验及线性化,具有非接触、体积小、精度高,成本低等优点。并且红外测温是根据被测物体的红外辐射能量来确定物体的温度,不与被测物体接触,具有影响动被测物体温度分布场,温度分辨率高、响应速度快、测温范围广、不受测温上限的限制、稳定性好等特点,所以我们选择MLX90614来作为红外测温模块,MLX90614有MLX81101红外热电堆传感器和包括含有稳压电路、低噪声放大器、A/D转换器、DSP单元、脉宽调制电路及逻辑控制电路的MLX90302信号处理芯片构成。
其工作原理为:红外热电堆传感器输出的温度信号经过内部低噪声、低失调的运算放大器(OPA)放大后经过A/D转换器(ADC)转换为17位数字信号通过可编程FIR及IIR低通数字滤波器(即DSP)处理后输出,输出结果存储在其内部RAM存储单元中。
单片机与MLX90614红外测温模块之间通信的方式是“类IIC”通信,即SMBus, 它只有两根信号线:双向数据线和时钟信号线,容许CPU与各种外围接口器件以串行方式进行通信、交换信息,即可以提高传输速度也可以减小器件的资源占用,另外即使在没有SMBus接口的单片机上也可利用软件进行模拟。IIC协议原理主要包括写时序,读时序以及通信过程。
报警模块采用声光报警,当温度异常时蜂鸣器会连续响三次,LED报警灯也会闪烁三下进行报警提示。
显示选用的是0.96寸的OLED,即有机发光二极管。
软件方案
系统软件设计主要包含了元器件的驱动,对测量温度的处理等。以STM32单片机程序为主体,首先,系统等待触发开始测量的按键,自按钮按下时,触发主控单元传输信号给红外测温模块,mlx90614红外测温模块开始测温,并且将测得的数据进行处理,然后将测量到的温度数据传输到主控单元,最后传输到输出单元,在OLED显示模块上显示所测温度数据以及通过报警模块输出数据用系统流程图如图2所示
硬件电路图
部分核心代码
#include "OLED_I2C.h"
#include "delay.h"
#include "flash.h"
#include "gy906.h"
#include "key.h"
#include "led.h"
#include "timer.h"
signed short int temperature_[BufferSize] = {0x0000,0x0000,0x0000,0x0000,0x0000};//温度保存数组
int num=0;//存储温度数据个数
int temp=0;//查看历史温度次数
char Temp_Abnormal=0;//温度异常标志位
char shanshuo;//闪烁计数
void Get_Temp(void);//获取温度
void Look_Temp_Date(void);//查看历史温度
void Alarm(void);//报警提示
int main(void)
{
LED_GPIO_Config();
DelayInit();
I2C_Configuration();
OLED_Init();
KEY_Init();
read_flash(temperature_);//读取保存的数据
TIM3_Int_Init(4,7200); //10Khz的计数频率,计数到5为0.5ms
OLED_CLS(); //清屏
OLED_ShowCN(0,0,0);OLED_ShowCN(17,0,1);//温度
OLED_ShowCN(0,3,2);OLED_ShowCN(17,3,3);//历史温度
OLED_ShowCN(34,3,0);OLED_ShowCN(50,3,1);
OLED_ShowStr(34,0,":",2);OLED_ShowStr(66,3,":",2);
//OLED_ShowNum(82,3,change(temperature_[0])+3.14,2);
while(1)
{
Get_Temp();//获取温度数据
Look_Temp_Date();//查看历史温度
Alarm();//温度异常报警
}
}
void Get_Temp()
{
if(KEY1==0)
{
DelayMs(10);
if(KEY1==0)
{
temperature_[num]=Get_temperature();//获取温度
OLED_ShowCN(0,0,0);OLED_ShowCN(17,0,1);//显示温度
OLED_ShowStr(34,0,": ",2);//:
OLED_ShowNum(50,0,change(temperature_[num])+7.14,2);//温度数据
OLED_ShowCN(95,0,8);//℃
if(change(temperature_[num])<28.86||change(temperature_[num])>30.16)//不正常警告 36-37.3
{
//体温异常
OLED_ShowCN(0,6,7);OLED_ShowCN(17,6,0);
OLED_ShowCN(34,6,4);OLED_ShowCN(50,6,5);
Temp_Abnormal=1;//报警标志位置1
}
else
{
//体温正常
OLED_ShowCN(0,6,7);OLED_ShowCN(17,6,0);
OLED_ShowCN(34,6,6);OLED_ShowCN(50,6,5);
Temp_Abnormal=0;
}
num++;
if(num>=5) num=0;//只保存5次温度数据
FlashReadWriteTest(temperature_);//把温度数据写入Flash
temp = num;
}
while(KEY1==0);//等待松手
}
}
void Look_Temp_Date()
{
if(KEY2==0)
{
DelayMs(10);
if(KEY2==0)
{
OLED_ShowCN(0,0,0);OLED_ShowCN(17,0,1);OLED_ShowStr(34,0,": ",2);
temp--;
if(temp==-1)
{temp=4;}//只可以查看5次历史温度
OLED_ShowNum(82,3,change(temperature_[temp])+7.14,2);
}
while(KEY2==0);
}
}
void Alarm()
{
if(Temp_Abnormal)//闪烁报警
{
if(shanshuo%2) //
{LED1(ON);BEEP(ON);}
else
{LED1(OFF);BEEP(OFF);}
}
else
{LED1(OFF);BEEP(OFF);}
}
版权声明:本文为CSDN博主「Yulin_zhuang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42922494/article/details/120245083
暂无评论