Простая система безопасности на Arduino своими руками

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

Данная система использует пироэлектрический инфракрасный (PIR) датчик движения для определения присутствия человека в его поле действия. Полученная от этого датчика информация передается по беспроводному каналу с помощью радиочастотного приемопередатчика.

Для создания самодельной системы безопасности потребуются компоненты, показанные на рисунке ниже.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/645-prostaya-sistema-bezopasnosti-na-arduino-svoimi-rukami/images/prostaya-sistema-bezopasnosti-na-arduino-1.jpg

Передающая часть системы главным образом состоит из платы Arduino Nano (может использоваться любая другая плата Arduino), PIR-датчика, РЧ-передатчика и светодиода. Выход датчика подключается к линии D2 платы Arduino. Линия данных радиопередатчика подключается к линии D12 платы Arduino. Схема подключения передающей части системы представлена на изображении ниже.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/645-prostaya-sistema-bezopasnosti-na-arduino-svoimi-rukami/images/prostaya-sistema-bezopasnosti-na-arduino-2.jpg

Приемная часть состоит главным образом из платы Arduino Uno (может использоваться любая другая плата Arduino), РЧ-приемника, пьезозуммера и светодиода. Линия данных радиоприемника подключается к линии D12 платы Arduino. Пьезозуммер, предназначенный для звукового оповещения, подключается к линии D10 платы Arduino. Схема подключения приемной части системы представлена на изображении ниже.

https://alashed-media.s3.eu-north-1.amazonaws.com/wiki/digitrode/645-prostaya-sistema-bezopasnosti-na-arduino-svoimi-rukami/images/prostaya-sistema-bezopasnosti-na-arduino-3.jpg

Далее приведен код для передающей части.

#include <VirtualWire.h>

int led_pin = 13;
int transmit_pin = 12;
int pir_pin = 2;
int val = 0;
int pir_state = LOW;

void setup()
{
   Serial.begin(9600);
   vw_set_tx_pin(transmit_pin);
   vw_setup(4000); // Скорость передачи
   pinMode(led_pin, OUTPUT);
   pinMode(pir_pin,INPUT);
}

void loop()
{
  char msg[1] = {'0'};
  // Получаем значение с датчика
  val = digitalRead(pir_pin);
  // Меняем сообщение, если движение замечено
  if (val == 1)
  {
      msg[0] = '1';
      digitalWrite(led_pin, HIGH); // Зажигаем светодиод для индикации передачи
      vw_send((uint8_t *)msg, 1);
      vw_wait_tx(); // Ждем, когда сообщение уйдет
      if (pir_state == LOW)
      {
      Serial.println("Motion detected!");
      pir_state = HIGH;
      }
   }
 else
 {
   msg[0] = '0';
   digitalWrite(led_pin, LOW);
   vw_send((uint8_t *)msg, 1);
   vw_wait_tx(); // Ждем, когда сообщение полностью уйдет
   if (pir_state == HIGH)
   {
      Serial.println("Motion ended!");
      pir_state = LOW;
   }
  }
}

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

#include <VirtualWire.h>

int led_pin = 13;
int transmit_pin = 12;
int pir_pin = 2;
int val = 0;
int pir_state = LOW;

void setup()
{
   Serial.begin(9600);
   vw_set_tx_pin(transmit_pin);
   vw_setup(4000); // Скорость передачи
   pinMode(led_pin, OUTPUT);
   pinMode(pir_pin,INPUT);
}

void loop()
{
  char msg[1] = {'0'};
  // Получаем значение с датчика
  val = digitalRead(pir_pin);
  // Меняем сообщение, если движение замечено
  if (val == 1)
  {
      msg[0] = '1';
      digitalWrite(led_pin, HIGH); // Зажигаем светодиод для индикации передачи
      vw_send((uint8_t *)msg, 1);
      vw_wait_tx(); // Ждем, когда сообщение уйдет
      if (pir_state == LOW)
      {
      Serial.println("Motion detected!");
      pir_state = HIGH;
      }
   }
 else
 {
   msg[0] = '0';
   digitalWrite(led_pin, LOW);
   vw_send((uint8_t *)msg, 1);
   vw_wait_tx(); // Ждем, когда сообщение полностью уйдет
   if (pir_state == HIGH)
   {
      Serial.println("Motion ended!");
      pir_state = LOW;
   }
  }
}
#include <VirtualWire.h>

// Pins definition
const int led_pin = 13;
const int receive_pin = 12;
int pinSpeaker = 10;

void setup()
{
   Serial.begin(9600); // Только для отладки
   vw_set_rx_pin(receive_pin);
   vw_setup(4000); // Скорость передачи
   // Старт ФАПЧ приемника
   vw_rx_start();
   // Настройка выводов для пьезозуммера и светодиода
   pinMode(led_pin, OUTPUT);
   pinMode(pinSpeaker, OUTPUT);
}

void loop()
{
   uint8_t buf[VW_MAX_MESSAGE_LEN];
   uint8_t buflen = VW_MAX_MESSAGE_LEN;

   // Проверка, получено ли сообщение
    if (vw_get_message(buf, &buflen))
    {
      if(buf[0]=='1')
      {
      Serial.println("Motion detected!");
      digitalWrite(led_pin,1);
      playTone(300, 160);
      delay(150);
      }
     if(buf[0]=='0')
     {
     Serial.println("Motion ended!");
     digitalWrite(led_pin,0);
     playTone(0, 0);
     delay(300);
     }
   }
}

// Длительность в миллисекундах, частота в герцах
void playTone(long duration, int freq)
{
    duration *= 1000;
    int period = (1.0 / freq) * 1000000;
    long elapsed_time = 0;
    while (elapsed_time < duration)
    {
    digitalWrite(pinSpeaker,HIGH);
    delayMicroseconds(period / 2);
    digitalWrite(pinSpeaker, LOW);
    delayMicroseconds(period / 2);
    elapsed_time += (period);
   }
}