В этой статье речь пойдет о программируемом выключателе света с дистанционным управлением.
Функционал:Возможность управлять выключателем любым бытовым ИК пультом управления.
Программировать выключатель на любую кнопку бытового ИК пульта управления.
Включать/выключать свет, как от клавиши выключателя, так и с пульта, не зависимо друг от друга.
Схема и комплектующие:
Для сборки прототипа использовал следующие компоненты:- Контроллер Carduino Nano V.7
- Relay Module
- ИК приемник TSOP
- Макетная плата
- Звуковой излучатель
Фотография компонентов:
Описание работы с выключателемСначала добавляем в память выключателя код кнопки пульта управления. Для этого мы берем наиболее подходящий нам пульт управления (пульт от кондиционера не подойдет) и выбираем на нем свободную кнопку, которой Вы никогда не пользуетесь (обычно это цветные кнопки телетекста). Входим в режим программирования выключателя, для этого нужно нажать на клавишу вкл/выкл и подержать 5 секунд, раздастся длинный звуковой сигнал «Бип», после этого остается нажать ранее выбранную кнопку пульта и ваш выключатель готов к работе. Теперь выключатель света будет понимать добавленную в него команду Вашего ИК пульта. Код кнопки сохраняется в энергонезависимой памяти контроллера и будет храниться в памяти даже после отключения питания схемы.
Видео работы выключателя:
Код для контроллера Arduino:#include <IRremote.h>
#include <avr/delay.h>
#include <EEPROM.h>
#define button 7
#define speaker 11
#define lamp 6
IRrecv irrecv(2); //вход для ик приемника
decode_results results;
unsigned long ir_command;
uint8_t swt, count, state = 0; //статус лампочки
void setup()
{
pinMode(speaker, OUTPUT);//громкоговоритель
pinMode(button, INPUT);//вход для кнопки
digitalWrite(button,HIGH);//включить подтяжку
pinMode(lamp, OUTPUT);//лампочка
irrecv.enableIRIn(); // включить приемник
}
void loop()
{
swt=digitalRead(button);
count=0;
while(swt==0)
{
if(count>30)
{
beep(100,400);
for(unsigned long i=0; i<2000000; i++)
{
if (irrecv.decode(&results))
{
SaveEEPROM(results.value);
irrecv.resume();
break;
}
}
beep(30,900);
break;
}
count++;
swt=digitalRead(button);
_delay_ms(100);
}
ir_command=LoadEEPROM();
if (irrecv.decode(&results))
{
if(ir_command==results.value)
{
state=~state;
digitalWrite(lamp, state);
beep(10,300);
_delay_ms(700);
}
irrecv.resume();
} else if(count>1)
{
state=~state;
digitalWrite(lamp, state);
beep(10,500);
_delay_ms(100);
}
}
void SaveEEPROM(unsigned long ir_code)
{
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()
{
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;
}
void beep(byte dur, word frq)
{
dur=(1000/frq)*dur;
for(byte i=0; i<dur; i++)
{
digitalWrite(speaker, HIGH);
_delay_us(frq);
digitalWrite(speaker, LOW);
_delay_us(frq);
}
}
Для компиляции кода нужно добавить библиотеку IRemote -
Вы не можете скачивать файлы с нашего сервераБиблиотека отличается от оригинальной, так как я добавил к ней еще несколько протоколов, в том числе и новый протокол LED телевизоров Samsung
После отладки устройства на arduino, нарисовал окончательную схему будущего выключателя. Так как я уже писал ранее, что Arduino это удобное средство для отладки и написания кода, но для окончательной схемы он не подойдет.
Прошивка контроллера Atmega168 -
Вы не можете скачивать файлы с нашего сервераБлок питания можно использовать от зарядного устройства для мобильного телефона или можно воспользоватся такими схемами: