Arduino开发实例-DIY双向访客计数器和自动灯光控制

双向访客计数器和自动灯光控制

1、应用介绍

本应用将使用 Arduino 创建双向访客柜台和自动灯光控制系统。该应用基于一对 IR(红外)传感器,可在出现中断时检测障碍物。实际上,该系统可以检测来自两个方向的访客。从而对进入的访客数量和离开的访客数量进行计数。

该双向访客计数器可以计算进入项目房间、购物中心、办公室、入口工程的人数。我们也可以在停车场门口等公共场所使用。该设备计算通过大门进入的总人数以及从同一大门离开的总人数。同时,它会计算当前房间内的总人数。当房间内无人时,总人数为0(零),则房间内的灯自动关闭。当房间内发现一个人时,灯再次打开。我们根据访客的存在自动化照明控制系统,从而达到节能减排目的。

2、红外传感检测障碍物传感器介绍

本应用的关键组件是红外传感器,它充当人体探测器。 当 IR 传感器检测到障碍物时,它会计算个体并添加到先前的值。

在这里插入图片描述

红外传感器模块对环境光的适应性非常好。 该传感器具有红外发射器和接收器。 红外线发射管发射一定的频率,当遇到障碍物时会在信号中反射出来。 然后接收管接收反射信号。 除了红外发射器和接收器外,该电路还具有运算放大器、可变电阻器(微调器)和输出 LED。

在这里插入图片描述

(红外)IR 传感器包含以下组件:

1)红外LED发射器

IR LED 发光,红外频率波长在 700nm – 1mm 之间。 它的发光角度几乎为20-60度,射程为5-10厘米。 IR LED 是白色或透明的颜色,因此它可以发出最大量的光。

2)光电二极管接收器

当光被释放时,光电二极管充当红外接收器作为其通信。 它看起来像一个光电二极管 LED,外面有黑色涂层。 黑光吸收最大的光。

3)LM358 运算放大器

LM358 是一个运算放大器 (Op-Amp),用作 IR 传感器中的电压比较器。 比较器电路比较使用 perst 和光电二极管的串联电阻器电压设置的阈值电压。 当光电二极管的串联电阻电压高于压降阈值电压时,运放输出较高。 类似地,当光电二极管的串联电阻电压小于压降阈值电压时,运放输出较低。

当运算放大器输出为高电平时,输出端的 LED 点亮。 它表示检测到的对象或障碍物。

4)可变电阻器

用于校准要检测的物体距离。

2、硬件接线

在这里插入图片描述

将 OLED 显示器的 I2C 引脚,即 SDA 和 SCL 分别连接到 Arduino A4 和 A5。 OLED 显示屏需要 3.3V VCC。 此外,将一对红外传感器分别连接到 Arduino 数字引脚 2 和 3。 现在,通过 3…3V 或 5V 为 IR 传感器供电。 要使用 Arduino 控制继电器,请将其输入引脚连接到数字引脚 5。此外,为继电器提供 5V 电源。

本次使用的硬件组件如下:

序号 组件名称 描述 数量
1 Arduino Nano Arduino Nano 开发板 1
2 红外传感器 红外传感器模块 2
3 OLED显示器 0.96” I2C OLED 显示器 1
4 继电器 5V 1 通道继电器 1
5 连接线 杜邦线 20
6 面包板 微型面包板 1

关于SSD1306 OLED驱动请参考:

关于红外传感器驱动,请参考:

3、代码实现

本次使用到如下驱动开源库:

应用代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <Wire.h>
#include <Adafruit\_GFX.h>
#include <Adafruit\_SSD1306.h>

#define SCREEN\_WIDTH 128 // OLED display width, in pixels
#define SCREEN\_HEIGHT 64 // OLED display height, in pixels
#define OLED\_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define inSensor 2
#define outSensor 3

int inStatus;
int outStatus;

int countin = 0;
int countout = 0;

int in;
int out;
int now;

#define relay 5

void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
delay(2000);
pinMode(inSensor, INPUT);
pinMode(outSensor, INPUT);
pinMode(relay, OUTPUT);
digitalWrite(relay, HIGH);

display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(20, 20);
display.print("Visitor");
display.setCursor(20, 40);
display.print("Counter");
display.display();
delay(3000);
}

void loop()
{
inStatus = digitalRead(inSensor);
outStatus = digitalRead(outSensor);
if (inStatus == 0)
{
in = countin++;
}

if (outStatus == 0)
{
out = countout++;
}

now = in - out;

if (now <= 0)
{
digitalWrite(relay, HIGH);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 15);
display.print("No Visitor");
display.setCursor(5, 40);
display.print("Light Off");
display.display();
delay(500);
}
else
{
digitalWrite(relay, LOW);

display.clearDisplay();
display.setTextColor(WHITE);

display.setTextSize(1);
display.setCursor(15, 0);
display.print("Current Visitor");
display.setTextSize(2);
display.setCursor(50, 15);
display.print(now);

display.setTextSize(1);
display.setCursor(0, 40);
display.print("IN: ");
display.print(in);

display.setTextSize(1);
display.setCursor(70, 40);
display.print("OUT: ");
display.print(out);

display.display();
delay(500);
}
}

文章来源: https://iotsmart.blog.csdn.net/article/details/128146563