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

в 5:36, , рубрики: arduino, diy или сделай сам

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

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

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

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

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

Фотография компонентов
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 фаил для прошивки контроллера Atmega168
Блок питания можно использовать от зарядного устройства для мобильного телефона.
Схемы блоков питания.

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

Автор: CyberLab

* - обязательные к заполнению поля