用MLX90614红外温度传感器制作非接触式红外测温仪

原文地址:https://circuitdigest.com/microcontroller-projects/ir-thermometer-using-arduino-and-ir-temperature-sensor

用MLX90614红外温度传感器制作非接触式红外测温仪

ARDUINO的

经过**阿斯温斯·拉吉(Aswinth Raj)** 2019年7月4日6
在这里插入图片描述

使用Arduino和MLX90614红外温度传感器的红外测温仪

在调试电子电路或测试新的硬件设计时,我经常会通过触摸它们来检查电路板上的组件是否异常发热。而且,如果有些东西弄乱了(通常是在第一次尝试中),这些组件可能会变得高达80°C甚至更高,不仅会灼烧该组件,还会烧毁我的手指。在烧伤我的手指超过了我记得的次数之后,我决定使用Arduino和红外温度传感器来建造自己的温度枪。该热风枪将使用称为MLX90614非接触温度传感器制造; 因此,它不仅可以用于测量组件温度,还可以用于测量体温,表面温度,热通风等。当然,可以从市场上从Fluke,Flir等知名制造商处购买到这些热风枪。但是,它们并不轻巧,而且比制造自己的小玩意还要有趣。因此,让我们开始吧…

所需材料

  • Arduino Pro迷你版
  • MLX90614红外温度传感器
  • OLED显示屏– SSD1306
  • 激光二极管
  • 9V电池
  • 按钮
  • 电池夹
  • 连接线

MLX90614红外测温仪

在继续本教程之前,了解MLX90614传感器的工作原理非常重要。市场上有许多温度传感器,我们已经将DHT11传感器LM35广泛用于必须测量大气湿度或温度的许多应用中。您可以在下面找到一些DIY温度计

但是在这里,对于热风枪,我们需要一个能够感应特定物体(而不是环境物体)的温度而无需直接与物体接触的传感器。为此,我们拥有非接触式温度传感器,该传感器利用激光或红外来计算物体的温度。MLX90614就是这样一种传感器,它使用IR能量来检测物体的温度。要了解有关红外和红外传感器电路的更多信息,请点击链接。
在这里插入图片描述

MLX90614传感器是由Melexis Microelectronics集成系统制造的,其中嵌入了两个设备,一个是红外热电堆检测器(传感单元),另一个是信号调理DSP器件(计算单元)。它根据Stefan-Boltzmann定律进行工作,该定律规定所有物体都会发射IR能量,并且该能量的强度将与该物体的温度成正比。传感器中的传感单元测量目标物体发出多少红外能量,计算单元使用17位内置ADC将其转换为温度值,并通过I2C通信输出数据协议。传感器同时测量物体温度和环境温度,以校准物体温度值。MLX90614传感器的功能在下面给出,有关更多详细信息,请参考MLX90614数据表

MLX90614红外温度传感器特性:

  • 工作电压:3.6V至5V
  • 物体温度范围:-70°C至382.2°C
  • 环境温度范围:-40°C至125°C
  • 分辨率/精度:0.02°C

传感器和物体之间的距离应该是多少?

数据表未直接回答的一个问题是传感器与物体之间的测量距离。该距离的值由术语**“视野”(FOV)给出**,对于我们的传感器,视野约为80°。
在这里插入图片描述

从传感器的角度来看,您可以认为感应范围为圆锥形,如上所示。因此,当我们远离测量对象时,感应面积增加了两倍。意思是,我们每离开物体1厘米,感应区域就会增加2厘米。在热枪中,**我们在传感器顶部放置了一个激光二极管,**以了解传感器当前所指向的区域。我发现,如果枪支指向距物体2cm处,并且当我们移开时精度下降,则该值是可靠的。

Arduino MLX90614温度计电路图

红外测温仪的电路图非常简单。完整的电路如下所示,它是使用Fritzing软件创建的。
在这里插入图片描述

由于Fritzing软件不支持MLX90614传感器的零件,因此我们使用注释来提及其连接,如上所示,因此我们也使用红色LED代替了激光二极管。整个电路由9V电池通过按钮供电。当按下按钮时,将9V电池连接至Arduino的RAW引脚,然后使用板载稳压器将其调节至5V。然后,该5V电压用于为OLED模块,传感器和激光二极管供电。
在这里插入图片描述

我们已经学习了如何将SSD1306 OLED与Arduino接口,此处将使用相同的硬件和代码。如果您需要更强的激光束,还可以设计一个单独的激光二极管驱动器电路

设计温度枪的外壳

为了使该项目更加有趣和实用,我们对3D模型进行了建模并打印了热枪的外壳。设计包括两个部分,一个是顶部,它充当装有Arduino控制器,OLED,传感器和激光二极管的枪支的主体。另一个是底部,用作容纳电池和按钮的喷枪的手柄。此处的“按钮”用作触发器。该模型如下所示。
在这里插入图片描述

设计文件可从thingverse下载。您可以下载设计并使用3D打印机进行打印,也可以根据需要进行修改。下载链接如下

Thermal Gun 3D模型

下载文件后,您可以直接开始3D打印设计,也可以根据需要进行一些调整。

3D打印外壳:

然后将模型保存为STL文件,并使用Cura将其转换为G代码。我用Tevo狼蛛打印机打印两个零件,然后将它们拧在一起。如果打印机支持,也可以将两个零件都打印为单件。我的打印的切片设置如下所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wg4lhp5p-1618901540906)(C:%5CUsers%5CAdministrator%5CPictures%5Ctypora%5C3D-Model-Designing-Thermal-Gun.png)]

一旦完成了打印硬件连接,我就花费了将近6个小时的时间来打印这两个部分,然后分别使用7针和4针Relimate连接器(RMC)将导线直接直接焊接到Arduino针上,分别用于传感器和OLED显示屏。然后使用螺钉将OLED安装在印刷部件中,同时使用热胶将传感器和激光二极管安装在印刷部件上。然后将电源插针(Raw,Gnd)滑过手柄部分的电线,该部分包括按钮和电池。然后通过按钮将这些导线连接到电池。组装完成后,热风枪如下图所示
在这里插入图片描述

在这里插入图片描述

您可以继续设计顶部的盖子,但我决定将其打开,以便将来在需要时可以对其进行调整。

Arduino MLX90614红外测温仪编程

Arduino程序应从MLX90614读取温度值,并将其显示在OLED显示屏上。对我们来说幸运的是,该程序将非常简单,因为Adafruit为我们提供了一个库,可以轻松地从MLX90614中读取数据。可以从下面的链接下载库

Arduino 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初始化用于调试的串行监视器以及红外温度传感器。在印度,温度最接近的单位是摄氏度(摄氏度),因此我们用TEMP_C设置了单位,如果您需要将值设置为华氏度(F),也可以将其更改为TEMP_F*。最后,我们初始化OLED显示屏并清除其显示屏。OLED屏幕也旋转了180度,以便在外壳中轻松安装。

void setup()
{ 
  Serial.begin(9600); 
  therm.begin(); 
  therm.setUnit(TEMP_C);

   display.begin(SSD1306_SWITCHCAPVCC); 
   display.clearDisplay(); 
   display.setRotation(2); 
}

在*循环*功能中,我们从传感器读取温度值,并将其转换为String,以显示在OLED显示屏中。我们还将该值打印在串行监视器上,以进行调试。我们还增加了一个名为Runner的变量,每次成功更新温度传感器的值时,该变量都会在屏幕上显示一个小动画,这将帮助我们知道读数是否由于某种原因而卡住了。

  if(therm.read())//如果成功,则read()在失败0时将返回1。
  { 
    temperature = String(therm.object(),2); 
    Serial.print(“ Object:”); 
    Serial.print(temperature); Serial.println(“ C”); 
    display.clearDisplay(); 
    runner++; 
    delay(5); 
  }

测试Arduino热感枪

一旦Arduino代码准备就绪,我们就可以使用外部TTL编程器或FTDI板将其上载到我们的硬件,因为pro mini没有板载。然后,只需按下按钮即可触发热枪,您会注意到激光束落在物体上,并且物体的温度正显示在OLED屏幕上,如下所示。在这里,我用它来测量激光束所指向的组件的温度。
在这里插入图片描述

还对热风枪在烙铁,3D打印机喷嘴,冰块等上进行了测试,并观察到令人满意的结果。可以在本页底部的视频找到热感枪完整工作原理。希望您喜欢这个项目,并从中学到一些有用的东西,如果您有任何疑问,请把它们留在下面的评论部分,或者使用我们的论坛来解决更多技术问题。

代码


/ ****************************************
Arduino的代码MLX90614 非接触式温度计 
MLX90614 I2C连接
OLED 4线SPI连接 
日期:7-6-2019
代码作者:Aswint Raj
********************************** /
#include <Wire.h> 
#include <SparkFunMLX90614.h> 

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// If using software SPI (the default case):
#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 therm;

void setup() 
{
  Serial.begin(9600); 
  therm.begin(); 
  therm.setUnit(TEMP_C); 

   display.begin(SSD1306_SWITCHCAPVCC);
   display.clearDisplay();
   display.setRotation(2);
  
}

String temperature; 
char runner;

void loop() 
{
  if (therm.read()) // On success, read() will return 1, on fail 0.
  {
    temperature = String(therm.object(), 2);
    Serial.print("Object: ");
    Serial.print(temperature); Serial.println("C");
    display.clearDisplay();
    runner++;
    delay(5);
  }

  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(display.width()/4,display.height()/12);
  
  if (therm.object()>=100)
  display.setCursor(display.width()/4,display.height()/12);
  
  display.println(temperature);

  display.drawLine(display.width()/runner,display.height() - display.height()/2.5, display.width()/runner+1, display.height() - display.height()/2.5, WHITE);

  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("deg C");
  display.display();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值