13876| 16
|
[项目] 测温枪—疫情的刚需 |
测温枪 大疫当前不准出门,必不得已过路卡进商店必先测体温,无论年老年少,贫穷与富有,不管官多大谁都难逃这"温柔一枪"。 ![]() 进出大门要先来一"枪" 按说测量体温应该用温度计,怎么还用上了枪?好吓人!按照常理来说应该每人发一个温度计,腋窝里一夹过个几分钟就出结果了,用枪打是不是很复杂。说的一点都没错,但是有没有考虑人员很多,每人发一温度计排队测体温,也不知道这个"测温长龙"什么时候能测完,既不方便又很麻烦,况且多人共用体温计还不卫生。 ![]() 红外测温仪,一秒测温,方便快捷 怎么办呐?这就要请出我们的这个神器"测温枪"了。说实话喊它"枪",它自己都不知道去哪里喊冤。怪就怪样子长的像"枪",操作起来"枪口"对准脑门,扣动扳机,嘀嗒一声后,看显示屏,1秒钟就得出了数据,所以这个名就因此名副其实的坐实了。 既然喊它为"测温枪",今天就来说说它如何测体温? 测温枪,学名是“红外线测温仪”或者“红外线辐射测温仪”。它的原理是:被动吸收目标的红外辐射能量,从而获得物体温度数值。 ![]() 图片来自网络图片 现在小区门口的测温枪基本是这个原理 所以思路缕清后,我们只需把一个这样的卡比放在测温枪中,测量出它吸收辐射后释放的热辐射量,就能换算出被测物对应的温度了。 ![]() 图片来自网络图片 由于制作这个项目需要用到一块GY-906传感器模块。选用这颗传感器除了是因为使用红外的非接触测温外,最重要的是它的通讯方式是I2C通信协议(也有写成IIC的)主要用到SDA和SCL两条线。 ![]() GY-906主要特点:
![]() 图片来自网络图片 如上所示,您可以将感应范围视为传感器点的圆锥形状。因此,当我们远离测量对象时,感应区域增加了两倍。每1cm的含义我们远离物体移动感应区域增长2cm。在我们的温度枪中,我们在传感器顶部放置了一个激光二极管,以了解传感器当前指向的传感区域。我发现,如果枪指向离物体2厘米处,并且随着我们离开时精度下降,则值是可靠的。 ![]() OLED屏因其小巧轻薄耗电低等特点,越来越多的应用于嵌入式电子设备中。OLED屏种类不同,显示的颜色也不同,常用的有白色显示、蓝色显示和黄蓝双色显示。屏幕的尺寸和内置驱动芯片也多种多样,常用的驱动接口有SPI和IIC两种。本篇中使用的使一款0.96寸蓝色IIC驱动屏,其内置驱动芯片为SSD1306。 ![]() OLED显示屏驱动库非常多,本篇我们使用两个库:「Adafruit_SSD1306」和「Adafruit_GFX」。在Arduino IDE中点击「项目」—「加载库」—「管理库」,分别查找选择最新版本进行安装。 ![]() 由于我们的测温传感器使用了IIC,所以我们的显示屏不能在使用IIC了,具体接线如下 ![]() 程序编写 和往常一样,我们在程序中首先添加所需的库文件。这里的Wire库(内置)用于使用I2C协议进行通信,ML90614库用于与传感器通信。 SPI、GFX和SSD1306库用于与4线SPI协议通信到OLED显示模块。 定义头文件 [mw_shl_code=c,false]#include <Wire.h> #include "SparkFunMLX90614.h" #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>[/mw_shl_code] 定义OLCD引脚 [mw_shl_code=c,false]#define OLED_MOSI 9 #define OLED_CLK 10 #define OLED_DC 11 #define OLED_CS 12 #define OLED_RESET 13[/mw_shl_code] 初始化OLCD [mw_shl_code=c,false]Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);[/mw_shl_code] 读取数据 [mw_shl_code=c,false]temperature = String(therm.object(), 2);[/mw_shl_code] 数据算法 [mw_shl_code=c,false]float tempFloat; // First convert each temperature to Kelvin: if (_defaultUnit == TEMP_F) { // Convert from farenheit to Kelvin tempFloat = (calcTemp - 32.0) * 5.0 / 9.0 + 273.15; } else if (_defaultUnit == TEMP_C) { tempFloat = calcTemp + 273.15; } else if (_defaultUnit == TEMP_K) { tempFloat = calcTemp; } // Then multiply by 0.02 degK / bit tempFloat *= 50; rawTemp = (int16_t) tempFloat;[/mw_shl_code] 代码下载 关注微信公众号“KIDLINTEACH创客实验室”,回复“测温枪”获取完整代码。 最后附上整个制作过程视频,仅供欣赏。 |
上月就想做一个,计划买那个串口输出的红外传感模块不用考虑这个那个补偿的,没货就买个普通的模块也没货有货的比年前贵了好些倍 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed