基于单片机的非接触式红外测温系统

 功能介绍

  •  采用51单片机作为主控系统;
  •  通过MLX90614红外测温模块,精准测量温度;
  •  通过红外传感器反应是否有人体靠近,靠近后开始测温;
  •  通过TTS语音模块播报温度;
  •  通过按键可以调节温度阀值
  • 通过LCD1602显示模块,显示实时体温;
  • 实物可做,其他功能也可以

 电路图

PCB


源代码

u8 Temperature_High;         //室内温度高阈值
u8 Temperature_Low;          //室内温度低阈值
u8 Humidity_High;            //室内湿度高阈值
u8 Humidity_Low ;            //室内湿度低阈值
u8 SoilHumidity_High;        //土壤湿度高阈值
u8 SoilHumidity_Low;         //土壤湿度低阈值
u8 Air_High;                 //空气质量高阈值
u16 LightLux_High;           //光照强度高阈值
u16 LightLux_Low ;           //光照强度低阈值

double Humidity;             //室内湿度
double Temperature;          //室内温度
double SoilHumidity;         //土壤湿度
double Lightlux;             //光照强度
double SoilTemperature;	     //土壤温度
double Air;	                 //空气质量

u8 Auto;                //控制模式,0:手动,1:自动
u8 flag=0;				      //页显示标志
u8 flag0=0;				      //定时器到达标志
u8 flag1=0;             //水泵运行标志
u8 flag2=0;             //补光运行标志
u8 flag3=0;             //风扇运行标志
u8 flag4=0;             //卷帘运行标志
u8 channel;             //按键1标志
u8 AirAlarm=0;          //空气质量超限警报标志
u8 Airflag=0;           //空气质量超限变化标志 
int main(void) 
{	
	unsigned char temp[256];
	System_Init();                             //系统初始化	
	u1_printf("系统初始化成功\r\n"); 
	while(WiFi_ConnectServer())                //循环,初始化,连接服务器,直到成功
	{
		delay_ms(2000);                          //延时
	} 
	//OLED_Clear();                              //OLED清屏
	
	WiFi_RxCounter=0;                         //WiFi接收数据量变量清零                        
	memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);    //清空WiFi接收缓冲区               
	Connect_flag = 1;                          //Connect_flag=1,表示连接上服务器	
	WiFi_Send("{\"state\":1}",strlen("{\"state\":1}"),500);  //发送连接状态
	OLED_ShowCHinese(12,2,26);   //运
	OLED_ShowCHinese(28,2,27);   //行
	OLED_ShowCHinese(44,2,28);   //模
	OLED_ShowCHinese(60,2,29);   //式
	OLED_ShowChar(76,2,':',16);  //:
	OLED_ShowCHinese(4,4,33);                 //空
	OLED_ShowCHinese(20,4,34);                //气
	OLED_ShowCHinese(36,4,35);                //质
	OLED_ShowCHinese(52,4,36);                //量
	OLED_ShowChar(68,4,':',16);               //:
	OLED_ShowChar(108,4,'%',16);               //百分比
	OLED_ShowCHinese(8,6,22);          //光
	OLED_ShowCHinese(24,6,23);         //照
	OLED_ShowChar(40,6,':',16);        //:
	OLED_ShowString(96,6,"Lux",16);    //光照单位
	if(Auto)
	{
		OLED_ShowCHinese(84,2,32);   //自
		OLED_ShowCHinese(100,2,31);  //动
	}
	else
	{
		OLED_ShowCHinese(84,2,30);   //手
		OLED_ShowCHinese(100,2,31);  //动
	}
	memset(temp,0,256);
	sprintf((char*)temp,"{\"AirAlarm\":%d}",AirAlarm);               //构建回复室内湿度数据
	WiFi_Send(temp,strlen((char*)temp),500);	
	TIM3_ENABLE_1S();                          //TIM3初始化,用于更新数据
		
	TIM1_ENABLE_2ms();
	while(1)
	{ 
		if(flag0)                               //更新数据
		{
			tim3_OK();
		}
		KeyDriver1();
		WifiDataHandle();                        //获得服务器下发的数据
		AutoPattern();                           //自动模式
		if(Air>Air_High)                         //空气质量超限判断
		{
			AirAlarm=1;		
		}
		else
		{
			AirAlarm=0;
		}
		
		if(Airflag!=AirAlarm)
		{
			memset(temp,0,256);
			sprintf((char*)temp,"{\"AirAlarm\":%d}",AirAlarm);               //构建回复室内湿度数据
			WiFi_Send(temp,strlen((char*)temp),500);                           //发送数据
		}			
		Airflag=AirAlarm;
	}		
}
void tim3_OK(void)
{
		u8 temp1[256];
		TempHumi_State();
		SoilHumidity_State();		
		SoilTemperature_State();
		Light_State();
		MQ_State();
		if(flag)
		{
			//u1_printf("温度:%.2f  湿度:%.2f\r\n",Temperature,Humidity);
			memset(temp1,0,256);	
			sprintf((char*)temp1,"%2.1f",Temperature);       //构建室内温度数据
			
			OLED_ShowString(76,0,temp1,16);
			memset(temp1,0,256);	
			sprintf((char*)temp1,"%2.1f",Humidity);       //构建室内湿度数?
			//u1_printf("构建土壤温度数据:%2.1f\r\n",SoilTemperature);
			OLED_ShowString(72,2,temp1,16);     
			memset(temp1,0,256);	
			sprintf((char*)temp1,"%2.1f",SoilTemperature);       //构建土壤温度数据
			//u1_printf("构建土壤湿度数据:%2.1f\r\n",SoilHumidity);
			OLED_ShowString(76,4,temp1,16);
			memset(temp1,0,256);	
			sprintf((char*)temp1,"%2.1f",SoilHumidity);       //构建土壤湿度数据
			OLED_ShowString(72,6,temp1,16);
			
		}
		else
		{
			//u1_printf("构建光照数据:%.1f\r\n",Lightlux);
			memset(temp1,0,256);	
			sprintf((char*)temp1,"%.2f",Lightlux);           //构建光照数据
			OLED_ShowString(48,6,temp1,16);	
			memset(temp1,0,256);	
			sprintf((char*)temp1,"%.2f",Air);           //构建空气质量
			OLED_ShowString(76,4,temp1,16);			
		}
		flag0=0;
}
/*-------------------------------------------------*/
/*函数名:自动运行模式                               */
/*参  数:无                                        */
/*返回值:无                                        */
/*-------------------------------------------------*/
void AutoPattern(void)
{
	if(Auto==1)                                                 //自动模式
	{	
		if(SoilHumidity_High<SoilHumidity)
		{
			if(flag1==0)
			{
				WATER_OFF;                                           //关闭水泵
				WATER_State();
				flag1=1;
			}                                                      //判断水泵状态,并发送给服务器					 					
		}
		else if(SoilHumidity_Low>SoilHumidity)
		{
			if(flag1==0)
			{
				WATER_ON;                                            //打开水泵
				WATER_State();                                       //判断水泵状态,并发送给服务器 
				flag1=1;
			}
		}
		else                                                     //正常状态
		{
			flag1=0;
		}
		if(LightLux_High<Lightlux)
		{
			if(flag2==0)
			{
				LED_OFF;                                                //关闭LED
				LED_State();                                            //判断LED状态发送给服务器
				flag2=1;
			}                                        					 					
		}
		else if(LightLux_Low>Lightlux)
		{
			if(flag2==0)
			{
				LED_ON;                                                 //打开LED
				LED_State();                                            //判断LED状态,并发送给服务器 
				flag2=2;
			}
		}
		else                                                     //正常状态
		{
			flag2=0;
		}				
		if(Humidity_High<Humidity)
		{
			if(flag3==0)
			{
				FAN_ON;                                                 //打开风扇
				FAN_State();                                            //判断风扇状态并发送给服务器 
				flag3=1;
			}                                        					 					
		}
		else if(Humidity_Low>Humidity)
		{
			if(flag3==0)
			{
				FAN_OFF;                                                //关闭风扇
				FAN_State();                                            //判断风扇状态并发送给服务器 
				flag3=2;
			}
		}
		else                                                     //正常状态
		{
			flag3=0;
		}				
		if(Temperature_High<Temperature)
		{
			if(flag4==0)
			{
				flag4=1;
				StepMotor_CCW();																			    //打开卷帘
				WiFi_Send("{\"RiShSt\":1}",strlen("{\"RiShSt\":1}"),500); //发送卷帘控制状态 
			}                                        					 					
		}
		else if(Temperature_Low>Temperature)
		{
			if(flag4==0)
			{
				flag4=2;
				StepMotor_CW();					                                    //关闭卷帘
				WiFi_Send("{\"RiShSt\":0}",strlen("{\"RiShSt\":0}"),500);   //发送卷帘控制状态 
			}
		}
		else                                                     //正常状态
		{
				flag4=0;
		}				
	}
}
/*-------------------------------------------------*/
/*函数名:系统初始化                                */
/*参  数:无                                        */
/*返回值:无                                        */
/*-------------------------------------------------*/
void System_Init(void)
{
	IIC_Init();                                //IIC初始化
	Out_Init();	                               //输出初始化
	delay_init();                              //延时功能初始化
	OLED_Init();			                         //初始化OLED
	OLED_Clear();                              //OLED清屏
	
	OLED_ShowCHinese(0,0,39);   							   
	OLED_ShowCHinese(16,0,40);  							   
	OLED_ShowCHinese(32,0,4);   							 
	OLED_ShowCHinese(48,0,5);  							   
	OLED_ShowCHinese(64,0,41);  							 
	OLED_ShowCHinese(80,0,37); 							   
	OLED_ShowCHinese(96,0,2); 							   
	OLED_ShowCHinese(112,0,3); 							  
	

	Adc_Init();                                //ADC初始化,通道0、1、5
	Usart1_Init(115200);                       //串口1功能初始化,波特率9600
	Usart2_Init(115200);                       //串口2功能初始化,波特率115200	
	TIM4_Init(1000,7200);                      //TIM4初始化,用于发送数据
	
	
	KEY_Init();                                //按键初始化
	
	StepMotor_Init();                          //步进电机初始化
	
	ReadBackup();												       //用来读取关机之前的状态	
	TempHumi_State();                          //首次获得室内温湿度
	SoilHumidity_State();                      //首次获得土壤湿度
	Light_State();                             //首次获得光照强度
	SoilTemperature_State();                   //首次获得土壤温度
	MQ_State();                                //首次获得空气质量
	  
	WiFi_ResetIO_Init();                       //初始化WiFi的复位IO
  RxBuff_Init();                             //初始化接收缓冲区
}

     

元器件清单

基于单片机的非接触式红外测温系统
名称型号数量
单片机STC89C521
晶振11.0592M1
电解电容10uF1
电解电容1000uf1
瓷片电容22pF2
电阻10K3
电阻1K4
电阻2K1
蜂鸣器有源1
三极管S90121
按键5
显示屏LCD16021
排针16P1
排母16P1
人体红外模块HC-SR5011
排母3P1
温度传感器DS18B201
烟雾传感器MQ-21
模数转换器ADC08321
IC座8P1
GSM模块SIM800c1
电源座5MM1
电源线5V2A1
自锁开关1
继电器1
小水泵1
导线若干
焊锡丝若干

参考文献

参考文献
[1]王德保.GPS在城市控制网中的应用研究[D].山东:山东科技大学,2005.
[2]何立民.从现代计算机视角看嵌入式系统(4)嵌入式系统40年发展史[J].单片机与嵌入式系统应用,2016,16(04):77-79.
[3]康桂霞,刘达.FPGA应用技术教程[M].北京:人民邮电出版社:201306.229.
[4]朴德慧,衣英刚.液晶显示器驱动板MCU电路介绍(上)[J].家电检修技术,2012(11):53.
[5]段廷魁.全球卫星定位系统(GNSS)在工程测量中的实践运用探索0[J].科技创新与应用,2021(05):182-184.
[6]宋戈,黄鹤松.51单片机应用开发范例大全[M].北京:人民邮电出版社:国家信息技术紧缺人才培养工程系列丛书,201206.558.
[7]罗小青.单片机原理及应用教程[M].北京:人民邮电出版社,201409.180.
[8]沈庆阳.单片机实践与应用[M].北京:清华大学出版社,2002.
[9]杜深慧.温湿度检测装置的设计与实现[M].北京:机械工业出版社,2004.
[10]林嘉.基于89S52的LCD1602程序设计[J].电脑知识与技术,2012(26):6376-6378.
[11]刘光伟.基于单片机的温室温湿度监测系统设计与实现[D].秦皇岛市:燕山大学,2012.
[12]褚福强,董学仁.单片机的网络接入技术研究[J].仪器仪表用户,2006(05):4-5.
[13]陈英俊.基于单片机的温湿度监测和报警系统设计[J].广东石油化工学院学报,2013(04):42-46.
[14]廖丽媛.基于应变式扭矩传感器的测量系统的设计[D].上海市:东华大学,2013.
[15]刘九庆.温室环境工程技术[M].吉林:东北林业大学出版社,2002.
[16]王明喜,崔世茂.大棚型日光温室光照、温度及湿度等性能的初步研究[J].农业工程技术(温室园艺),2008(05):19-21.
[17]张迎辉.单片微型计算机键盘接口设计[J].信息技术,2004(07):68-69+91.
[18]张友德,赵志英.单片微型机原理应用与实验[M].上海市:复旦大学出版社,2003.
[19]赵芝芸.温室智能监控系统[D].江苏:江苏科技大学,2010.
[20]张宏伟.基于STM32的智能环境监测系统设计与实现[J].大庆师范学院学报,2020(05):32-35.
[21]王世伟,杨越.基于STM32的多型号舵机调试器设计[J].九江学院学报(自然科学版),2020,35(02):33-36.
[22]Pengcheng Zhao,Meijun Ni,Chao Chen,Chenxi Wang,PingpingYang,Xiahui Wang,Chunyan Li,Yixi Xie,Junjie Fei. A Novel Self-protection Hydroquinone Electrochemical Sensor Based on Thermo -sensitive Triblock Polymer PS-PNIPAm-PS[J].
[23]Jian Wang,Jing Chen,Xiaofu Xiong,Xiaofeng Lu,ZhengLiao,Xiaobo Chen.Temperature safety analysis and backup protectionscheme improvement for overhead transmission line in poweroscillation condition[T].Electric Power Systems Research,2019,166.
[24]Fuji Electric Co.Ltd.;Patent Issued for SeiconductorDevice And Method Of Outputting Temperature Alarm (USPTO10,164,626)[J].Electronics Newsweekly,2019.
[25]VERSID,INC;Patent Issued for Refrigeration UnitTemperature Alarm Using Thermal Properties of Food to Eliminate FalseAlarms (USPTO 9752810)[J].Computers,Networks &Communications,2017.
[26]Fuji Electric Co.Ltd;Patent Application Titled"Semiconductor Device and Method of Outputting Teperature Alarm"Published Online (USPTO 20170077919)[J]. Technology & BusinessJournal,2017.
[27]su Yuanping,Xu Lihong,Goodman Erik D.Multi-layerhierarchical optimisation of greenhouse climate setpoints for energyconservation and improvement of crop yield[J].Biosystems
[28]黄松茂.基于STM32的家庭环境监测系统的设计与实现[D].甘肃兰州.西北师范大学,2018.:23-30.
[29]李大琳.智能车内温度监测系统设计[J].山东工业技术,2014(12):80-81.
[30]郭雯,王海涛. 智能输液系统的发展与应用.医疗卫生装备,shiwu

 实物可做,资料齐全,其他功能也可做~可供学习和参考使用!

基于51单片机的MLX90614红外测温仪实验指导书(含源代码) MLX90614 MLX90615 红外测温 51单片机 SMBus 这是经过本人实验测试得到的成果,再次将之分享给大家,希望对搞温度测量及控制的人有所帮助!时钟线 数据线 温度显示第个数码管段选 温度显示第个数咼管段迮 温度显示第个数码管段选 矩阵键盘第列 矩阵键盘第列 矩阵键盘第列 矩阵键盘第行 矩阵键盘第行 矩阵键盘第行 数据定义 可位寻址数据 数码管码值定义 显示代码,共阳不带小数点的 显示代码,共阳带小数点的 仝局变量定义 定时标志位 定时毫秒数 向写入命令或数据 数据 清屏 光标返回原点 设置显示模式 显示开 显示关 显示光标 无光标 光标闪动 光标不闪动 设置输入模式 光标石移 默认光标左移 田面可半移 默认画面不移动 命令模式 对操作 操作 进入命令模式 退出命令模式 读标志 进入睡眠馍式 地址(只读) 周围温度 环境温度 单元 目标温度红外温度 单元 地址 测量范围上限设定 测量范围下限设定 设定 环境温度设定 频率修正系数 配置寄存器 器件地址设定 保留 保留 地址 地址 地址 地址 函数声明 发起始位子程序 发结東位子程序 接收字节子程序 发送位子程序 接收字节子程序 接收位子程序 延时程序 读温度数据 初始化子程序 判断忙子程序 写命令子程序 写数据子程序 显示子程序 字符串显示程序 主函数 温度变量 初始化 每 扫描一次键盘 按下键时,进行数码管显示 液品屏显示 读取温度 清屏 显示字符串 且换行 显示温度 显示摄氏度 延吋再读取温度显 字符串显示稈序 字符串显示程序 直到字符肀结束 转成码 指向下一个字符 输入转换并显示用于 温度为止 温度整数 温度小数 温度超过度 显示温度百位 显小温度十位 显示温度个位 温度超过度 显小温度十位 显示温度个位 温度不超过度 显示温度个位 显示小数点 温度小数点后第位数不等于 显示温度小数点后第位数 显示温度小数点后第位数 温度小数点斤第位数等于 显示温度小数点后第位数 显示温度小数点后第位数 温度为负
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值