Лазерная сигнализация на Arduino: счётчик посетителей и охранная система

Лазерная сигнализация на Arduino — простой и эффективный способ подсчёта посетителей, машин на парковке или охраны помещения. Два лазера и фоторезисторы фиксируют прерывание луча: вход/выход. Вывод на индикатор TM1637: текущее количество людей. Пищалка разные тоны для входа/выхода. Проект для магазина, офиса, дачи или умного дома: сценарии по наличию людей (выключить свет, включить охрану). Дешёвая сборка: лазеры от указки, фоторезисторы, Arduino Nano. Расстояние до 5–10 м. Стабильность, низкое потребление.

Лазерная сигнализация Arduino счётчик посетителей фоторезисторы TM1637

Возможности лазерной сигнализации

Подсчёт входа/выхода: +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);
}
Управляет лазерно-фотодатчиком и 4-значным дисплеем TM1637 для подсчёта объектов, проходящих через лучи.
Пины:
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 уведомления при проходе.

📁 Скачать примеры