Нашёл на просторах инета древний код. С помощью его можно управлять например реле, для включения освещения. Для управления потребуется любой ИК пульт, который можно запрограммировать на лету - не используя загрузчик Ардуино. Данные о пульте сохраняться в энергонезависимую память контроллера - EEPROM. По мимо этого подключив кнопку, также можно переключать реле. У меня на схеме вместо реле указан светодиод, но разобраться как подключить реле, не составит труда.
Принцип данного девайса таков - длительно нажав на тактовую кнопку, услышим звуковой сигнал, это значит что контроллер готов к программированию пульта. Наводим ИК излучатель пульта на ИК приёмник, и нажимаем на требуемую кнопку. Всё! Программирование завешено. Если же на пульте не нажать кнопку, то контроллер через некоторое время, издав звуковой сигнал, выйдет из режима программирования.
- КОД
Код: Выделить всё
#include <IRremote.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(); // включить IK приемник
}
void loop()
{
swt=digitalRead(button);
count=0;
while(swt==0)
{
if(count>30)
{
beep(100,400);
for(unsigned long i=0; i<500000; 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);
}
}
void delay_us (int us)
{
for (int i = 0; i <us; i ++)
{
_delay_us (1);
}
}
Первоисточник