在调试电子电路或测试新的硬件设计时,我经常倾向于通过触摸它们来检查板上的组件是否异常变热。如果出现问题(通常是第一次尝试),这些组件可能会变得高达 80°C 或更高,不仅会烧毁组件,还会烧毁我的手指。在烧伤手指的次数比我记得的要多之后,我决定使用 Arduino 和红外温度传感器构建自己的温度枪。这款热枪将使用名为MLX90614的非接触式温度传感器制造; 因此,它不仅可以用于测量组件温度,还可以用于测量体温、表面温度、热通风等。当然,这些热敏枪在市场上很容易从 Fluke、Flir 等知名制造商那里买到。但它们并不容易放在你的口袋里,而且最重要的是,这比构建自己的小工具更有趣。
所需材料
Arduino Pro 迷你
MLX90614 红外温度传感器
OLED 显示屏 – SSD1306
9V电池
按钮
电池夹
连接线
MLX90614 红外测温仪
在继续本教程之前,了解 MLX90614 传感器的工作原理非常重要。市场上有许多温度传感器,我们一直在将DHT11 传感器和LM35广泛用于许多必须测量大气湿度或温度的应用。
在这里,对于热敏枪,我们需要一个传感器,它可以感应特定物体(不是环境)的温度,而无需直接与物体接触。为此,我们有接触较少的温度传感器,它利用激光或红外线来计算物体的温度。MLX90614 就是这样一种传感器,它使用红外能量来检测物体的温度。
MLX90614传感器是迈来芯微电子集成系统制造的,它内置了两个器件,一个是红外热电堆探测器(传感单元),另一个是信号调理DSP器件(计算单元)。它基于Stefan-Boltzmann 定律工作,该定律指出所有物体都会发射 IR 能量,并且这种能量的强度将与该物体的温度成正比。传感器中的传感单元测量目标物体发射了多少红外能量,计算单元使用 17 位内置 ADC 将其转换为温度值,并通过I2C 通信输出数据协议。传感器测量物体温度和环境温度以校准物体温度值。
MLX90614 红外温度传感器特性:
工作电压:3.6V 至 5V
物体温度范围:-70°C 至 382.2°C
环境温度范围:-40°C 至 125°C
分辨率/准确度:0.02°C
传感器和物体之间的距离应该是多少?
数据表没有直接回答的一个问题是传感器和物体之间的测量距离。该距离的值由术语视野 (FOV)给出,对于我们的传感器,视野约为 80°。
您可以将感应范围从传感器的点看成锥形,如上图所示。因此,当我们远离测量对象时,感应区域会增加两倍。这意味着我们距离物体每移动 1 厘米,感应区域就会增加 2 厘米。在我们的热枪中,我们在传感器顶部放置了一个激光二极管,以了解传感器的感应区域当前指向的位置。我发现如果枪指向距离物体 2 厘米的地方,这些值是可靠的,并且随着我们离开,精度会下降。
Arduino MLX90614温度计电路图
红外线温度计的电路图非常简单。完整的电路如下所示,它是使用 Fritzing 软件创建的。
由于 Fritzing 软件不支持 MLX90614 传感器的部件,我们使用注释来提及其连接,如上所示,我们还使用红色 LED 代替激光二极管。整个电路通过一个按钮由 9V 电池供电。当按下按钮时,9V 电池连接到 Arduino 的 RAW 引脚,然后使用板载稳压器将其调节为 5V。然后使用这个 5V 为 OLED 模块、传感器和激光二极管供电。
我们已经学习了如何将SSD1306 OLED 与 Arduino连接,此处将使用相同的硬件和代码。如果您需要更强大的激光束,您也可以设计一个单独的激光二极管驱动电路。
温度枪外壳设计
为了使项目更有趣和更实用,我们为我们的热敏枪进行了 3D 建模和打印外壳。该设计包括两个部分,一个是顶部,作为枪身,装有 Arduino 控制器、OLED、传感器和激光二极管。另一个是底部,用作容纳电池和按钮的枪的手柄。此处的按钮用作触发器。该模型如下所示。
设计文件可从thingiverse 下载;您可以下载设计并使用 3D 打印机进行打印,也可以根据需要进行修改。下载链接如下
3D打印外壳:
然后将该模型保存为 STL 文件并使用 Cura 转换为 G 代码。我用我的 Tevo tarantula 打印机打印了我的两个零件,然后将它们拧在一起。如果您的打印机支持,也可以将这两个部分打印为单件。我打印的切片设置如下所示
我花了将近 6 个小时来打印这两个部件,一旦打印了硬件连接,我就分别使用传感器和 OLED 显示器的 7 针和 4 针 Relimate 连接器 (RMC) 直接将电线直接焊接到 Arduino 针上。然后使用螺钉将 OLED 安装在印刷部件中,同时使用热胶安装传感器和激光二极管。然后将电源引脚(Raw,Gnd)通过一根电线向下滑动,用于由按钮和电池组成的手柄部分。然后通过按钮将这些电线连接到电池。组装完成后,热枪如下所示
您可以继续为顶部设计封面,但我决定将其保持打开状态,以便以后如有需要可以对其进行调整。
Arduino MLX90614 红外温度计编程
Arduino 程序应从 MLX90614 读取温度值并将其显示在 OLED 显示屏上。幸运的是,该程序将非常简单,因为Adafruit 为我们提供了一个库,可以轻松地从 MLX90614 读取数据。
该链接会将库下载为 ZIP 文件夹。下载后,按照命令Sketch -》 Include Library -》 Add .ZIP Library将其添加到 Arduino IDE并浏览此 ZIP 文件的位置。还要确保您已遵循OLED 与 Arduino 接口的教程,以便您也安装了 OLED 显示模块所需的库。添加库后,我们可以开始我们的程序,该项目的完整程序可以在此页面底部找到。这里将用小片段解释相同的程序。
像往常一样,我们通过添加所需的库文件开始程序。这里 Wire 库(内置)用于使用 I2C 协议进行通信,SparkFunML90614 库用于与传感器进行通信。SPI、GFX 和 SSD1306 库用于通过 4 线 SPI 协议与 OLED 显示模块进行通信。
#include 《Wire.h》
#include 《SparkFunMLX90614.h》
#include 《SPI.h》
#include 《Adafruit_GFX.h》
#include 《Adafruit_SSD1306.h》
然后,我们定义我们已建立连接的 OLED 显示器的引脚。由于该模块与 SPI 一起使用,我们使用了 Arduino 的 SPI 引脚。有些 OLED 显示器也适用于 I2C 协议,但我们不能在这里使用它们,因为 I2C 引脚已经被温度计传感器占用。
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
在void setup()函数中,我们使用我们之前创建的对象therm初始化用于调试的串行监视器以及 IR 温度传感器。在印度,最受关注的温度单位是摄氏度(摄氏度),因此我们使用TEMP_C设置了单位,如果您需要将值设为华氏 (F),您也可以将其更改为TEMP_F 。最后我们初始化OLED显示屏并清除它的显示。此外,OLED 屏幕可旋转 180 度,以便于安装在外壳中。
无效设置()
{
序列。开始(9600);
热。开始();
therm.setUnit(TEMP_C);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setRotation(2);
}
在循环函数内部,我们从传感器读取温度值并将其转换为字符串以显示在 OLED 显示屏上。我们还在串行监视器上打印了该值以进行调试。我们还增加了一个名为 runner 的变量,每次成功更新温度传感器的值时,它都会在屏幕上产生一个小动画,这将有助于我们了解读数是否由于某种原因而卡住。
if (therm.read()) // 成功时,read() 将返回 1,失败时返回 0。
{
temperature = String(therm.object(), 2);
Serial.print(“对象:”);
串行打印(温度);Serial.println(“C”);
display.clearDisplay();
亚军++;
延迟(5);
}
测试 Arduino 热枪
一旦 Arduino 代码准备就绪,我们可以使用外部 TTL 编程器或 FTDI 板将其上传到我们的硬件,因为 pro mini 没有板载。然后只需按下按钮触发热敏枪,您会注意到激光束落在物体上,并且物体的温度显示在 OLED 屏幕上,如下图所示。在这里,我用它来测量激光束指向的组件的温度。
热风枪还在烙铁、3D打印机喷嘴、冰块等上进行了测试,观察到了令人满意的结果。
Arduino MLX90614 非接触式温度计
MLX90614 I2C 连接
OLED 4 线 SPI 的代码连接
日期:2019 年 7 月 6 日
代码作者:Aswint Raj
**********************************/
#include
#include
#include
#include
#include
// 如果使用软件 SPI(默认情况):
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
IRTherm 热;
无效设置()
{
序列.开始(9600);
热.开始();
therm.setUnit(TEMP_C);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setRotation(2);
}
字符串温度;
字符亚军;
void loop()
{
if (therm.read()) // 成功时,read() 将返回 1,失败时返回 0。
{
temperature = String(therm.object(), 2);
Serial.print("对象:");
串行打印(温度);Serial.println("C");
display.clearDisplay();
亚军++;
延迟(5);
}
display.setTextSize(2);
display.setTextColor(白色);
display.setCursor(display.width()/4,display.height()/12);
if (therm.object()>=100)
display.setCursor(display.width()/4,display.height()/12);
display.println(温度);
display.drawLine(display.width()/runner,display.height() - display.height()/2.5, display.width()/runner+1, display.height() - display.height()/2.5,白色的);
display.setCursor(0,display.height()-display.height()/4);
display.setTextSize(1);
display.println("Arduino Thermlgun");
display.setCursor(display.width()- display.width()/4,display.height()/12);
display.println("摄氏度");
显示.显示();
如果(跑步者> 20)
跑步者= 0;
}