找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15196|回复: 10
收起左侧

GY-906 MLX90614红外测温模块单片机代码及全部注释 OLED显示 非接触式智能测温系统

  [复制链接]
ID:578997 发表于 2020-10-22 10:36 | 显示全部楼层 |阅读模式
本程序出自:http://www.51hei.com/bbs/dpj-181601-1.html
本作品大部分内容来自于网上转载,做出了一些修改,目前也不是很完善,望大家能继续完善本开源作品,一起学习,共同进步,感谢开源作者,感谢大家:

非接触式智能测温系统

本系统以单片机STC89C51为核心,使用红外传感器作为感应器,检测是否有人要进行温度测量,将检测的结果转化为电信号传输至单片机中。单片机再进行判断是否启用红外测温传感器进行温度数据采集。将采集的数据送至单片机进行计算、处理后传输到OLED显示屏进行显示,并且由MP3播放器进行播报温度是否正常。


随着人们对自身安全和健康要求的不断提高,原有接触式水银温度腋测法的缺点不断显露。其接触式的体温测量方法可能直接导致发热类的传播。临床上常用的水银体温计虽价格便宜,测量性能稳定,但缺点明显,测温时间长,消毒繁琐,易破损,造成水银泄漏,增加护理工作量和潜在危险性,
不适用于人员流动较大的公共场所进行体温筛查。选择一种快速、简单、精确的体温筛查器械尤为重要,红外体温测量装置在大规模人群防控传染病监测中具有较好的应用效果,具有适应性高、响应快、精度高、可动态监测等优势。
因此许多国家纷纷采取措施,主要方法是采用手持式的红外测温仪检测。该方式的优点是不接触皮肤,对人体无任何害处,而且速度快,在1秒钟内就能鉴别被检测者是否发烧,缺点是增加了检测者的感染几率,给他们造成很大的心理负担。在复学的同时,我们迎来了电子系统设计,借助这次设计作品的机会我们研发了一款具有自动感应、自动测量、智能播报的非接触式智能测温系统,该系统不仅可以提高测量效率,还可以有效地解决检测者被感染的问题。
二、系统硬件的具体设计与实现
2.1系统原理和框图
非接触式智能测温系统的硬件组成如下图2-1所示。本系统主要由STC89C51单片机及其外围电路、红外检测传感器、红外测温传感器、显示装置、MP3播放器等五部分组成。单片机循环检测由红外传感器检测传输来的电信号,据此产生的电信号来判断是否有人,同时红外测温传感器进行相应的工作方式。当检测到有人靠近时,红外测温传感器开始运行,此时OLED显示屏上将会显示当前检测者的温度,并且进行语音播报温度是否正常(体温在36.2°—37.2°之间播放:体温正常且绿灯亮起;否则,播报体温异常且红灯亮起)。如果没有人靠近,OLED显示屏将会在2秒之后进行熄屏。此时红外传感器继续检测是否有人。
                                     1.png
           图2-1系统设计框图

2.2主控芯片
该作品采用了STC89C51作为控制核心,对每个模块传送过来的数据进行处理并发送。该单片机是一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。内部看门狗定时器、低电压复位和低电压检测等内部保护特性。
2.3红外测温传感器
2.3.1红外测温原理
红外测温系统是采用红外测温模块接收不同光谱,经过STC89C51单片机处理后在OLED显示模块上显示不同数字来实现的。物体或人的不同温度反应出不同的光谱,红外测温系统发射一束光到物体或人的表面,然后反射到红外测温模块中接收,其物体或人的温度的光谱经过红外测温模块处理后,将以数字信号传给单片机,再由OLED显示模块显示出来。
2.3.2 GY-906 MLX90614的特点
1)应用范围广泛,适用于恒温控制、工业系统、消费类产品、温度计或任何热敏系统。
2)体积小巧,可安装于狭小的空间范围内,进行温度测量。
3)易集成。
4)3V和5V电源电压。
(5)节能工作模式。
(6)车用级别标准。
2.4红外感应传感器
该传感器对环境光线适应能力强,其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收。经过比较器电路处理之后绿色指示灯会亮起,同时信号输出接口输出数字信号(一个低电平)。该传感器的探测距离可以通过电位器调节、具有干扰小、便于装配、使用方便等特点。



2.5显示装置
OLED(Organic Light-Emitting Diode)有机发光二极管又称为有机激光显示、OLED显示技术具有自发光的特性、采用非常薄的有机材料涂层和玻璃基板、当有电流通过时、这些有机材料就会发光、而且OLED显示屏幕可视角大、功耗低、OLED由于同时具备自发光、不需背光源、对比度高、厚度薄视角广、反应速度快、可用于挠曲面板、使用温度范围广、结构及制程等优异之特性、先接触的1286屏都是LCD的、需要背光、功耗较高,OLED的功耗低、更加适合小系统、由于两者发光材料的不同、在不同的环境中、OLED的显示效果好、模块供电可以是3.3v也可以是5v、不需要修改模块电路、OLED屏具有多个控制指令、可以控制OLED的亮度、对比度、开关升压电路等指令、操作方便、功能丰富、可显示汉字、ASCII、图案等、同时为了方便应用在产品上、预留4个M3固定孔、方便用户固在机壳上。
2.6 MP3播放器
YS-M3语音播放器的特点有:
(1)触发一次播放一次。
(2)9个触发端口,直接触发播放。
(3)结合单片机IO口编码触发播放31首MP3。
(4)内部带3W功放,满足大部分应用要求。
三、系统软件设计
3.1 程序描述
程序中主要用到的知识点有:单片机定时器、红外测温传感器的I2C通信方式和温度计算、OLED的显示、延时函数的调用以及LED灯的亮灭等。其中,单片机中的定时器尤为重要,主要用于产生固定时间,也可以作为UART等外设的频率发生器。
3.2 程序设计思路
红外感应传感器一旦检测到有人靠近,红外测温模块开始采集温度数据并送至单片机进行计算,再将单片机计算出来的数据进行比较,若在正常范围值,则单片机发送一个低电平信号到MP3播放器进行播报“体温正常”且绿灯亮起。否则,播报“体温异常”且红灯亮起。同时,OLED显示屏也将从单片机得到处理完的温度数据进行显示当前检测温度,若在两秒后没人检测温度,OLED显示屏将会熄灭。此时红外感应传感器持续检测是否有人。
3.3 程序流程图
作品的程序流程图如下图3-1所示,红外感应传感器一旦检测到有人,将会发送一个低电平信号到单片机中,单片机即发出开始信号START,紧接着在总线上发出寻址信号(AddressByte),其地址信息的读/写控制位为1时,表示对GY-906进行读操作。单片机接收到GY-906的应答信号,通信建立起来,接着GY-906发送温度数据的高8位。单片机则开始一位一位的接收GY-906发出的温度数据,然后保存,完成8位数据接收后,单片机便发送一个应答信号。GY-906收到应答信号后,再发送温度数据的低8位。单片机收到并保存低8位数据后,单片机在紧随的下一个周期拉高SDA,发送不应答信号。由此单片机将得到十六位二进制数并加以处理,变成十进制的BCD码,最后通过显示屏显示出来。

                                                2.png

                      图3-1系统程序流程图


四、系统创新
1、相对于额温枪而言,该作品采用了智能感应,实现了非接触式红外测温,可以有效地解决检测者被感染的问题。
2、在OLED显示温度的基础上,增加了智能语音播报系统,免去了人眼去获取数据的步骤。
3、在GY-906红外测温的探头上添加了菲涅尔光学透镜,增加了红外探头的测试距离,也使整个测试系统更加稳定。
五、相关调试
5.1 电前检查
任何电子电路在组装好之后,都必须要进行线路检查,以免出现短路。检查的方法就是按照一定顺序对照着电路图进行逐级检查,其中要特别注意电源是否连接正确,电源与地是否有短接,集成电路和晶体管的引脚是否连接正确,用手轻轻触动一下元器件看焊点是否焊牢等等。
5.2 通电检查
将所需电源电压数值先调试好之后,就可以接通电路电源。电源接通之后,先观察电路是否出现异常现象,例如出现冒烟、异常气味以及器件发烫等等。如果出现上述异常现象就应该立即断开电源,在确保 排除故障后才能再次接通电源。然后,测量每个集成块的电源引脚电压是否正常,确保集成电路已进行正常的通电工作。
5.3 软件调试
硬件调试完之后还要进行软件调试,就是将程序写入到单片机的存储器中来实现整个实物的设计功能。
六、结论
体温作为防控筛查的重要指标之一,其数据需高度准确,以利于医护人员及时采取防控措施。在体温筛查中,应用非接触式智能测温系统进行体温初步筛查安全、有效,测量时间短,节约时间,降低感染风险,节省工作人员劳动量等。
在此次非接触式智能测温控制系统的设计中,让我感觉到了单片机应用的广泛性,它很贴切我们的日常生活,应用无处不有,它并不是想象中的那么复杂。在设计中,要充分了解所用芯片的使用条件及输入输出的特性,这样才能避免因使用错误而多走弯路。电路设计部分应该有的精神就是广集资料。只凭借自己头脑中的知识是远远不够的。哪里出现了问题,就要翻书本,或上网查资料。当然也要开动自己的脑筋怎样使系统电路更完美。例如我的设计是非接触式智能测温系统。有非接触式测温,自然会用到红外测温传感器,每种红外测温传感器都有不同的特性和功能,你就要进行选择了。例如对红外测温传感器的选择,你就要选择你所熟悉的、所了解的。在电路设计时,应充分发挥单片机的记忆运算、判断控制能力,避免采用复杂的、稳定性较差的模拟电路。为了使微机控制系统各种硬件设备能够正常运行,有效地实现作品的相关功能,除了要设计合理的硬件电路,还必须要有高质量的软件支持,两者相辅相成,共同维持系统的正常运作。
   七、单片机+MLX90614代码及作品图
  1. #include "reg52.h"
  2. #include "stdio.h"
  3. #include "LQ12864.h"
  4. #include "GY906.h"
  5. #include "eepom.h"

  6. sbit  hongwai=P1^5;                                  //红外感应传感器
  7. sbit MP3_1 = P2^4;                                              //语音播放异常
  8. sbit MP3_2 = P2^5;                                                  //语音播放正常
  9. sbit LED1 = P1^2;                                                  //红色LED灯
  10. sbit LED2 = P1^3;                                                  //绿色LED灯

  11. float  wendu_change;
  12. unsigned int temp_int;
  13. unsigned int  temp ;
  14. unsigned int ceshi ;
  15. uint temp_[3]={0};
  16. uint biaohao_num_[3]={0};
  17. uchar diaplay_5s = 0;                        //读取显示
  18. uchar flage_5s;                         //5s计时
  19. uint zhancun;
  20. uchar first_flage = 1;


  21. /*

  22. 红外感应传感器 P1^5;
  23. 语音播放       P2^4/P2^5
  24. LED            P1^2/P1^3

  25. oled  端口定义
  26. sbit SCL_OLED=P1^0; //串行时钟
  27. sbit SDA_OLED=P1^1; //串行数据

  28. //GY-906 端口定义
  29. sbit  SCL=P2^6;// 时钟线
  30. sbit  SDA=P2^7;// 数据线
  31. */



  32. void oled_gd_diaplay()
  33. {
  34.         
  35.                 OLED_P16x16Ch(70,0,0);         //温
  36.                 OLED_P16x16Ch(90,0,1);        //度
  37.                 OLED_P16x16Ch(110,0,2);        //:
  38. //                dxzm('.',70,0);                        //.
  39.         
  40. }

  41. void oled_wendu()
  42. {

  43.         char i;
  44.         if(temp > 0)
  45.         {
  46.                         if (0 == diaplay_5s)        
  47.                         {
  48.                                 
  49.                                         OLED_P16x16Ch(0,0,3);          // 闽
  50.                                 OLED_P16x16Ch(20,0,4);             // 南
  51.                                         OLED_P16x16Ch(40,0,5);          // 科
  52.                                 OLED_P16x16Ch(60,0,6);             // 技
  53.                                         OLED_P16x16Ch(80,0,7);          // 学
  54.                                 OLED_P16x16Ch(100,0,8);             // 院

  55.                                 OLED_P16x16Ch(0,4,0);              // 温
  56.                                 OLED_P16x16Ch(20,4,1);             // 度
  57.                                 OLED_P16x16Ch(40,4,2);             //  :
  58.                                 
  59.                                         //我们要达到的体温精度是0.1,因此要有三位数
  60. //                                dxzm(((int)(temp)/100)+48,50,0);
  61.                                 dxzm(((temp)/100)+48,60,4);          //进行显示百位        
  62.                                 dxzm(((temp)/10%10)+48,70,4); //进行显示十位
  63.                                 dxzm('.',80,4);                                  //进行显示.
  64.                                 dxzm(((temp)%10+48),90,4);          //进行显示个位
  65.                         }
  66.                         
  67.                         else                                       //读取温度标志位等于 1
  68.                         {
  69.                                         oled_gd_diaplay();                                 
  70.                                         TR0 =1;                              //打开定时器
  71.                                        
  72.                                 for(i = 0;i < 3;i++)
  73.                                 {
  74.                                        
  75.                                                 dxzm(0+48,70,i*2+2);
  76.                                                 dxzm((temp_[i]/100)+48,80,i*2+2);
  77.                                                 dxzm((temp_[i]/10%10)+48,90,i*2+2);
  78.                                                 dxzm('.',100,i*2+2);                        //.
  79.                                                 dxzm((temp_[i]%10)+48,110,i*2+2);        
  80.                                        
  81.                                 }
  82.                                 
  83.                                 if(flage_5s >= 100)          //显示5s
  84.                                 {
  85.                                         TR0 = 0;
  86.                                         diaplay_5s = 0;
  87.                                         flage_5s = 0;
  88.                                         OLED_Fill(00);
  89.                                 }
  90.                                 
  91.                         }
  92.         }
  93.                
  94. }

  95. /******************把数据保存到单片机内部eepom中******************/
  96. void write_eepom(uchar num)
  97. {        char num_num,i;
  98.         if(1 == first_flage)
  99.         {
  100.                 SectorErase(0x2000);
  101.                 first_flage = 0;
  102.         }
  103.         
  104.         if(5 == num)
  105.         {
  106.                 for(i=0;i<9;i++)
  107.                 {
  108.                         byte_write(0x2000+i,0);
  109.                 }

  110.         }
  111.         else if(num!=5)
  112.         {
  113.                 num_num = num*3;
  114.                 byte_write(0x2000+num_num,(temp) % 256);
  115.                 byte_write(0x2001+num_num,(temp) / 256);
  116.                 byte_write(0x2002+num_num,num);
  117.         }

  118. }

  119. /******************把数据从单片机内部eepom中读出来*****************/
  120. void read_eepom(uchar tem_num, uchar biao ,uchar num)
  121. {
  122.         temp_[tem_num]  = byte_read(0x2001+num*3);
  123.         temp_[tem_num]  <<= 8;
  124.         temp_[tem_num]   |= byte_read(0x2000+num*3);
  125.         biaohao_num_[biao] = byte_read(0x2002+num*3);

  126. }

  127. void read_all_data()
  128. {
  129.         uchar i;
  130.         for(i =0;i<3;i++)
  131.         {
  132.                 read_eepom(i,i,i);
  133. //                delay(50);
  134.         }
  135. }

  136. void Tim_init()
  137. {
  138.                 SCON = 0x50;        /* 010 1 0000B,工作方式1, 8位UART,波特率可变,允许接收 */
  139.                 TMOD = 0x21;        /* T1工作于方式2 T0工作在方式1*/
  140.                 TCON = 0x40;        /* 定时器1开始计数 */
  141.                 TH1 = 250;                /* T1计数初值 */
  142.                 TL1 = 250;
  143.                 PCON = 0x80;        /* SMOD置1,双倍速率 */
  144.                 RI = 0;
  145.                 TI = 1;                //串口打印必需为1
  146.         
  147.     TL0 = (65536-50000)%256;                     //reload timer0 low byte
  148.     TH0 = (65536-50000)/256;               //reload timer0 high byte
  149. //    TR0 = 1;                        //timer0 start running
  150.     ET0 = 1;                        //enable timer0 interrupt
  151.     EA = 1;                         //open global interrupt switch
  152. }


  153.    

  154. int main(void)
  155. {
  156.         Tim_init();                                            //定时器和串口的初始化
  157.         i2c_Init();                                            //屏幕通讯初始化
  158.         OLED_Init();                                    //oled显示初始

  159.         while(1)
  160.         {
  161.                  if(hongwai==0)                                                        //红外感应传感器判断是否有人
  162.                   {
  163.                          temp = (int)(memread()*10);                //  读取温度,读取小数点后一位所以*10        
  164.                          oled_wendu();                                       //        oled显示当前温度
  165.                           if(temp>372)                                            //判断温度是否大于37.2
  166.                           {
  167.                             MP3_1=0;                                            //播放体温异常
  168.                                 LED1=0;                                                    // 同时红色LED灯亮起
  169.                                    delay(1000);                                    // 给语音播放和红色lED灯亮,留一点时间
  170.                                    MP3_1=1;                                            // 关闭语音播放
  171.                                  LED1=1;                                            //关闭红色LED
  172.                           }
  173.                           else if(temp<361)                                    //判断温度是否小于36.1
  174.                           {
  175.                             MP3_1=0;                                            //播放体温异常
  176.                                    LED1=0;                                                    // 同时红色LED灯亮起
  177.                                    delay(1000);                                        // 给语音播放和红色lED灯亮留一点时间
  178.                                   MP3_1=1;                                                // 关闭语音播放
  179.                                 LED1=1;                                                        //关闭红色LED
  180.                           }
  181.                           else                                                                // 温度在36.1-37.2之间         
  182.                           {
  183.                                     MP3_2=0;                                                //播放体温正常
  184.                                   LED2=0;                                                // 同时绿色LED灯亮起
  185.                                     delay(1000);                                // 给语音播放和绿色lED灯亮,留一点时间
  186.                                     MP3_2=1;                                                // 关闭语音播放
  187.                                   LED2=1;                                                //关闭绿色LED
  188.                           }
  189.                            delay(1200);                                                //使得一秒左右的时间,只采集一次,避免测量者再测温的时候一下子采集了好几组数据
  190.                
  191.                   }
  192.                   else                                                                        //红外检测没人
  193.                   {
  194.                   
  195.                           MP3_1=1;                                                        // 关闭语音播放
  196.                         MP3_2=1;                                                        // 关闭语音播放
  197.                         LED1=1;                                                                //关闭红色LED
  198.                         LED2=1;                                                                //关闭绿色LED
  199.                            delay(1200);                                                //调用延时 ,让最后一个的体温数据显示停留一段时间
  200.                         OLED_Fill(0x00);                    //进行清屏,熄灭屏幕
  201.                   }
  202.          
  203.         }
  204. }



  205. /* Timer0 interrupt routine */
  206. void tm0_isr() interrupt 1 using 1                //50ms中断计时
  207. {
  208.     TL0 = (65536-50000)%256;                     //reload timer0 low byte
  209.     TH0 = (65536-50000)/256;               //reload timer0 high byte
  210.                 flage_5s++;

  211. }



  212.         

复制代码

SRGN0XWJ{KD_C`TE3}FJ{5C.png 测试图2.jpg

51hei.png

本程序出自:http://www.51hei.com/bbs/dpj-181601-1.html
本作品大部分内容来自于网上转载,做出了一些修改,目前也不是很完善,望大家能继续完善本开源作品,一起学习,共同进步,感谢开源作者,感谢大家:
上图代码的Keil工程文件51hei附件下载:
非接触式智能测温系统-程序.zip (94.66 KB, 下载次数: 228)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:699194 发表于 2020-10-22 20:40 | 显示全部楼层
你好,这是我关注的博主发的,你抄别人的程序,然后原博主都不标志名字。。。你有点那个。。。。拿别的博主程序加了个提醒。。。。
回复

使用道具 举报

ID:97678 发表于 2020-10-23 11:00 | 显示全部楼层
我叫小大打 发表于 2020-10-22 20:40
你好,这是我关注的博主发的,你抄别人的程序,然后原博主都不标志名字。。。你有点那个。。。。拿别的博 ...

在哪里抄的?
说明一下!!!
回复

使用道具 举报

ID:699194 发表于 2020-10-24 19:51 | 显示全部楼层
jovew 发表于 2020-10-23 11:00
说明一下!!!

想看看原博主的东西吗
回复

使用道具 举报

ID:876653 发表于 2021-1-15 17:36 来自手机 | 显示全部楼层
请问MP3模块怎么接线呢,试了下能测体温,但是为什么每次测人体温都是40多度了,求教
回复

使用道具 举报

ID:905656 发表于 2021-5-23 22:54 来自手机 | 显示全部楼层
请问MP3模块具体型号是什么
回复

使用道具 举报

ID:957243 发表于 2021-8-1 12:02 | 显示全部楼层
海鹰zero 发表于 2021-1-15 17:36
请问MP3模块怎么接线呢,试了下能测体温,但是为什么每次测人体温都是40多度了,求教

原理图能分享一下吗?
回复

使用道具 举报

ID:328014 发表于 2021-8-1 17:12 | 显示全部楼层
123单片机学习 发表于 2021-8-1 12:02
原理图能分享一下吗?
直接看程序里面的引脚定义,如果和你的不同,根据自己的电路修改

回复

使用道具 举报

ID:990898 发表于 2021-12-12 23:11 | 显示全部楼层
那些没有的头文件是怎么打出来的?
回复

使用道具 举报

ID:1020809 发表于 2022-4-23 23:48 | 显示全部楼层
51hei团团 发表于 2021-8-1 17:12
直接看程序里面的引脚定义,如果和你的不同,根据自己的电路修改

你好,可以分享一下这个程序的全图吗?
回复

使用道具 举报

ID:1052693 发表于 2022-11-18 19:53 | 显示全部楼层
jovew 发表于 2020-10-23 11:00
说明一下!!!

我也想知道,我翔咨询点GY-906的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表