Простая система безопасности на Arduino своими руками
С помощью популярной нынче платформы Arduino можно создать вполне бюджетную домашнюю беспроводную систему безопасности. При этом данная система является достаточно простой в создании и рекомендуется как новичкам, так и опытным пользователям плат Arduino.
Данная система использует пироэлектрический инфракрасный (PIR) датчик движения для определения присутствия человека в его поле действия. Полученная от этого датчика информация передается по беспроводному каналу с помощью радиочастотного приемопередатчика.
Для создания самодельной системы безопасности потребуются компоненты, показанные на рисунке ниже.
Передающая часть системы главным образом состоит из платы Arduino Nano (может использоваться любая другая плата Arduino), PIR-датчика, РЧ-передатчика и светодиода. Выход датчика подключается к линии D2 платы Arduino. Линия данных радиопередатчика подключается к линии D12 платы Arduino. Схема подключения передающей части системы представлена на изображении ниже.
Приемная часть состоит главным образом из платы Arduino Uno (может использоваться любая другая плата Arduino), РЧ-приемника, пьезозуммера и светодиода. Линия данных радиоприемника подключается к линии D12 платы Arduino. Пьезозуммер, предназначенный для звукового оповещения, подключается к линии D10 платы Arduino. Схема подключения приемной части системы представлена на изображении ниже.
Далее приведен код для передающей части.
#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);
}
}