Двухнаправленный счётчик посетителей на Arduino с IR-датчиками
В этом проекте мы соберём двухнаправленный счётчик посетителей на базе Arduino и двух инфракрасных датчиков. Система определяет направление движения — вход или выход — и показывает количество людей, которые вошли, вышли и находятся внутри, на LCD-дисплее. Это отличный проект для начинающих в области автоматизации, мониторинга и управления доступом.
Где и зачем используется
Такой двухнаправленный счётчик можно использовать в учебных проектах, на дверях комнат, в магазинах, на мероприятиях — везде, где нужно учитывать, сколько людей входит и выходит из пространства.
Что понадобится для проекта
- Плата Arduino (Uno, Nano и аналоги)
- 2 инфракрасных (IR) датчика
- 16×2 LCD с интерфейсом I²C
- Макетная плата и соединительные провода
- Источник питания для Arduino
Назначение пинов
| Компонент | Пин Arduino | Назначение |
|---|---|---|
| IR-датчик 1 (вход) | D2 | Детекция объекта при входе |
| IR-датчик 2 (выход) | D3 | Детекция объекта при выходе |
| LCD SDA | A4 | I²C SDA |
| LCD SCL | A5 | I²C SCL |
| Питание | 5V | Питание Arduino и LCD |
| Общий провод | GND | Общая земля |
Принцип работы
- Arduino следит за сигналами двух IR-датчиков, установленных на входе и выходе.
- Если датчик входа детектирует объект первым, система считает, что кто-то вошёл.
- Если датчик выхода детектирует сначала, то считаем выходом.
- Текущий счёт, количество входов и выходов обновляются и выводятся на LCD.
- Антидребезг и небольшая задержка предотвращают ложные срабатывания.
Пример скетча Arduino
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const byte irPin1 = 2;
const byte irPin2 = 3;
int in_count = 0;
int out_count = 0;
const unsigned long timeout = 600; // мс
byte state = 0;
unsigned long timer = 0;
void setup() {
lcd.init();
lcd.backlight();
pinMode(irPin1, INPUT_PULLUP);
pinMode(irPin2, INPUT_PULLUP);
updateDisplay();
}
void loop() {
switch (state) {
case 0: // ожидание
if (digitalRead(irPin1) == LOW) {
state = 1;
timer = millis();
}
else if (digitalRead(irPin2) == LOW) {
state = 2;
timer = millis();
}
break;
case 1: // IR1 первый → вход
if (digitalRead(irPin2) == LOW) {
in_count++;
updateDisplay();
state = 3;
}
else if (millis() - timer > timeout) {
state = 0;
}
break;
case 2: // IR2 первый → выход
if (digitalRead(irPin1) == LOW) {
if (out_count < in_count) out_count++;
updateDisplay();
state = 3;
}
else if (millis() - timer > timeout) {
state = 0;
}
break;
case 3: // ожидание освобождения датчиков
if (digitalRead(irPin1) == HIGH && digitalRead(irPin2) == HIGH) {
state = 0;
}
break;
}
}
void updateDisplay() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("IN: ");
lcd.print(in_count);
lcd.print(" OUT: ");
lcd.print(out_count);
lcd.setCursor(0, 1);
lcd.print("Current: ");
lcd.print(in_count - out_count);
}
Этот скетч отслеживает последовательность срабатываний IR-датчиков: сначала вход → увеличение счёта, сначала выход → уменьшение. Значения обновляются на LCD прямо в реальном времени.
FAQ — Двухнаправленный счётчик посетителей
Почему используются две IR-датчика?
Две точки обнаружения позволяют определить движение в одну или другую сторону.
Как защититься от ложных срабатываний?
Используй антидребезг (задержку после срабатывания) и убедись, что датчики расположены прямо и не пересекают внешние источники IR-света.
Можно ли использовать другие датчики?
Да. Любые цифровые датчики движения (PIR, лазерные фоторефлекторы) также подойдут при корректной логике.
Что означает timeout в коде?
Это максимальный интервал, в течение которого второй датчик должен сработать после первого, чтобы считать движение валидным.
LCD требуется I2C-адаптер?
Рекомендуется I2C дисплей, так как он упрощает подключение (SDA/SCL), но можно использовать и параллельный LCD с другими пинами.
Заключение
Двухнаправленный счётчик — простой и полезный проект, который учит основам работы с IR-датчиками, логике движения и отображению данных на LCD. Он может быть основой для систем контроля доступа и умного мониторинга потока людей.