- PVSM.RU - https://www.pvsm.ru -

Программируемый выключатель света с дистанционным управлением

image
Продолжение ранее опубликованных статей, первая [1], вторая [2].
В этой статье речь пойдет о программируемом выключателе света с дистанционным управлением. Как и прошлых проектах для отладки и прототипирования, я использую Carduino Nano V.7 [3]

Требуемый функционал

Возможность управлять выключателем любым бытовым ИК пультом управления.
Программировать выключатель на любую кнопку бытового ИК пульта управления.
Включать/выключать свет, как от клавиши выключателя, так и с пульта, не зависимо друг от друга.

Схема и комплектующие

image
Для сборки прототипа использовал следующие компоненты:
Контроллер Carduino Nano V.7 [3]
Relay Module [4]
ИК приемник TSOP [5]
Макетная плата [6]
Звуковой излучатель [7]

Фотография компонентов
image

Описание работы выключателя

Сначала добавляем в память выключателя код кнопки пульта управления. Для этого мы берем наиболее подходящий нам пульт управления (пульт от кондиционера не подойдет) и выбираем на нем свободную кнопку, которой Вы никогда не пользуетесь (обычно это цветные кнопки телетекста). Входим в режим программирования выключателя, для этого нужно нажать на клавишу вкл/выкл и подержать 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); 
  }  
} 

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

Hex фаил [8] для прошивки контроллера Atmega168
Блок питания можно использовать от зарядного устройства для мобильного телефона.
Схемы [9] блоков питания.

Если будут вопросы задавайте, с удовольствием отвечу на них.

Автор: CyberLab


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/arduino/10553

Ссылки в тексте:

[1] первая: http://habrahabr.ru/post/144180/

[2] вторая: http://habrahabr.ru/post/145639/

[3] Carduino Nano V.7: http://carmonitor.ru/ru/product_info.php?products_id=120

[4] Relay Module: http://carmonitor.ru/ru/product_info.php?products_id=172

[5] ИК приемник TSOP: http://carmonitor.ru/ru/product_info.php?products_id=117

[6] Макетная плата: http://carmonitor.ru/ru/product_info.php?products_id=126

[7] Звуковой излучатель: http://www.chipdip.ru/product/hc0905a.aspx

[8] Hex фаил: http://cyber-place.ru/attachment.php?attachmentid=382&d=1339082814

[9] Схемы: http://cyber-place.ru/showthread.php?t=333