Гид по технологиям

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

6 min read DIY Обновлено 18 Apr 2026
Сигнализация на Arduino: ультразвук, свет и зуммер
Сигнализация на Arduino: ультразвук, свет и зуммер

Детектор и провода для проекта сигнализации

Краткое описание

Наша цель — обнаруживать движение (или появление объекта в дверном проёме), затем отпугивать нарушителя пронзительным звуком и мигающими огнями. Это учебный проект — он не заменит профессиональную систему безопасности, но отлично показывает, как сочетать датчик расстояния, свет и звук на Arduino.

Важно: не используйте систему для реальной защиты ценного имущества и предупреждайте домочадцев — сигнализация может напугать.

Что понадобится

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

Схема и порядок сборки

Собирайте систему шаг за шагом, не убирая уже сделанные соединения. К моменту интеграции кода у вас должны быть подключены светодиодная лента, ультразвук и зуммер. Пример окончательной разводки показан ниже:

Завершённая разводка проводов для проекта сигнализации

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

Тест подсветки

Подключите RGB‑ленту и проверьте работу PWM с помощью простого теста. Если всё в порядке, лента должна мигать разными цветами.

Тест светодиодной RGB-ленты с переключением цветов

Ультразвуковой датчик (HC-SR04)

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

HC-SR04 ультразвуковой модуль с обозначенными контактами VCC TRIG ECHO GND

Для упрощения используем библиотеку NewPing. Поместите её в папку “libraries” Arduino IDE и перезапустите IDE.

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

Вывод расстояния с помощью датчика SR04 в мониторе порта

Пара слов по логике: 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)

  1. Solder/Setup — подключите минимальный набор (питание, GND, пин датчика).
  2. Test each block — отдельные скетчи для ленты, датчика, зуммера.
  3. Evaluate — проверяйте serial output, фиксируйте аномалии.
  4. 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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Лучшие виджеты для iPhone — обзор и инструкция
iPhone

Лучшие виджеты для iPhone — обзор и инструкция

Темы WordPress: выбор, установка, управление
WordPress

Темы WordPress: выбор, установка, управление

KVM на Arch Linux: установка и первая виртуальная машина
Виртуализация

KVM на Arch Linux: установка и первая виртуальная машина

Эффект Зейгарник для продуктивности
Продуктивность

Эффект Зейгарник для продуктивности

Ремонт ноутбука: диагностика и практические советы
Ремонт техники

Ремонт ноутбука: диагностика и практические советы

Безопасное выключение Raspberry Pi
Raspberry Pi

Безопасное выключение Raspberry Pi