Рубрики
Схемы на Arduino

Сигнализация на дверь с использованием Arduino и ультразвукового датчика

В данной статье мы рассмотрим сигнализацию на дверь с использованием Arduino и ультразвукового датчика, которую можно установить рядом с любой дверью для обнаружения кого-либо в этой двери. Всегда, когда кто-нибудь будет попадать в радиус действия ультразвукового датчика, зуммер (звонок) будет выдавать звуковой сигнал тревоги. Также это устройство можно использовать в качестве детектора движения.

Необходимые компоненты

  1. Плата Arduino Mega (или любая другая модель) (купить на AliExpress).
  2. Ультразвуковой датчик (купить на AliExpress).
  3. Зуммер (звонок) (купить на AliExpress).
  4. Макетная плата.
  5. Соединительные провода.
  6. USB кабель для Arduino или адаптер на 12v, 1A.

Модуль ультразвукового датчика

Ультразвуковой датчик HC-SR04 используется для обнаружения присутствия человека в двери. Он состоит из двух круглых «глаз», один из которых используется для передачи ультразвуковых сигналов, а другой – для их приема.

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

Distance = Time x Speed of Sound / 2

Делить на 2 необходимо потому что лучи распространяются до препятствия и обратно, то есть одну и ту же дистанцию проходят два раза. Но в данном проекте мы будем использовать библиотеку NewPing.h, которая может самостоятельно произвести все эти расчеты.

Также о принципах измерения расстояния с помощью ультразвукового датчика более подробно можно прочитать в следующих статьях на нашем сайте:
измерение расстояний с помощью платы Arduino;
измерение расстояний с помощью датчика HC-SR04 и микроконтроллера AVR.

Работа схемы

Схема устройства представлена на следующем рисунке.

На схеме можно видеть, что переключающий контакт (Trigger pin) ультразвукового датчика подсоединен к контакту 12 платы Arduino, а контакт эхо (Echo pin) датчика подсоединен к контакту 11 платы Arduino. Контакт Vcc датчика подсоединен к контакту 5V Arduino, а контакт GND датчика подсоединен к контакту GND Arduino. Один контакт зуммера подключен к контакту GND Arduino, а другой его контакт – к контакту 8 платы Arduino.

Принцип работы рассматриваемого нами устройства очень прост – когда кто-нибудь попадает в радиус действия ультразвукового датчика плата Arduino рассчитывает расстояние до этого объекта и если измеренное расстояние находится в определенном диапазоне, Arduino передает сигнал высокого уровня на зуммер и зуммер начинает подавать сигнал тревоги. Структурная схема проекта представлена на следующем рисунке.

Вы можете проверить работу схемы при помощи помещения какого-нибудь предмета перед ультразвуковым датчиком, более подробно все эти процессы можно посмотреть в видео в конце статьи.

Исходный код программы

В этом проекте мы использовали библиотеку NewPing.h для ультразвукового датчика, разработанную Tim Eckel. Хотя с ультразвуковым датчиком можно вполне успешно работать и без этой библиотеки, но в виде исключения мы в этом проекте решили использовать ее потому что она имеет много полезных функций для работы с ультразвуковым датчиком и значительно сокращает код программы.

#include <NewPing.h>

Все подробности о работе с этой библиотекой можно узнать (и скачать ее самую последнюю версию) по следующей ссылке. Также можно посетить страницу с этой библиотекой на официальном сайте Arduino.

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

Переключающий контакт (Trigger pin) датчика подключен к контакту 12 платы Arduino, а Echo pin – к контакту 11 платы Arduino. MAX_DISTANCE обозначает максимальную дистанцию, на котором датчик может обнаруживать препятствие. Оно составляет 500 см (5 м).

#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define MAX_DISTANCE 500

Установим скорость последовательного порта (в бодах/с), с которой будут передаваться данные от ультразвукового датчика к плате Arduino.

Serial.begin(115200);

Контакт 10 конфигурируется для работы на вывод данных и к нему подключен зуммер. Другой контакт зуммера подключен к контакту GND платы Arduino.

pinMode(10, OUTPUT);

В функции void echoCheck() команда sonar.ping_result / US_ROUNDTRIP_CM используется для расчета расстояния от датчика до препятствия. Переменная flag используется чтобы дать сигнал включения зуммера когда препятствие находится на расстоянии менее 50 см от датчика. Вы можете изменить это расстояние на то, которое вам необходимо (будет зависеть от размеров вашей двери).

if ((sonar.ping_result / US_ROUNDTRIP_CM) < 50)
flag = 1;
else if ((sonar.ping_result / US_ROUNDTRIP_CM) > 50)
flag = 0;

Работа с ультразвуковым датчиком с помощью библиотеки NewPing.h снабжена подробными комментариями от авторов этой библиотеки. Изучая примеры этой библиотеки вы можете узнать много полезного о работе с ультразвуковым датчиком.

Изначально ультразвуковой датчик предназначен для измерения расстояний, но в этом проекте мы его применили, как вы можете видеть – в качестве охранной системы (сигнализации на дверь). Но его также можно применить и в других нестандартных проектах, например, для измерения уровня воды в баке.

Далее приведен полный текст программы.

#include <NewPing.h>
#define TRIGGER_PIN 12 // к этому контакту Arduino подключен trigger pin датчика
#define ECHO_PIN 11 // к этому контакту Arduino pin подключен echo pin датчика.
#define MAX_DISTANCE 500 // максимальная дистанция, на которой будет работать датчик в нашем проекте. Обычно для подобных датчиков максимальная дистанция составляет примерно 400-500 см
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // установка параметров работы датчика с помощью функции из библиотеки NewPing.h
unsigned int pingSpeed = 50; // как часто мы будем измерять расстояние до препятствия (в миллисекундах). 50 мс означает что мы будем измерять расстояние 20 раз в секунду
unsigned long pingTimer;
int flag = 0; // флаг для срабатывания зуммера, вначале устанавливаем его в 0
void setup() {
Serial.begin(115200); // инициализация последовательного порта на скорость 115200 бод/с
pingTimer = millis();
pinMode(10, OUTPUT); // старт работы датчика
}
void loop() {
// Notice how there's no delays in this sketch to allow you to do other processing in-line while doing distance pings.
if (millis() >= pingTimer) { // если условие выполняется, то выполнить другой пинг
pingTimer += pingSpeed; // установка следующего времени пинга.
sonar.ping_timer(echoCheck); // передаем пинг, вызываем функцию "echoCheck" каждые 24 мкс
}
if (flag == 1)
{
digitalWrite(10, HIGH);
delay(500);
digitalWrite(10, LOW);
delay(500);
digitalWrite(10, HIGH);
delay(500);
digitalWrite(10, LOW);
delay(500);
}
else
{
digitalWrite(10, LOW);
}
}
void echoCheck() { // прерывание от Timer2 вызывает эту функцию каждые 24 мкс чтобы проверить статус пинга
if (sonar.check_timer()) { // проверка вернулся ли пинг
// Here's where you can add code.
Serial.print("Ping: ");
Serial.print(sonar.ping_result / US_ROUNDTRIP_CM); // пинг (ультразвуковой сигнал) вернулся, его результат в микросекундах будет в ping_result и затем будет конвертирован в сантиметры с помощью инструкции US_ROUNDTRIP_CM.
Serial.println("cm");
if ((sonar.ping_result / US_ROUNDTRIP_CM) < 50)
flag = 1;
else if ((sonar.ping_result / US_ROUNDTRIP_CM) > 50)
flag = 0;
}
}

Видео, демонстрирующее работу схемы

4 ответа к “Сигнализация на дверь с использованием Arduino и ультразвукового датчика”

Почему этот блок повторяется четыре раза, а не два, как написано в коде? По коду должно сработать: Включить-выключить, Включить-выключить. А по факту: Включить-выключить, Включить-выключить, Включить-выключить, Включить-выключить

{
digitalWrite(10, HIGH);
delay(500);
digitalWrite(10, LOW);
delay(500);
digitalWrite(10, HIGH);
delay(500);
digitalWrite(10, LOW);
delay(500);
}

Виктор, он повторяется 4 раза для лучшей заметности сигнала тревоги, но вы можете оставить и 2 раза если вам это нравится, это же не принципиально

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *