Часто бывает так, что кто то звонит в домофон, а ты в этот момент чем то занят, или просто лень подходить, для того что бы открыть дверь. Знакомая ситуация, не правда ли? А мой домофон так вообще без поднятия трубки не открывает дверь и если в течении 30 секунд после вызова не поднять трубку, то изображение исчезает и кнопка открывания двери не работает, до того момента пока не поступит новый вызов. Но тут к моему счастью в прошлом году мне на день рождение подарили голосового ассистента Алису и у меня появилась идея, отрывать дверь через голосовую команду умной колонки. И я взялся реализовать свою задумку и интегрировать ее в свой "Умный дом".
Как работает вызывная панель видео-домофона.Вызывная панель соединена с монитором домофона при помощи 4-х проводов GND, +12 В, аудио и видео. Если на вызывной панели, провод Audio замкнуть через резистор 100 Ом на GND, то раздастся сигнал вызова. А если на провод Аудио подать напряжение 12 В, то сработает реле открытия электромагнитного замка. Если для подключения вызывной панели к монитору у Вас используется специальный домофонный кабель, то он подключается как правило по следующей инструкции:
GND - экранирующая оплетка
+12 В - красный провод
Аудио - синий провод
Видео - центральная жила коаксиального кабеля
Для подключения нашего устройства на Ардуино к домофону, потребуется всего 2 провода. Вместо реле можно использовать ключ на N-P-N транзисторе или оптрон PC817.ИК приемник я применил, первый попавшийся мне на глаза, который я когда-то выпаял из старого телевизора и который пролежал у меня на полке в хламе очень много лет.
Используемые компоненты
Ардуино нано, Модуль реле, ИК приемник 38 кГц, Провода Dupont
Схема:
Скетч для ардуино:
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;
}
}
Изменено: