Простая сигнализация на Arduino: ультразвук, свет и зуммер

Краткое описание
Наша цель — обнаруживать движение (или появление объекта в дверном проёме), затем отпугивать нарушителя пронзительным звуком и мигающими огнями. Это учебный проект — он не заменит профессиональную систему безопасности, но отлично показывает, как сочетать датчик расстояния, свет и звук на Arduino.
Важно: не используйте систему для реальной защиты ценного имущества и предупреждайте домочадцев — сигнализация может напугать.
Что понадобится
- Arduino (Uno/Nano или совместимая плата)
- Ультразвуковой модуль HC‑SR04 (ping) — бюджетный и легко маскируется в дверном проёме. PIR‑датчик подходит лучше для детекции движения, но дороже.
- Пьезозуммер (Piezo)
- RGB LED‑лента с общей схемой подключения, поддерживающая ШИМ (PWM)
- Провода, макетная плата или пайка по желанию
- Компьютер с Arduino IDE и библиотекой NewPing. Для звука может понадобиться библиотека NewTone.
Схема и порядок сборки
Собирайте систему шаг за шагом, не убирая уже сделанные соединения. К моменту интеграции кода у вас должны быть подключены светодиодная лента, ультразвук и зуммер. Пример окончательной разводки показан ниже:

Разводка RGB‑ленты делается согласно предыдущим проектам: используются три контакта PWM (для красного, зелёного и синего) и общий «+»/«-» как в вашем модуле. Не меняйте номера пинов, если собираетесь использовать приведённый код — в нём есть PWM‑выводы.
Тест подсветки
Подключите RGB‑ленту и проверьте работу PWM с помощью простого теста. Если всё в порядке, лента должна мигать разными цветами.

Ультразвуковой датчик (HC-SR04)
На модуле SR04 есть 4 контакта: VCC и GND идут к +5 В и общему проводу; TRIG — пин, с которого отправляется «пинг», подключите к пину 6; ECHO — считывается обратно, подключите к пину 7.

Для упрощения используем библиотеку NewPing. Поместите её в папку “libraries” Arduino IDE и перезапустите IDE.
Запустите тестовое приложение, откройте монитор порта и установите скорость 115200 бод. Вы увидите измерения расстояния — небольшой разброс (1–2 см) нормален. Попробуйте двигать рукой перед датчиком и проследить изменение показаний.

Пара слов по логике: NewPing возвращает время в микросекундах на полный «круговой путь» сигнала. Для перевода в сантиметры используется константа US_ROUNDTRIP_CM.
Пьезозуммер
Пьезо — простой и недорогой излучатель. Подключите один провод к пину 3 (или другому PWM‑пину, если надо), второй — к земле. Для генерации сложных тонов используем синусоидальную модуляцию частоты.
Короткий тест подтвердит, что зуммер звучит.
Код — по шагам
Ниже мы будем комбинировать готовые кусочки кода. Переводы и пояснения идут после фрагментов. (Кодовые блоки можно загружать в Arduino IDE.)
Сначала — определения и объявления:
#include
// Select which PWM-capable pins are to be used.
#define RED_PIN 10
#define GREEN_PIN 11
#define BLUE_PIN 9
#define TRIGGER_PIN 6 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 7 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 100 // Maximum distance we want to ping for (in centimeters).
#define ALARM 3
float sinVal;
int toneVal;
Затем — базовый setup, где настраиваются режимы пинов и даётся задержка на 5 секунд, чтобы успеть отойти от устройства:
void setup(){
//set pinModes for RGB strip
pinMode(RED_PIN,OUTPUT);
pinMode(BLUE_PIN,OUTPUT);
pinMode(GREEN_PIN,OUTPUT);
//reset lights
analogWrite(RED_PIN,0);
analogWrite(BLUE_PIN,0);
analogWrite(RED_PIN,0);
delay(5000);
}Полезная вспомогательная функция для записи цвета в RGB‑ленту:
//helper function enabling us to send a colour in one command
void color (unsigned char red, unsigned char green, unsigned char blue)// the color generating function
{
analogWrite(RED_PIN, red);
analogWrite(BLUE_PIN, blue);
analogWrite(GREEN_PIN, green);
}Простейший цикл, который заставит ленту мигать красным и жёлтым:
void loop(){
color(255,0,0); //red
delay(100);
color(255,255,0); //yellow
delay(100);
}Загрузите и проверьте — если всё горит, продолжаем.
Интеграция датчика расстояния
Перед функцией setup добавьте инициализацию NewPing:
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance. Добавьте флаг состояния тревоги:
boolean triggered = false; И включите вывод в Serial в setup для отладки:
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results. Переименуем имеющийся цикл в alarm(), он будет выполнять мигание:
void alarm(){
color(255,0,0); //red
delay(100);
color(255,255,0); //yelow
delay(100);
}Теперь новая основная loop — она читает пинг и срабатывает при попадании объекта ближе заданной дистанции:
void loop(){
if(triggered == true){
alarm();
}
else{
delay(50);// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
unsigned int distance = uS / US_ROUNDTRIP_CM;
Serial.println(distance);
if(distance < 100){
triggered = true;
}
}
} Пояснения к логике:
- Если тревога уже сработала, вызываем функцию alarm() (мигание света).
- Если нет — отправляем пинг и читаем расстояние.
- Если расстояние меньше порога (в примере 100 см), считаем, что что‑то появилось в зоне, и переводим triggered в true.
Добавляем зуммер
Добавьте в setup режим для зуммера:
pinMode(ALARM, OUTPUT); И добавьте звуковой цикл в alarm():
for (int x=0; x<180; x++) {
// convert degrees to radians then obtain sin value
sinVal = (sin(x*(3.1412/180)));
// generate a frequency from the sin value
toneVal = 2000+(int(sinVal*1000));
tone(ALARM, toneVal);
} Если вы попробуете скомпилировать сейчас, возможно появится конфликт прерываний между NewPing и стандартной функцией tone(). Решение — использовать библиотеку NewTone. Подключите её в начале программы:
#include И замените вызов tone(ALARM, toneVal); на:
NewTone(ALARM, toneVal); Наконец, ниже приведён объединённый пример программы (соберите эти куски в один sketch и протестируйте). Следует убедиться, что библиотеки NewPing и NewTone установлены в папке libraries.
#include
#include
#define RED_PIN 10
#define GREEN_PIN 11
#define BLUE_PIN 9
#define TRIGGER_PIN 6
#define ECHO_PIN 7
#define MAX_DISTANCE 100
#define ALARM 3
float sinVal;
int toneVal;
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
boolean triggered = false;
//helper function enabling us to send a colour in one command
void color (unsigned char red, unsigned char green, unsigned char blue)
{
analogWrite(RED_PIN, red);
analogWrite(BLUE_PIN, blue);
analogWrite(GREEN_PIN, green);
}
void setup(){
pinMode(RED_PIN,OUTPUT);
pinMode(BLUE_PIN,OUTPUT);
pinMode(GREEN_PIN,OUTPUT);
pinMode(ALARM, OUTPUT);
analogWrite(RED_PIN,0);
analogWrite(BLUE_PIN,0);
analogWrite(RED_PIN,0);
Serial.begin(115200);
delay(5000);
}
void alarm(){
// visual alarm
color(255,0,0);
delay(100);
color(255,255,0);
delay(100);
// audio alarm using NewTone to avoid interrupt conflict
for (int x=0; x<180; x++) {
sinVal = (sin(x*(3.1412/180)));
toneVal = 2000 + (int(sinVal*1000));
NewTone(ALARM, toneVal);
}
}
void loop(){
if(triggered == true){
alarm();
}
else{
delay(50);
unsigned int uS = sonar.ping();
unsigned int distance = uS / US_ROUNDTRIP_CM;
Serial.println(distance);
if(distance < 100){
triggered = true;
}
}
} Important: иногда показания датчика равны нулю (когда эхосигнал не принят) — учитывайте это в коде, добавляя защиту от ложных срабатываний.
Когда это может не сработать (ограничения и контрпримеры)
- В узких коридорах эхосигналы отражаются неправильно — возможны ложные срабатывания или отсутствие срабатываний.
- При медленном, нелинейном движении (например, ползущий объект) PIR иногда лучше.
- Если в зоне много посторонних отражающих поверхностей, HC‑SR04 даст нестабильный результат.
Альтернативные подходы
- PIR‑сенсор вместо HC‑SR04 — лучше детектирует движение человека, но не умеет измерять расстояние.
- Использование микрофона + обработка уровня шума (для локального обнаружения).
- Камера с обработкой изображения (дорожно сложнее, требует вычислительных ресурсов и конфиденциальности).
Мини‑методология: итеративная проверка (S T E P)
- Solder/Setup — подключите минимальный набор (питание, GND, пин датчика).
- Test each block — отдельные скетчи для ленты, датчика, зуммера.
- Evaluate — проверяйте serial output, фиксируйте аномалии.
- Patch & Integrate — объединяйте и снова тестируйте.
Контрольный список по ролям
- Сборщик: проверить пайку/клеммы, надёжность питания, изоляцию контактов.
- Тестер: запуск тестовых скетчей, проверка вывода в Serial, замер расстояний вручную.
- Установщик: разместить датчик в нише/дверном косяке, ориентировать модуль горизонтально.
Отладка — часто встречающиеся ошибки и решения
- Показания всегда 0 или 65535: проверьте питание и соединение ECHO/TRIG.
- Повторяющиеся ложные срабатывания: увеличьте сглаживание (усреднение нескольких пингов) и добавьте минимальную последовательность подтверждающих измерений перед переводом triggered = true.
- Конфликт tone() и NewPing: используйте NewTone или аппаратный генератор.
Быстрые инженерные эвристики
- Уменьшите MAX_DISTANCE до реального требуемого диапазона — это ускорит опрос.
- Добавьте hysteresis: требуйте N последовательных измерений ниже порога перед срабатыванием и M последовательных выше порога для сброса.
- Для дверных проёмов порог 40–60 см работает надёжно; подстройте под конкретную установку.
Пример дерева принятия решения (Mermaid)
flowchart TD
A[Начало] --> B{Есть ли текущее срабатывание?}
B -- Да --> C[Запуск alarm'' 'свет + звук']
B -- Нет --> D[Послать ping]
D --> E[Получить distance]
E --> F{distance < threshold?}
F -- Да --> G[triggered = true]
F -- Нет --> H[Ждать 50 ms]
G --> C
H --> DКороткий глоссарий (1 строка)
- HC‑SR04 — ультразвуковой модуль для измерения расстояния по времени возврата эхосигнала.
- PWM — широтно‑импульсная модуляция, используется для управления яркостью светодиодов.
- PIR — пассивный инфракрасный датчик движения.
Безопасность, конфиденциальность и этика
- Убедитесь, что вы не нарушаете приватность соседей: размещение камер/микрофонов требует согласия.
- Громкий сигнал может повредить слух — не направляйте зуммер в сторону человека на близком расстоянии.
Небольшие советы по размещению в бытовых условиях
- Маскируйте HC‑SR04 в нише, но следите, чтобы «глаз» датчика не был закрыт.
- Избегайте установки рядом с громкими источниками звука — это уменьшает полезность аудиосигнала.
Краткое резюме
- Проект собирается из трёх основных блоков: датчик расстояния, свет (RGB) и зуммер.
- Тестируйте каждую часть отдельно, затем интегрируйте.
- При конфликтах прерываний используйте NewTone для генерации звука.
Notes: если вставили собственный код и появилось много ошибок компиляции — вставьте текст ошибок в форум/сообщение, и помогут с разбором.
Image credit: Fire Alarm via Flickr
Похожие материалы
Лучшие виджеты для iPhone — обзор и инструкция
Темы WordPress: выбор, установка, управление
KVM на Arch Linux: установка и первая виртуальная машина
Эффект Зейгарник для продуктивности
Ремонт ноутбука: диагностика и практические советы