Лазерная сигнализация на Arduino: счётчик посетителей и охранная система
Лазерная сигнализация на Arduino — простой и эффективный способ подсчёта посетителей, машин на парковке или охраны помещения. Два лазера и фоторезисторы фиксируют прерывание луча: вход/выход. Вывод на индикатор TM1637: текущее количество людей. Пищалка разные тоны для входа/выхода. Проект для магазина, офиса, дачи или умного дома: сценарии по наличию людей (выключить свет, включить охрану). Дешёвая сборка: лазеры от указки, фоторезисторы, Arduino Nano. Расстояние до 5–10 м. Стабильность, низкое потребление.
Возможности лазерной сигнализации
Подсчёт входа/выхода: +1/-1 на индикаторе. Звуковые сигналы разной тональности. Охрана: прерывание — тревога. Имитация присутствия. Интеграция в умный дом: свет/отопление по наличию. Счётчик машин на парковке. Конвейерный подсчёт. Расстояние 5–10 м в темноте.
Компоненты
- Arduino Uno/Nano
- 2 лазерных модуля (5 мВт)
- 2 фоторезистора (GL5528)
- TM1637 4-digit индикатор
- Пищалка (buzzer)
- Резисторы 200–500 Ом (лазеры), 5.6 кОм (делитель)
- БП 5В
Подключение схемы
- Лазер1 + → D4 (через 330 Ом), — → GND
- Лазер2 + → D5, — → GND
- Фоторезистор1: 5V → 5.6 кОм → A0 → фоторезистор → GND
- Фоторезистор2: аналогично A1
- TM1637: CLK D2, DIO D3, VCC 5V, GND
- Пищалка → D8
Фоторезисторы в трубках для темноты.
Библиотека TM1637Display
Установка из Менеджера библиотек. Вывод цифр 0–9999.
Алгоритм работы
Прерывание первого луча → ожидание второго. Порядок определяет вход/выход. +1/-1 счётчик, тон пищалки. Не уходит в минус. Вывод на TM1637.
Скетч лазерной сигнализации
#include <TM1637Display.h>
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
#define LASER1 4
#define LASER2 5
#define PHOTO1 A0
#define PHOTO2 A1
#define BUZZER 8
int count = 0;
int flag = 0;
void setup() {
pinMode(LASER1, OUTPUT); digitalWrite(LASER1, HIGH);
pinMode(LASER2, OUTPUT); digitalWrite(LASER2, HIGH);
pinMode(BUZZER, OUTPUT);
display.setBrightness(7);
display.showNumberDec(count);
}
void loop() {
int p1 = digitalRead(PHOTO1);
int p2 = digitalRead(PHOTO2);
if (p1 == LOW && flag == 0) {
while (p2 == HIGH) p2 = digitalRead(PHOTO2);
count++;
tone(BUZZER, 1000, 200);
flag = 1;
}
if (p2 == LOW && flag == 0) {
while (p1 == HIGH) p1 = digitalRead(PHOTO1);
if (count > 0) count--;
tone(BUZZER, 500, 200);
flag = 1;
}
if (p1 == HIGH && p2 == HIGH && flag == 1) flag = 0;
display.showNumberDec(count);
}
Пины:
LASER1, LASER2 – лазеры, включены на HIGH,
PHOTO1, PHOTO2 – фотодатчики, считываются через digitalRead(),
BUZZER – пьезоизлучатель для звукового сигнала.
В loop():
Если PHOTO1 срабатывает первым (LOW) и флаг flag равен 0, ждёт, пока PHOTO2 сработает (LOW), затем увеличивает счётчик, издаёт сигнал 1000 Гц на 200 мс и устанавливает флаг.
Если PHOTO2 срабатывает первым, ждёт PHOTO1, уменьшает счётчик (если >0), издаёт сигнал 500 Гц на 200 мс и устанавливает флаг.
Когда оба фотодатчика в состоянии HIGH и флаг установлен, флаг сбрасывается, чтобы быть готовым к следующему проходу.
Значение счётчика отображается на TM1637.
Настройка и калибровка
Фоторезисторы в темноте (трубки). Порог digitalRead (HIGH свет). Резисторы лазеров для дальности. TM1637 яркость 0–7.
Расширение
Реле/сирена тревога. LCD детальный лог. Wi-Fi ESP8266 для уведомлений. SD-карта логи. Несколько пар лазеров (этажи).
Заключение
Лазерная сигнализация на Arduino — дешёвый счётчик посетителей/охрана. Фоторезисторы, TM1637, пищалка. Простая схема, надёжный подсчёт вход/выход.
FAQ — Лазерная сигнализация Arduino
Не считает правильно?
Выровняйте лазеры точно в фоторезисторы. Трубки для темноты. Порог digitalRead подстройте резисторами.
Лазеры слабые?
Резистор 200–300 Ом для яркости. Красный лазер лучше виден. Расстояние до 10 м в темноте.
Пищалка не звучит?
Пин с ШИМ (3,5,6,9,10,11). tone(freq, duration) в коде.
Индикатор не показывает?
Библиотека TM1637Display. CLK/DIO пины правильные. display.showNumberDec(count).
Счётчик в минус уходит?
Условие if (count > 0) count—;. Или отображать 0 минимум.
Аналоговые фоторезисторы?
analogRead() > threshold для света. Калибровка под освещение.
ESP8266 вместо Arduino?
Да, пины GPIO. Wi-Fi уведомления при проходе.