0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 基于红外热释电的房间人数计数系统
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:5分
1 简介
关于计算进出公共休息室的人数。
2 主要器件
- 试验板
- 电阻 100Ω 、221Ω
- 发光二极管(5mm) 红色、绿色
- PIR传感器 7m
- 字符显示器 16*2
- 跳线
- 旋转电位计 10kΩ
- 蜂鸣器
- MLX90614非接触式传感器 3.3 V
- 单片机
3 实现效果
本项目设定的房间最大容量是5人。如果“可以安全进入”,它将在液晶显示屏上显示公共休息室的人数和绿色LED灯。如果房间已满,它会在液晶显示屏上显示“请稍候”,并亮起红色LED灯。如果忽略或看不到最大容量,它将通过蜂鸣器报警。当你体温大于等于38时,也会通过蜂鸣器报警。
MLX温度传感器上升达到38°时蜂鸣器报警:
4 设计原理
4.1 PIR传感器
简介
热释电红外运动传感器能检测运动的人或动物身上发出的红外线,输出开关信号,可以应用于各种需要检测运动人体的场合。PIR传感器可以让你感知运动。它们用于检测人是否进入或离开传感器的范围。通常出现在家庭或企业使用的电器和小工具中。它们通常被称为PIR,“被动红外”,“热电”或“IR运动”传感器。
组成
PIR由热电传感器制成,圆形金属罐中央有一个矩形晶体,可以检测红外辐射的水平。所有东西都发射出低水平的辐射,而东西越热发射的辐射就越多。运动检测器中的传感器分成两半。这是为了检测运动(变化)而不是平均IR水平。
触发模式
相关调试代码
#define pirPin 2
int calibrationTime = 30;
long unsigned int lowIn;
long unsigned int pause = 5000;
boolean lockLow = true;
boolean takeLowTime;
int PIRValue = 0;
void setup() {
Serial.begin(9600);
pinMode(pirPin, INPUT);
}
void loop() {
PIRSensor();
}
void PIRSensor() {
if (digitalRead(pirPin) == HIGH) {
if (lockLow) {
PIRValue = 1;
lockLow = false;
Serial.println("Motion detected.");
delay(50);
}
takeLowTime = true;
}
if (digitalRead(pirPin) == LOW) {
if (takeLowTime) {
lowIn = millis(); takeLowTime = false;
}
if (!lockLow && millis() - lowIn > pause) {
PIRValue = 0;
lockLow = true;
Serial.println("Motion ended.");
delay(50);
}
}
}
4.2 mlx90614红外传感器
MLX90614是一款红外非接触温度计。TO-39金属封装里同时集成了红外感应热电堆探测器芯片和信号处理专用集成芯片。由于集成了低噪声放大器、17位模数转换器和强大的数字信 号处理单元,使得高精度和高分辨度的温度计得以实现。温度计具备出厂校准化,有数字 PWM和 SMBus(系统管理 总线)输出模式。作为标准,配置为 10 位的 PWM 输出格式用于连续传送温 度范围为-20…120 ˚C 的物体温度,其分辨率为 0.14 ˚C。 POR 默认模式是 SMBus 输出格式。
实物
硬件电路图如下:
部分调试代码
MLX90614_SDA_Start();
//Slave address 单个MLX90614时地址为0x00 地址+wr
if(MLX90614_SDA_send(0x00) == 1) //有应答
return 0;
//发送命令
if(MLX90614_SDA_send(0x07) == 1)
return 0;
//-----------
MLX90614_SDA_Start(); //Sr
if(MLX90614_SDA_send(0x01) == 1)
return 0;
//读Tobj1低八位并发送应答
value_L = MLX90614_SDA_receive();
//读Tobj1高八位并发送应答
value_H = MLX90614_SDA_receive();
//读PEC出错数据包并发送应答
PEC = MLX90614_SDA_receive();
MLX90614_SDA_Stop();
5 部分核心代码
#include <LiquidCrystal.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
int in = 15;// 传感器模拟引脚A1信号
int inpr = 16;// 传感器模拟引脚A2信号
int out = 14;//传感器模拟引脚A0信号
int outpr = 17;//传感器模拟引脚A3信号
int ppl = 0;//声明ppl false
int buzzer = 9;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
bool pplin = 0;// 假
bool pplout = 0;// 假
int temp = 0;// 温度起点
const float alert_temp = 38.0;// 报警设定点
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
void setup() {
Serial.begin(9600);
Serial.println("B00123587 Project"); /// 串行监视器上的显示
pinMode(15, INPUT);// 传感器模拟引脚A1信号
pinMode(14, INPUT);// 传感器模拟引脚A0信号
pinMode(16, OUTPUT);// 传感器模拟引脚A2信号
pinMode(17, OUTPUT);// 传感器模拟引脚A3信号
pinMode(6, OUTPUT);//LED入口
pinMode(7, OUTPUT);//LED禁止进入
lcd.begin(16, 2);
mlx.begin();
}
void loop() {
digitalWrite(outpr, HIGH);// 模拟引脚A2传感器电源高
digitalWrite(inpr, HIGH);// 模拟引脚A3传感器电源高
pplin = digitalRead(in); //人进
pplout = digitalRead(out);//人出
if (pplin == 1){ // pplin true
ppl--;//更改值
delay(500);
}
else if (pplout == 1){//pplout true
ppl++ ;//更改值
delay(500);
}
ppl = constrain(ppl, 0, 50);//传感器范围
lcd.setCursor(0, 0);//液晶显示器要做什么
lcd.print("People In:");
lcd.setCursor(11, 0);//液晶显示器要做什么
lcd.print(ppl);
if (ppl >= 5){//入口分界点
lcd.setCursor(0, 1);//液晶显示器要做什么
lcd.print("PLEASE WAIT");
digitalWrite(6, LOW);//绿灯关
digitalWrite(7, HIGH);//红色LED亮起
}
if (ppl >=6){//pplout true
tone(buzzer,450);///HZ
delay(500);
noTone(buzzer);
delay(500);
}
if (ppl <= 4){// 进入时小于4 ok
lcd.setCursor(0, 1);// 液晶显示器要做什么
lcd.print("Safe to enter");
digitalWrite(7, LOW);//绿色led亮
digitalWrite(6, HIGH);// 红色LED熄灭
noTone(buzzer);
delay(500);
}
lcd.setCursor(14,0);// 温度显示部分
Serial.print(mlx.readObjectTempC());//读取传感器
Serial.println("*C");// 以摄氏度为单位打印
lcd.print(mlx.readObjectTempC());//屏幕打印温度
Serial.println();
delay(500);
temp = (mlx.readObjectTempC());
if (temp >= alert_temp){/// 蜂鸣器报警,如果大于38度
tone(buzzer,450);///HZ
delay(500);
noTone(buzzer);
delay(2000);
}
}