非接触测温自动开门器:Arduino + 红外测温 + 舵机驱动
项目简介
针对疫情防控需求,设计一款非接触式自动开门装置:人体红外传感器检测人员靠近 → MLX90614 红外测温模块测量额温 → 体温正常 (30-37°C) 驱动双舵机开门 5 秒 → 体温异常 (>37°C) 蜂鸣器报警拒绝开门 → LCD 实时显示温度与状态。以 Arduino UNO 为核心,结构简单、成本低廉,适合家庭、办公室、小型场所部署。
硬件清单
- Arduino UNO ×1
- 2004 I2C LCD 液晶屏 ×1
- GY-906 (MLX90614) 红外测温模块 ×1
- Tower Pro MG90S 金属齿舵机 ×2(对称驱动门扇)
- 无源蜂鸣器 ×1
- HC-SR501 人体红外感应模块 ×1
接线指南
| 模块 | 信号脚 | Arduino 引脚 | 备注 |
|---|---|---|---|
| MLX90614 | SDA/SCL | A4/A5 | I2C 通讯,板载上拉 |
| I2C LCD | SDA/SCL | A4/A5 | 共用 I2C 总线,地址 0x27 |
| HC-SR501 | OUT | D4 | 高电平触发 |
| 舵机 1 | PWM | D7 | 开门 90°→180° |
| 舵机 2 | PWM | D8 | 同步反向 180°→90° |
| 蜂鸣器 | 信号 | D13 | 共用板载 LED 引脚 |
工作流程
- 系统上电初始化:LCD 显示欢迎、舵机归中 (90°)、传感器就绪
- HC-SR501 检测到人体靠近 (D4 变高)
- 读取 MLX90614 物体温度 (
mlx.readObjectTempC()) - 温度 < 30°C:LCD 提示“Not detected, retest!”,可能测量距离过远或环境温度低
- 30°C ≤ 温度 < 38°C:LCD 显示“body temperature ok”,双舵机同步旋转开门,延时 5 秒后同步关门
- 温度 ≥ 38°C:蜂鸣器鸣叫 0.5 秒,LCD 显示“Keep out!”,门保持关闭
核心代码
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo myservo1, myservo2;
#define RED_LED 13
#define PIR_PIN 4
void setup() {
Serial.begin(9600);
pinMode(RED_LED, OUTPUT);
pinMode(PIR_PIN, INPUT);
myservo1.attach(7);
myservo2.attach(8);
myservo1.write(90);
myservo2.write(90);
mlx.begin();
lcd.init(); lcd.backlight();
}
void loop() {
if (digitalRead(PIR_PIN) == HIGH) {
float temp = mlx.readObjectTempC();
lcd.setCursor(0,0); lcd.print("ObjectTemp:");
lcd.setCursor(13,3); lcd.print("-DKARDU");
controlDoor(temp);
}
}
void controlDoor(float t) {
Serial.println(t);
if (t < 31) {
lcd.setCursor(0,1); lcd.print(t);
lcd.setCursor(0,2); lcd.print("Not detected,retest!");
} else if (t >= 30 && t < 38) {
lcd.setCursor(0,1); lcd.print(t);
lcd.setCursor(0,2); lcd.print("body temperature ok ");
for (int pos = 90; pos <= 180; pos++) {
myservo1.write(pos);
myservo2.write(180 - pos);
delay(15);
}
delay(5000);
for (int pos = 180; pos >= 90; pos--) {
myservo1.write(pos);
myservo2.write(180 - pos);
delay(15);
}
} else if (t >= 38) {
digitalWrite(RED_LED, HIGH);
lcd.setCursor(0,1); lcd.print(t);
lcd.setCursor(0,2); lcd.print(" Keep out! ");
delay(500);
digitalWrite(RED_LED, LOW);
}
}
改进建议
- 增加测温距离补偿算法,提升低环温下的准确性
- 引入双重测温(MLX90614 + 接触式)交叉验证
- 加装电磁锁/电控锁替代舵机,适配标准门锁
- 接入 Wi-Fi/4G 模块上传考勤与异常记录至云端
- 优化舵机运动曲线,减少机械冲击与噪音
原理图
原理图展示 I2C 总线共享、舵机 PWM 驱动、PIR 与蜂鸣器数字 IO 连接。
制造工艺