Открываю дверь домофона при помощи Яндекс Алисы и ардуино

CyberLab

★✩✩✩✩✩✩
7 Сен 2018
48
25
Москва

Часто бывает так, что кто то звонит в домофон, а ты в этот момент чем то занят, или просто лень подходить, для того что бы открыть дверь. Знакомая ситуация, не правда ли? А мой домофон так вообще без поднятия трубки не открывает дверь и если в течении 30 секунд после вызова не поднять трубку, то изображение исчезает и кнопка открывания двери не работает, до того момента пока не поступит новый вызов. Но тут к моему счастью в прошлом году мне на день рождение подарили голосового ассистента Алису и у меня появилась идея, отрывать дверь через голосовую команду умной колонки. И я взялся реализовать свою задумку и интегрировать ее в свой "Умный дом".

Как работает вызывная панель видео-домофона.Вызывная панель соединена с монитором домофона при помощи 4-х проводов GND, +12 В, аудио и видео. Если на вызывной панели, провод Audio замкнуть через резистор 100 Ом на GND, то раздастся сигнал вызова. А если на провод Аудио подать напряжение 12 В, то сработает реле открытия электромагнитного замка. Если для подключения вызывной панели к монитору у Вас используется специальный домофонный кабель, то он подключается как правило по следующей инструкции:
GND - экранирующая оплетка
+12 В - красный провод
Аудио - синий провод
Видео - центральная жила коаксиального кабеля

Для подключения нашего устройства на Ардуино к домофону, потребуется всего 2 провода. Вместо реле можно использовать ключ на N-P-N транзисторе или оптрон PC817.ИК приемник я применил, первый попавшийся мне на глаза, который я когда-то выпаял из старого телевизора и который пролежал у меня на полке в хламе очень много лет.

Используемые компоненты
Ардуино нано, Модуль реле, ИК приемник 38 кГц, Провода Dupont

Схема:


intercom.jpg

Скетч для ардуино:
C++:
// Код принадлежит магазину DUINO.RU



#include <IRremote.h>

#include <EEPROM.h>



//#define TOLERANCE 35 // процент допустимого отклонения принимаемого сигнала

#define IR_RECEIVE_PIN 11 // Вход для подключения ИК приемника

#define RELAY_PIN 12  // Выход для управления реле

#define SET_PIN 2  // Вход для перевода в режим программирования пульта



IRrecv irrecv(IR_RECEIVE_PIN);

decode_results results;



void setup()

{

    irrecv.enableIRIn(); // запустить прием кода с ИК приемника

    pinMode(RELAY_PIN, OUTPUT);

    digitalWrite(RELAY_PIN, LOW);

    pinMode(SET_PIN, INPUT_PULLUP); // пин выбора режима

    pinMode(LED_BUILTIN, OUTPUT);

    digitalWrite(LED_BUILTIN, LOW);

  

    while(!digitalRead(SET_PIN))  //если пины D2 и GND замкнуты то заходим в режим программирования пду

    {

        set_command();

    }

}



void loop()

{

    if (irrecv.decode(&results))   //если был принят код с пульта

    {   

      if(LoadEEPROM()==results.value) //если код совпадает с сохраненным в EEPROM

      {

       digitalWrite(RELAY_PIN, HIGH); //включить реле

       digitalWrite(LED_BUILTIN, HIGH);

       delay(500);

       digitalWrite(LED_BUILTIN, LOW);

       digitalWrite(RELAY_PIN, LOW); //Выключить реле

      }

      irrecv.resume();   //запустить ожидание нажатия с пульта

    }

}

  

void set_command() //режим запоминания кода пульта ДУ

{

  digitalWrite(LED_BUILTIN, HIGH);

   if (irrecv.decode(&results))

    {

       digitalWrite(LED_BUILTIN, LOW);

       SaveEEPROM(results.value);   //сохраняем полученный код кнопки ПДУ в EEPROM   

       irrecv.resume();           //запустить ожидание нажатия с пульта

    }

  delay(100);

}



void SaveEEPROM(unsigned long ir_code)  // записываем полученный код кнопки ПДУ в EEPROM

{

  EEPROM.write(0, ir_code & 0xFF);

  EEPROM.write(1, (ir_code & 0xFF00) >> 8);

  EEPROM.write(2, (ir_code & 0xFF0000) >> 16);

  EEPROM.write(3, (ir_code & 0xFF000000) >> 24);

}



unsigned long LoadEEPROM()  // считываем код кнопки ПДУ из EEPROM

{

  byte val = EEPROM.read(3);

  unsigned long ir_code=val;

      val = EEPROM.read(2);

                ir_code= (ir_code << 8) | val;

      val = EEPROM.read(1);

                ir_code= (ir_code << 8) | val;

      val = EEPROM.read(0);

                ir_code= (ir_code << 8) | val;

  return ir_code;

}

}
 
Изменено: