Main

Контроллер безопасности

Бродя по просторам интернета, я однажды наткнулся на интересное устройство -- контроллер беспроводных датчиков.

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

В комплекте идёт инструкция, которую так же можно скачать на сайте продавца.

Вырезка из инструкции по характеристикам устройства:

Т.е. мы имеем возможность считывать срабатывание на 8-ми каналах для беспроводных датчиков (движения либо открытия) с возможностью подключения до 4-х датчиков на канал; считывать общее состояние, заданное на пульте (постановка на охрану, частичная охрана, снятие с охраны); считывать срабатывание тревожной кнопки на пульте; считывать состояние одной управляемой нагрузке (на пульте две кнопки -- включение и выключение).

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

Сразу я не обратил внимание на приписку ОК в описании выводов и подключил напрямую выходы устройства ко входам Arduino. Оно, конечно, не заработало. Сказывается моя нетерпеливость и невежественность во многих вещах, связанных с электротехникой :) Потом я почитал, что такое "ОК" -- на самом деле это значит Открытый Коллектор: есть такой вид цифровых выходов, когда наличие сигнала на выходе означает замыкание выхода на корпус, а отсутствующий сигнал это просто "болтание" выхода в воздухе. Сразу я думал, что придётся городить промежуточные реле, но покопавшись в интернетах нашёл как подобные выходы подключаются к Arduino -- всего-то через резистор на 10К, подтянутый к +5V на том же Arduino.

Приблизительно по такой схеме:

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

Следующим шагом будет добавление кода в [[Main/ArduinoCode|прошивку контроллера] по абсолютно такому же принципу, как там уже прописан код для считывания датчика открытых ворот.

Пример добавленного кода:

 //MOVEMENT 1 SENSOR
  Serial.println("M1");
  int current_movement_1=digitalRead(8);
  //Serial.println(current_movement_1);
  if (current_movement_1!=(int)old_movement_1) {
    old_movement_1=(int)current_movement_1;
    sprintf(buf, "GET /objects/?object=sensorMovement1&op=m&m=statusChanged&status=%i HTTP/1.0", (int)current_movement_1);
    sendHTTPRequest();
  }

Код говорит о том, что при срабатывания сенсора движения (выход от контроллера датчиков подключен к 8-му входу на Arduino), будет отправлен запрос на сервер вида /objects/?object=sensorMovement1&op=m&m=statusChanged&status=1 (вызов метода statusChanged объекта sensorMovement1 с параметром status=1). Подробнее об обработке этого метода можно почитать здесь.

(Полный код новой прошивки приведён в конце этой страницы)

Таким образом, я получил очень полезное устройство, которое в последствии можно будет использовать как для организации серьёзной системы безопасности, так и для повседневных сценариев.


Не сочтите за рекламу (я их не продаю и никак не связан с продавцами!), но вот ссылка где он был куплен: ПРИЕМНИК РАДИОДАТЧИКОВ И БРЕЛОКОВ OKO-RF

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


Код обновлённой прошивки

#include <Ethernet.h>
#include <SPI.h>

// Библиотеки ниже нет в стандартной поставке среды разработки Arduino.
// придётся её скопировать.
#include <DallasTemperature.h>

// MAC-адрес нашего устройства
byte mac[] = { 0x00, 0x2A, 0xF5, 0x12, 0x67, 0xFC };
// ip-адрес устройства
byte ip[] = { 192, 168, 0, 71 };
// ip-адрес удалённого сервера
byte server[] = { 192, 168, 0, 17 }; // измените на свой

int old_temperature1=0;
int old_temperature2=0;
int old_garage=0;
int old_entry=0;
int old_movement_1=0;
int old_light=0;
char buf[80];

Client rclient(server, 80); // 80-порт.
DallasTemperature tempSensor1;
DallasTemperature tempSensor2;

// Функция отправки HTTP-запроса на сервер
void sendHTTPRequest() {
  if (rclient.connect()) { 
   Serial.println(buf);
   rclient.println(buf);
   rclient.println("Host: 192.168.0.17");
   rclient.println();   
   delay(2000);
   rclient.stop();
  } 
}


void setup()
{
 Ethernet.begin(mac, ip); // Инициализируем Ethernet Shield
 tempSensor1.begin(2); // Датчик температуры на 2-й пин (котёл)
 tempSensor2.begin(3); // Датчик температуры на 3-й пин (зал)
 pinMode(5, INPUT); // Датчик гаражной двери на 5-ый пин
 old_garage=digitalRead(5);
 pinMode(6, INPUT); // Датчик въездных ворот на 6-ый пин 
 old_entry=digitalRead(6);

 pinMode(8, INPUT); // Датчик движения 1
 old_movement_1=digitalRead(8);

 pinMode(9, INPUT); // Датчик света
 old_light=digitalRead(9);


 Serial.begin(115200); // Скорость консольного порта 115200 (пригодится для отладки)
}

void loop()
{

  int valid_sensor=0;

  delay(1000); // задержка в 1 сек.  

  // TEMP SENSOR 1
  float current_temp1=0;
  // Соединяемся
  // Обработчик ошибок датчика
  valid_sensor=1;
  switch(tempSensor1.isValid())
   {
     case 1:
       //Serial.println("Err T1"); // ошибка контрольной суммы
       tempSensor1.reset(); // сбросить девайс
       valid_sensor=0;
     case 2:
       //Serial.println("Err T1"); // какой-то "левый" датчик :)
       tempSensor1.reset(); // сбросить девайс
       valid_sensor=0;
   }


if (valid_sensor==1) {  
   Serial.println("T1");
   current_temp1=tempSensor1.getTemperature(); // получаем температуру
   //Serial.println(current_temp1);

  if ((old_temperature1!=(int)current_temp1) && (current_temp1<79) && (current_temp1>5)) {

   int temp1 = (current_temp1 - (int)current_temp1) * 100; // выделяем дробную часть
   sprintf(buf, "GET /objects/?object=sensorKotel&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp1, abs(temp1));   
   sendHTTPRequest();

}
 old_temperature1=(int)current_temp1;

}


  // TEMP SENSOR 2
  float current_temp2=0;

  // Соединяемся
  // Обработчик ошибок датчика
  valid_sensor=1;
  switch(tempSensor2.isValid())
   {
     case 1:
       //Serial.println("Err T2"); // ошибка контрольной суммы
       tempSensor2.reset(); // сбросить девайс
       valid_sensor=0;
     case 2:
       //Serial.println("Err T2"); // какой-то "левый" датчик :)
       tempSensor2.reset(); // сбросить девайс
       valid_sensor=0;
   }

 if (valid_sensor==1) {
   Serial.println("T2");
   current_temp2=tempSensor2.getTemperature(); // получаем температуру
   //Serial.println(current_temp2);

  if ((old_temperature2!=(int)current_temp2) && (current_temp2<50) && (current_temp2>5)) {
   int temp1 = (current_temp2 - (int)current_temp2) * 100; // выделяем дробную часть
   sprintf(buf, "GET /objects/?object=sensorZal&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp2, abs(temp1));   
   sendHTTPRequest();

}
 old_temperature2=(int)current_temp2;  
 }

  //GARAGE GATES SENSOR
  Serial.println("G");
  int current_garage=digitalRead(5);
  //Serial.println(current_garage);
  if (current_garage!=(int)old_garage) {
    old_garage=(int)current_garage;
    sprintf(buf, "GET /objects/?object=sensorGarage&op=m&m=statusChanged&status=%i HTTP/1.0", (int)current_garage);
    sendHTTPRequest();
  }

 //ENTRY GATES SENSOR

  Serial.println("E");
  int current_entry=digitalRead(6);
  //Serial.println(current_entry);
  if (current_entry!=(int)old_entry) {
    old_entry=(int)current_entry;
    sprintf(buf, "GET /objects/?object=sensorEntry&op=m&m=statusChanged&status=%i HTTP/1.0", (int)current_entry);
    sendHTTPRequest();
  }

 //MOVEMENT 1 SENSOR

  Serial.println("M1");
  int current_movement_1=digitalRead(8);
  //Serial.println(current_movement_1);
  if (current_movement_1!=(int)old_movement_1) {
    old_movement_1=(int)current_movement_1;
    sprintf(buf, "GET /objects/?object=sensorMovement1&op=m&m=statusChanged&status=%i HTTP/1.0", (int)current_movement_1);
    sendHTTPRequest();
  }


 //LIGHT SENSOR

  Serial.println("L");
  int current_light=digitalRead(9);
  //Serial.println(current_light);
  if (current_light!=(int)old_light) {
    old_light=(int)current_light;
    sprintf(buf, "GET /objects/?object=sensorLight&op=m&m=statusChanged&status=%i HTTP/1.0", (int)current_light);
    sendHTTPRequest();
  }  


}


 

MajorDomo

Информация

Проекты

Партнёры

edit SideBar

 
 
 

 

Blix theme adapted by David Gilbert, powered by PmWiki