使用Arduino设计一个壁挂式红外温度计

2023-08-12 11:26:53 |人围观 | 评论:

  在办公室、商场、购物中心等入口处扫描温度已成为应对当前 Covid19 大流行的“新常态”。虽然可以使用手持红外温度计来测量每个进入大门的人的温度并在笔记本上手动记录下来,但这并不是最有效的方法。

  因此,在这个项目中,我们将使用Arduino设计一个壁挂式红外温度计,可以简单地固定在墙上并保持开启状态。每个进入场所的人都可以通过走到这个红外温度传感器来扫描他们的温度,它将测量个人的温度并将其显示在 LCD 上。除此之外,它还会在SD卡上以 Excel 格式记录员工/访客的时间和温度。在此项目中添加RFID阅读器或条形码扫描仪也很容易,以检测员工的姓名并根据他的姓名记录温度和时间。这样,设备也可以作为考勤系统,因为时间也会被记录下来。有意思吧!!所以让我们开始吧……

  壁挂式红外测温仪所需材料

  Arduino纳米

  MLX90615

  TCRT5000

  DS3231实时时钟模块

  16*2液晶

  SD卡模块

  蜂鸣器

  红色LED

  绿色 LED

  性能板

  1K、4.7K、10K电阻器

  10K电位器

DC筒式千斤顶

  12V 1A 直流电源适配器

  LED 安装支架

  金属外壳和螺丝

  壁挂式数字红外温度计电路图

  数字红外温度计的完整原理图如下所示。它可能看起来像一个复杂的电路,但其中大多数是简单的接口电路。

poYBAGLyIJiAMHWwAAFl_J8KotU081.png

  MLX90615 非接触式红外温度传感器:电路中最重要的元件是非接触式温度传感器 MLX90615。我们之前在我们的智能手机红外温度计项目中使用了相同的传感器。该传感器的工作原理是所有热物体(包括人)都会发出红外线,红外线的强度将与物体的温度成正比。因此,传感器通过测量物体发出的红外线来测量物体的温度。MLX90615 是一款数字红外温度传感器,这意味着它有自己的内部电路来测量来自物体的红外光并将其直接转换为温度值。可以使用I2C通信读取此输出温度,MLX90615 的引脚如下所示。

poYBAGLyIJSAC2BpAAE4dQHIVuU269.png

  TCRT5000 IR 接近传感器:我们设备上的下一个传感器是 TCRT5000 IR 接近传感器。该传感器用于检测是否有人将手放在传感器前面。这是一个简单的接近传感器,我们之前在许多项目中都使用过,比如我们之前建造的遥控 Arduino Car。但在这个项目中,我们更有效地使用它来解决红外传感器的阳光问题。

  TCRT5000 作为 IR 传感器可能会被阳光错误地触发,因为太阳光线也包含 IR 光线。为避免阳光造成的误触发,我们将红外接收器LED 连接到 Arduino 的模拟端口,将红外发射器连接到数字引脚。这样,我们可以在红外发射器打开时测量红外接收器接收到的红外信号,并在红外发射器关闭时再次测量它。取这两个值之间的差异将有助于我们找到环境中的噪声,从而避免误触发。

  DS3231 RTC 模块: DS3231 RTC 模块用于跟踪时间和日期。RTC 模块有自己的内置电池,因此即使关闭电源,设备也会记住时间。但是,我们必须在第一次使用它之前设置正确的时间。我们不会在本文中讨论如何做到这一点。DS3231 还与 I2C 引脚通信,因此连接到 MLX90615 的相同引脚。但是,两个模块都有不同的 I2C 地址,因此我们不必担心信号干扰。

  SD 卡模块: SD 卡模块用于将 SD 卡与我们的 Arduino微控制器连接。它用于将扫描的温度和时间值保存在文本文件中。该模块使用 SPI 通信协议,因此我们已将其连接到 Arduino 的 SPI 引脚,如上图所示。

  16x2 LCD 显示屏: LCD 显示屏用于显示温度和时间值。这是一个简单的16x2 字母数字 LCD 显示器,我们在许多其他项目中都使用过。

  LED 和蜂鸣器:最后,我们有用于输出指示的 LED 和蜂鸣器。如果温度正常,蜂鸣器会随着绿色 LED 发出一次哔声,并且蜂鸣器会随着红色 LED 发出多次哔声表示高温。

  如您所见,电路图没有什么很复杂的,我们只是直接将模块与Arduino连接起来。除此之外,我们几乎没有用于 LED 和蜂鸣器的电阻器用作限流电阻器,而 I2C 总线上的其他 4.7k 欧姆电阻器用于上拉电阻器。我们还有一个连接到 LCD 的电位器来调节 LCD 的对比度。

  在性能板上构建电路

  从主图中可以看出,这个想法是在金属板外壳内使用这个电路。所以上面显示的完整电路被焊接到一个穿孔板上。确保使用电线留出足够的距离来安装 LCD、LED、传感器和蜂鸣器。我使用了两个 perf板,一个用于放置 Arduino nano、DS3231 和所有无源组件,另一个用于两个传感器(MLX90615 和 TCRT500),根据您的安装外壳,您可以以不同的方式焊接它。我的穿孔板焊接到 LCD 和传感器模块如下所示。

pYYBAGLyII-AG9ALAAW_6ES4aPY464.png

  安装 MLX90615、DS3231 和 SD 卡所需的库

  现在硬件已准备就绪,是时候开始对我们的 IR 数字温度计进行编程了。此项目的完整代码在本页末尾提供,但在我们开始之前,将所需的库添加到您的 Arduino IDE 非常重要。确保从下面的链接中添加正确的库,否则代码在编译时会抛出错误。

为壁挂式温度计编程 Arduino

添加所需库后,您可以直接上传本页底部给出的代码,以检查电路是否正常工作。如果您想知道代码是如何工作的,请继续阅读...

像往常一样,我们通过添加所需的头文件并定义引脚名称来开始程序。

#define 嗡嗡声 5 #定义绿色 3 #定义红色 4 #include
       
        #include "DS3231.h" #include "MLX90615.h" #include
        
         #include
         
          //SPI 通信库(预加载到 Arduino 中) #include
          
           //SD 卡库(预加载到 Arduino 中)
          
         
        
       

然后我们有两个主要的全局变量,必须根据您的应用程序进行调整。第一个变量是“error_correction”,它是温度值加上 MLX90615 传感器的原始值。尽管 MLX90615 传感器经过工厂校准,但我注意到它的值比原始值非常低,因此我必须添加error_correction值才能获得可靠的读数。我用我的手持仪表来校准这些值。但经过校准后,我发现传感器在所有范围内都非常可靠。下一个变量是Range_sensitive,此值用于确定触发我们的设备之前该人应该离多近。我使用了 200 的值,但如果你想增加范围,你可以减小这个值。

浮动error_correction = 4;//将此添加到实际值 int Range_sensitivity = 200; //减小这个值来增加范围

继续我们的代码,我们有Initialize SD Card函数,用于打开与 SD 卡的 SPI 通信,并在 SD 卡内创建一个名为“Temp_Log.text”的文件。然后我们也将打开这个文件并写下日志的标题。在这里,我们记录日期、时间和温度,因此我们相应地命名标题。在 setup 函数执行期间,该函数只会被调用一次。

无效 Initialize_SDcard() { // 查看卡是否存在并且可以初始化: 如果(!SD.begin(芯片选择)){ Serial.println("卡失败,或不存在"); // 不要再做任何事情了: 返回; } // 打开文件。请注意,一次只能打开一个文件, // 所以你必须在打开另一个之前关闭这个。 文件 dataFile = SD.open("Temp_Log.txt", FILE_WRITE); // 如果文件可用,则写入它: 如果(数据文件){ dataFile.println("日期、时间、温度"); //写入excel文件的第一行 数据文件.close(); } }

然后我们有写入 SD 卡功能,用于将实际值记录到我们刚刚创建的文本文件中。每次读取新读数时都会调用此函数。日志记录的格式将以逗号分隔,例如“日期、时间、温度”,示例日志将类似于“19.08.2020,10:45:17,35.6”。它可能有点难以阅读,但这种格式称为逗号分隔值,它可以很容易地被 Excel 打开和理解。使用 SD 卡进行数据记录与我们之前构建的Arduino 数据记录器项目非常相似。

无效 Write_SDcard() { // 打开文件。请注意,一次只能打开一个文件, // 所以你必须在打开另一个之前关闭这个。 文件 dataFile = SD.open("Temp_Log.txt", FILE_WRITE); // 如果文件可用,则写入它: 如果(数据文件){ dataFile.print(rtc.getDateStr()); //在SD卡上存储日期 数据文件.print(","); //使用“,”移动到下一列 dataFile.print(rtc.getTimeStr()); //在SD卡上存储日期 数据文件.print(","); //使用“,”移动到下一列 dataFile.print(温度);//在SD卡上存储日期 数据文件.println(); //行尾移动到下一行 数据文件.close(); //关闭文件 } 别的 Serial.println("OOPS!! SD 卡写入失败"); }

继续编写代码,我们有初始化设备的void setup函数。我们只是在 LCD 上显示一些介绍信息,并初始化 SD 卡以供使用。这里没有什么很严重的解释。

无效设置(){ 序列号.开始(9600); rtc.begin(); lcd.begin(16, 2); lcd.print("温度扫描仪"); lcd.setCursor(0,1); lcd.print("电路文摘");pinMode(2,输出); pinMode(嗡嗡声,输出); pinMode(红色,输出); pinMode(绿色,输出); mlx.开始(); 数字写入(嗡嗡声,低); 数字写入(红色,低); 数字写入(绿色,低); 初始化_SDcard(); }

接下来,在void 循环函数中,我们的代码还获取当前时间和日期并在 LCD 上更新。然后我们打开连接到 IR 发射器 LED 的数字引脚 2,并在连接 IR 接收器 LED 的 A7 中执行模拟读取。然后我们再次重复此操作,关闭 IR LED。这有助于我们测量红外传感器的噪声和噪声+信号值。然后我们只需从 Noise+Signal 值中减去 Noise 值即可得到 Signal 的值。

lcd.setCursor(0,1); lcd.print("日期:"); lcd.print(rtc.getDateStr()); 数字写入(2,高);// 打开红外灯 延迟微秒(500);// IR LED 的正向上升时间 Noise_P_Signal=analogRead(A7); // 从 A0 读取值 => 噪声+信号 数字写入(2,低);//关闭红外LED 延迟微秒(500);// IR LED 的下降时间 噪声=模拟读取(A7);// 从 A0 读取值 => 仅噪声 信号 = 噪声 - Noise_P_Signal;

信号值将告诉我们在不受人周围阳光影响的情况下,人与 TCRT5000 IR 传感器的距离有多近。然后通过比较这个信号值和噪声值,我们将触发我们的温度计读取温度值并将其存储在 SD 卡中。如果温度正常,绿色 LED 会亮起,如果温度高,红色 LED 会亮起。

if (Signal>Range_sensitive && Noise >500) //dec. 增加愤怒的信号 { 数字写入(嗡嗡声,高); 如果(触发器 == 真) Serial.println("开始") 数字写入(2,低);//关闭红外传感器以避免干扰。 for (int i=1; i<=3; i++) { 温度 = (mlx.get_object_temp()) + error_correction; Serial.println(温度,1); 延迟(150); } 数字写入(嗡嗡声,低); lcd.clear(); lcd.setCursor(0,0); lcd.print("温度:"); lcd.print(温度,1); lcd.setCursor(0,1); lcd.print("保存到 SD 卡"); 写_SD卡();

  壁挂式温度计外壳 - 组装

  在测试了硬件和代码之后,我们可以将我们的项目组装在一个永久性的外壳中,以将其安装在一个设施中。为此,我们设计并制造了一个钣金外壳。该设计考虑了项目中使用的 LCD 显示器、LED 和其他组件的尺寸。然后将设计带到激光切割车间,根据设计对钣金进行切割和折弯。最后,它被用于粉末涂层以改善美学外观并覆盖金属部件。

poYBAGLyIISAer2uAAW3X6oxDKs143.png

  收到外壳后,我们只需将 LCD、DC连接器和 LES 安装到相应的插槽中即可。确保电子部件与金属外壳绝缘良好。上图显示了组装电子设备的外壳的底部和顶部。组装完成后,外壳看起来像下面这样。

poYBAGLyIICAc3SDAAawzNSvpEM251.png

  壁挂式数字红外测温仪测试

  组装完成后,是时候测试设备了。我们使用外部 12V 1A 适配器为设备供电并将设备安装在墙上。

pYYBAGLyIHuAEJotAAVmwdH7Py4414.png

  如您所见,默认情况下设备将显示时间和日期。如果有人走到设备传感器前或伸出手,它会读取人的温度并显示在屏幕上,如下图所示。它还将在 SD 卡上存储与时间和日期相同的值。

poYBAGLyIHiAF3X3AANQwB0PM9w545.png

  一天结束后,当所有温度读数都完成后,可以使用侧面的插槽从设备中取出 SD 卡。只需将此 SD 卡连接到计算机,您就会找到一个名为Temp_Log.text的文件,其中包含设备获取的所有温度值。我在测试期间创建的录制文件如下所示。

poYBAGLyIHSAD-dnAAEJx2Xib6s843.png

  如您所见,在这样的记事本上不容易读取这些值。因此,最好使用 Microsoft Excel 打开文件。只需将其作为 CSV 文件打开并使用逗号作为分隔符。excel 文件将像这样打开我们的数据。

pYYBAGLyIHCAMirMAAFergvs4II754.png

/*带 SD 记录的壁挂式温度扫描仪
* 网站:circuitdigest.com
* 代码:B.Aswinth Raj
*/
浮动error_correction = 4;//将此添加到实际值
int Range_sensitivity = 200; //减小这个值来增加范围
#define 嗡嗡声 5
#定义绿色 3
#定义红色 4
#include
#include "DS3231.h"
#include "MLX90615.h"
#include
#include //SPI 通信库(预加载到 Arduino 中)
#include //SD 卡库(预加载到 Arduino 中)
DS3231 实时时钟(SDA,SCL);//RTC通过I2C连接
液晶液晶(9、8、14、15、16、17);// 用接口引脚的编号初始化库
MLX90615 mlx = MLX90615();
常量 int 芯片选择 = 10; //SD卡CS引脚连接到Arduino的引脚4
诠释噪音;
整数信号;
int Noise_P_Signal;
布尔触发器=真;
浮动温度;
浮动 pvs_温度;
无效 Initialize_SDcard()
{
// 查看卡是否存在并且可以初始化:
如果(!SD.begin(芯片选择)){
Serial.println("卡失败,或不存在");
// 不要再做任何事情了:
返回;
}
// 打开文件。请注意,一次只能打开一个文件,
// 所以你必须在打开另一个之前关闭这个。
文件 dataFile = SD.open("Temp_Log.txt", FILE_WRITE);
// 如果文件可用,则写入它:
如果(数据文件){
dataFile.println("日期、时间、温度"); //写入excel文件的第一行
数据文件.close();
}
}
无效 Write_SDcard()
{
// 打开文件。请注意,一次只能打开一个文件,
// 所以你必须在打开另一个之前关闭这个。
文件 dataFile = SD.open("Temp_Log.txt", FILE_WRITE);
// 如果文件可用,则写入它:
如果(数据文件){
dataFile.print(rtc.getDateStr()); //在SD卡上存储日期
数据文件.print(","); //使用“,”移动到下一列
dataFile.print(rtc.getTimeStr()); //在SD卡上存储日期
数据文件.print(","); //使用“,”移动到下一列
dataFile.print(温度);//在SD卡上存储日期
数据文件.println(); //行尾移动到下一行
数据文件.close(); //关闭文件
}
别的
Serial.println("OOPS!! SD 卡写入失败");
}
无效设置(){
序列号.开始(9600);
rtc.begin();
lcd.begin(16, 2);
lcd.print("温度扫描仪");
lcd.setCursor(0,1);
lcd.print("电路文摘");
pinMode(2,输出);
pinMode(嗡嗡声,输出);
pinMode(红色,输出);
pinMode(绿色,输出);
mlx.开始();
数字写入(嗡嗡声,低);
数字写入(红色,低);
数字写入(绿色,低);
初始化_SDcard();
}
无效循环(){
lcd.setCursor(0,0);
lcd.print("时间:");
lcd.print(rtc.getTimeStr());
lcd.setCursor(0,1);
lcd.print("日期:");
lcd.print(rtc.getDateStr());
数字写入(2,高);// 打开红外灯
延迟微秒(500);// IR LED 的正向上升时间
Noise_P_Signal=analogRead(A7); // 从 A0 读取值 => 噪声+信号
数字写入(2,低);//关闭红外LED
延迟微秒(500);// IR LED 的下降时间
噪声=模拟读取(A7);// 从 A0 读取值 => 仅噪声
信号 = 噪声 - Noise_P_Signal;
if (Signal>Range_sensitive && Noise >500) //dec. 增加愤怒的信号
{
数字写入(嗡嗡声,高);
如果(触发器 == 真)
Serial.println("开始");
数字写入(2,低);//关闭红外传感器以避免干扰。
for (int i=1; i<=3; i++)
{
温度 = (mlx.get_object_temp()) + error_correction;
Serial.println(温度,1);
延迟(150);
}
数字写入(嗡嗡声,低);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("温度:");
lcd.print(温度,1);
lcd.setCursor(0,1);
lcd.print("保存到 SD 卡");
写_SD卡();
如果(温度>38)
{
数字写入(红色,高);
数字写入(嗡嗡声,高);
延迟(5000);
}
别的
{
数字写入(绿色,高);
延迟(1000);
}
触发器=假;
}
别的
{
延迟(100);
触发器=真;
数字写入(13,低);
Serial.println("position_error");
}
数字写入(红色,低);
数字写入(嗡嗡声,低);
数字写入(绿色,低);
}





标签: [db:tags]

相关内容推荐: