本程序出自:http://www.zg4o1577.cn/bbs/dpj-181601-1.html
本作品大部分內容來自于網上轉載,做出了一些修改,目前也不是很完善,望大家能繼續完善本開源作品,一起學習,共同進步,感謝開源作者,感謝大家:
非接觸式智能測溫系統
本系統以單片機STC89C51為核心,使用紅外傳感器作為感應器,檢測是否有人要進行溫度測量,將檢測的結果轉化為電信號傳輸至單片機中。單片機再進行判斷是否啟用紅外測溫傳感器進行溫度數據采集。將采集的數據送至單片機進行計算、處理后傳輸到OLED顯示屏進行顯示,并且由MP3播放器進行播報溫度是否正常。
隨著人們對自身安全和健康要求的不斷提高,原有接觸式水銀溫度腋測法的缺點不斷顯露。其接觸式的體溫測量方法可能直接導致發熱類的傳播。臨床上常用的水銀體溫計雖價格便宜,測量性能穩定,但缺點明顯,測溫時間長,消毒繁瑣,易破損,造成水銀泄漏,增加護理工作量和潛在危險性, 不適用于人員流動較大的公共場所進行體溫篩查。選擇一種快速、簡單、精確的體溫篩查器械尤為重要,紅外體溫測量裝置在大規模人群防控傳染病監測中具有較好的應用效果,具有適應性高、響應快、精度高、可動態監測等優勢。 因此許多國家紛紛采取措施,主要方法是采用手持式的紅外測溫儀檢測。該方式的優點是不接觸皮膚,對人體無任何害處,而且速度快,在1秒鐘內就能鑒別被檢測者是否發燒,缺點是增加了檢測者的感染幾率,給他們造成很大的心理負擔。在復學的同時,我們迎來了電子系統設計,借助這次設計作品的機會我們研發了一款具有自動感應、自動測量、智能播報的非接觸式智能測溫系統,該系統不僅可以提高測量效率,還可以有效地解決檢測者被感染的問題。 二、系統硬件的具體設計與實現 2.1系統原理和框圖 非接觸式智能測溫系統的硬件組成如下圖2-1所示。本系統主要由STC89C51單片機及其外圍電路、紅外檢測傳感器、紅外測溫傳感器、顯示裝置、MP3播放器等五部分組成。單片機循環檢測由紅外傳感器檢測傳輸來的電信號,據此產生的電信號來判斷是否有人,同時紅外測溫傳感器進行相應的工作方式。當檢測到有人靠近時,紅外測溫傳感器開始運行,此時OLED顯示屏上將會顯示當前檢測者的溫度,并且進行語音播報溫度是否正常(體溫在36.2°—37.2°之間播放:體溫正常且綠燈亮起;否則,播報體溫異常且紅燈亮起)。如果沒有人靠近,OLED顯示屏將會在2秒之后進行熄屏。此時紅外傳感器繼續檢測是否有人。
1.png (47.74 KB, 下載次數: 86)
下載附件
2020-10-22 10:26 上傳
圖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 (23.3 KB, 下載次數: 90)
下載附件
2020-10-22 10:27 上傳
圖3-1系統程序流程圖
四、系統創新 1、相對于額溫槍而言,該作品采用了智能感應,實現了非接觸式紅外測溫,可以有效地解決檢測者被感染的問題。 2、在OLED顯示溫度的基礎上,增加了智能語音播報系統,免去了人眼去獲取數據的步驟。 3、在GY-906紅外測溫的探頭上添加了菲涅爾光學透鏡,增加了紅外探頭的測試距離,也使整個測試系統更加穩定。 五、相關調試 5.1 電前檢查 任何電子電路在組裝好之后,都必須要進行線路檢查,以免出現短路。檢查的方法就是按照一定順序對照著電路圖進行逐級檢查,其中要特別注意電源是否連接正確,電源與地是否有短接,集成電路和晶體管的引腳是否連接正確,用手輕輕觸動一下元器件看焊點是否焊牢等等。 5.2 通電檢查 將所需電源電壓數值先調試好之后,就可以接通電路電源。電源接通之后,先觀察電路是否出現異,F象,例如出現冒煙、異常氣味以及器件發燙等等。如果出現上述異,F象就應該立即斷開電源,在確保 排除故障后才能再次接通電源。然后,測量每個集成塊的電源引腳電壓是否正常,確保集成電路已進行正常的通電工作。 5.3 軟件調試 硬件調試完之后還要進行軟件調試,就是將程序寫入到單片機的存儲器中來實現整個實物的設計功能。 六、結論 體溫作為防控篩查的重要指標之一,其數據需高度準確,以利于醫護人員及時采取防控措施。在體溫篩查中,應用非接觸式智能測溫系統進行體溫初步篩查安全、有效,測量時間短,節約時間,降低感染風險,節省工作人員勞動量等。 在此次非接觸式智能測溫控制系統的設計中,讓我感覺到了單片機應用的廣泛性,它很貼切我們的日常生活,應用無處不有,它并不是想象中的那么復雜。在設計中,要充分了解所用芯片的使用條件及輸入輸出的特性,這樣才能避免因使用錯誤而多走彎路。電路設計部分應該有的精神就是廣集資料。只憑借自己頭腦中的知識是遠遠不夠的。哪里出現了問題,就要翻書本,或上網查資料。當然也要開動自己的腦筋怎樣使系統電路更完美。例如我的設計是非接觸式智能測溫系統。有非接觸式測溫,自然會用到紅外測溫傳感器,每種紅外測溫傳感器都有不同的特性和功能,你就要進行選擇了。例如對紅外測溫傳感器的選擇,你就要選擇你所熟悉的、所了解的。在電路設計時,應充分發揮單片機的記憶運算、判斷控制能力,避免采用復雜的、穩定性較差的模擬電路。為了使微機控制系統各種硬件設備能夠正常運行,有效地實現作品的相關功能,除了要設計合理的硬件電路,還必須要有高質量的軟件支持,兩者相輔相成,共同維持系統的正常運作。
七、單片機+MLX90614代碼及作品圖 - #include "reg52.h"
- #include "stdio.h"
- #include "LQ12864.h"
- #include "GY906.h"
- #include "eepom.h"
- sbit hongwai=P1^5; //紅外感應傳感器
- sbit MP3_1 = P2^4; //語音播放異常
- sbit MP3_2 = P2^5; //語音播放正常
- sbit LED1 = P1^2; //紅色LED燈
- sbit LED2 = P1^3; //綠色LED燈
- float wendu_change;
- unsigned int temp_int;
- unsigned int temp ;
- unsigned int ceshi ;
- uint temp_[3]={0};
- uint biaohao_num_[3]={0};
- uchar diaplay_5s = 0; //讀取顯示
- uchar flage_5s; //5s計時
- uint zhancun;
- uchar first_flage = 1;
- /*
- 紅外感應傳感器 P1^5;
- 語音播放 P2^4/P2^5
- LED P1^2/P1^3
- oled 端口定義
- sbit SCL_OLED=P1^0; //串行時鐘
- sbit SDA_OLED=P1^1; //串行數據
- //GY-906 端口定義
- sbit SCL=P2^6;// 時鐘線
- sbit SDA=P2^7;// 數據線
- */
- void oled_gd_diaplay()
- {
-
- OLED_P16x16Ch(70,0,0); //溫
- OLED_P16x16Ch(90,0,1); //度
- OLED_P16x16Ch(110,0,2); //:
- // dxzm('.',70,0); //.
-
- }
- void oled_wendu()
- {
- char i;
- if(temp > 0)
- {
- if (0 == diaplay_5s)
- {
-
- OLED_P16x16Ch(0,0,3); // 閩
- OLED_P16x16Ch(20,0,4); // 南
- OLED_P16x16Ch(40,0,5); // 科
- OLED_P16x16Ch(60,0,6); // 技
- OLED_P16x16Ch(80,0,7); // 學
- OLED_P16x16Ch(100,0,8); // 院
- OLED_P16x16Ch(0,4,0); // 溫
- OLED_P16x16Ch(20,4,1); // 度
- OLED_P16x16Ch(40,4,2); // :
-
- //我們要達到的體溫精度是0.1,因此要有三位數
- // dxzm(((int)(temp)/100)+48,50,0);
- dxzm(((temp)/100)+48,60,4); //進行顯示百位
- dxzm(((temp)/10%10)+48,70,4); //進行顯示十位
- dxzm('.',80,4); //進行顯示.
- dxzm(((temp)%10+48),90,4); //進行顯示個位
- }
-
- else //讀取溫度標志位等于 1
- {
- oled_gd_diaplay();
- TR0 =1; //打開定時器
-
- for(i = 0;i < 3;i++)
- {
-
- dxzm(0+48,70,i*2+2);
- dxzm((temp_[i]/100)+48,80,i*2+2);
- dxzm((temp_[i]/10%10)+48,90,i*2+2);
- dxzm('.',100,i*2+2); //.
- dxzm((temp_[i]%10)+48,110,i*2+2);
-
- }
-
- if(flage_5s >= 100) //顯示5s
- {
- TR0 = 0;
- diaplay_5s = 0;
- flage_5s = 0;
- OLED_Fill(00);
- }
-
- }
- }
-
- }
- /******************把數據保存到單片機內部eepom中******************/
- void write_eepom(uchar num)
- { char num_num,i;
- if(1 == first_flage)
- {
- SectorErase(0x2000);
- first_flage = 0;
- }
-
- if(5 == num)
- {
- for(i=0;i<9;i++)
- {
- byte_write(0x2000+i,0);
- }
- }
- else if(num!=5)
- {
- num_num = num*3;
- byte_write(0x2000+num_num,(temp) % 256);
- byte_write(0x2001+num_num,(temp) / 256);
- byte_write(0x2002+num_num,num);
- }
- }
- /******************把數據從單片機內部eepom中讀出來*****************/
- void read_eepom(uchar tem_num, uchar biao ,uchar num)
- {
- temp_[tem_num] = byte_read(0x2001+num*3);
- temp_[tem_num] <<= 8;
- temp_[tem_num] |= byte_read(0x2000+num*3);
- biaohao_num_[biao] = byte_read(0x2002+num*3);
- }
- void read_all_data()
- {
- uchar i;
- for(i =0;i<3;i++)
- {
- read_eepom(i,i,i);
- // delay(50);
- }
- }
- void Tim_init()
- {
- SCON = 0x50; /* 010 1 0000B,工作方式1, 8位UART,波特率可變,允許接收 */
- TMOD = 0x21; /* T1工作于方式2 T0工作在方式1*/
- TCON = 0x40; /* 定時器1開始計數 */
- TH1 = 250; /* T1計數初值 */
- TL1 = 250;
- PCON = 0x80; /* SMOD置1,雙倍速率 */
- RI = 0;
- TI = 1; //串口打印必需為1
-
- TL0 = (65536-50000)%256; //reload timer0 low byte
- TH0 = (65536-50000)/256; //reload timer0 high byte
- // TR0 = 1; //timer0 start running
- ET0 = 1; //enable timer0 interrupt
- EA = 1; //open global interrupt switch
- }
-
- int main(void)
- {
- Tim_init(); //定時器和串口的初始化
- i2c_Init(); //屏幕通訊初始化
- OLED_Init(); //oled顯示初始
- while(1)
- {
- if(hongwai==0) //紅外感應傳感器判斷是否有人
- {
- temp = (int)(memread()*10); // 讀取溫度,讀取小數點后一位所以*10
- oled_wendu(); // oled顯示當前溫度
- if(temp>372) //判斷溫度是否大于37.2
- {
- MP3_1=0; //播放體溫異常
- LED1=0; // 同時紅色LED燈亮起
- delay(1000); // 給語音播放和紅色lED燈亮,留一點時間
- MP3_1=1; // 關閉語音播放
- LED1=1; //關閉紅色LED
- }
- else if(temp<361) //判斷溫度是否小于36.1
- {
- MP3_1=0; //播放體溫異常
- LED1=0; // 同時紅色LED燈亮起
- delay(1000); // 給語音播放和紅色lED燈亮留一點時間
- MP3_1=1; // 關閉語音播放
- LED1=1; //關閉紅色LED
- }
- else // 溫度在36.1-37.2之間
- {
- MP3_2=0; //播放體溫正常
- LED2=0; // 同時綠色LED燈亮起
- delay(1000); // 給語音播放和綠色lED燈亮,留一點時間
- MP3_2=1; // 關閉語音播放
- LED2=1; //關閉綠色LED
- }
- delay(1200); //使得一秒左右的時間,只采集一次,避免測量者再測溫的時候一下子采集了好幾組數據
-
- }
- else //紅外檢測沒人
- {
-
- MP3_1=1; // 關閉語音播放
- MP3_2=1; // 關閉語音播放
- LED1=1; //關閉紅色LED
- LED2=1; //關閉綠色LED
- delay(1200); //調用延時 ,讓最后一個的體溫數據顯示停留一段時間
- OLED_Fill(0x00); //進行清屏,熄滅屏幕
- }
-
- }
- }
- /* Timer0 interrupt routine */
- void tm0_isr() interrupt 1 using 1 //50ms中斷計時
- {
- TL0 = (65536-50000)%256; //reload timer0 low byte
- TH0 = (65536-50000)/256; //reload timer0 high byte
- flage_5s++;
- }
-
復制代碼
SRGN0XWJ{KD_C`TE3}FJ{5C.png (118.03 KB, 下載次數: 83)
下載附件
2020-10-22 10:32 上傳
測試圖2.jpg (1.45 MB, 下載次數: 92)
下載附件
2020-10-22 10:30 上傳
51hei.png (5.54 KB, 下載次數: 95)
下載附件
2020-10-22 16:29 上傳
本程序出自:http://www.zg4o1577.cn/bbs/dpj-181601-1.html
本作品大部分內容來自于網上轉載,做出了一些修改,目前也不是很完善,望大家能繼續完善本開源作品,一起學習,共同進步,感謝開源作者,感謝大家:
上圖代碼的Keil工程文件51hei附件下載:
非接觸式智能測溫系統-程序.zip
(94.66 KB, 下載次數: 239)
2020-10-22 10:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|