#include <IRremote.h>
#include <EEPROM2.h>
#define led 13 // светодиод
#define RECV_PIN 8 // нога на IRDA приемник
#define DP1 7 // нога на реле
#define VIK 2 // нога на выключатель
#define maxstack 8 // размер стека-1
#define maxbut 20 // максимум запомненных кнопок
byte maxpults;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long butt[maxbut];
unsigned long buttstack[maxstack+1];
bool VikState;
bool flaglearn = false;
void ReleOff()
{ digitalWrite(DP1, HIGH);}
void setup()
{
irrecv.enableIRIn(); // Старт ресивера IRDA
pinMode(DP1, OUTPUT); // выход на реле
pinMode(VIK, INPUT); // вход выключателя
digitalWrite(VIK, HIGH); // включаем подтягивающий резистор
VikState=digitalRead(VIK);
YesRelay();
ReleOff();
pinMode(led, OUTPUT);
digitalWrite(led, LOW); // гасим светодиод
for (maxpults=0;maxpults<maxbut;maxpults++)
{EEPROM_read(maxpults*4, butt[maxpults]);
if (butt[maxpults]==0) break;}
}
void YesRelay()
{
digitalWrite(DP1,!digitalRead(DP1));
}
void iflearn(unsigned long code) // проверка на включение режима обучения
{
for (byte i=0;i<maxstack;i++) // суем в стек LIFO код клавиши
buttstack[maxstack-i]=buttstack[maxstack-i-1];
buttstack[0]=code;
//если в стеке последовательность 3-х разных кнопок 3 раза, то переход в режим программирования
if ((buttstack[0]==buttstack[3]) && (buttstack[0]==buttstack[6])
&& (buttstack[1]==buttstack[4]) && (buttstack[1]==buttstack[7])
&& (buttstack[2]==buttstack[5]) && (buttstack[2]==buttstack[8]) && (buttstack[0]!=buttstack[1])
&& (buttstack[0]!=buttstack[2]) && (buttstack[1]!=buttstack[2]))
{ // переход в режим программирования
digitalWrite(led, HIGH);
flaglearn=true;
for (byte i=0;i<maxstack+1;i++) // чистим стек
buttstack[i]=0;
maxpults=0;
}
}
void loop()
{
if (VikState != digitalRead(VIK)) // если изменилось состояние кнопки выключателя
{YesRelay();
VikState=!VikState;}
if (irrecv.decode(&results))
{
if (flaglearn) { // если флаг обучения взведен, входим в режим обучения пульта
butt[maxpults]=results.value;
if ((maxpults>0) && (butt[maxpults]==butt[maxpults-1]) || (maxpults==maxbut))
{ // режим обучения отключаем при дублировании последней кнопки
flaglearn=false;
digitalWrite(led, LOW);
for (byte i=0;i<maxpults;i++) // записываем коды в EEPROM
EEPROM_write(i*4, butt[i]);
butt[maxpults]=0; //
EEPROM_write(maxpults*4, butt[maxpults]);
} else
maxpults++;
} else
{ // обычный режим ловли кода кнопки пульта
if (results.value!=0){iflearn(results.value);}
for (byte i=0;i<maxpults;i++) // сравним полученный код с каждым из пультов
{
if (results.value==butt[i])
{ YesRelay(); // если код совпал, переключаем реле
break; } // и выходим из цикла
}
}
delay(400); // убираем дребезг
irrecv.resume();
}
}
+23 |
1888
52
|
+47 |
2506
89
|
+165 |
3923
48
|
+24 |
1965
26
|
взял телефон, щелкнул, все выключилось
ps Задумался… а не проще ли размещать девайс в плафоне люстры? Да и пультом целиться в выключаемое устройство логичнее, чем в выключатель… Надо будет обдумать такой вариант :)
Вот
При этом не нужны будут БП и реле
3 вариант будет? :)
Но к сожалению, данная реализация плохо работает со светодиодными лампами :(
короче от меня заслуженный плюс! ;)
Не знаю как свернуть под спойлер. :-)
))
У вас, судя по схеме, уже есть внешний подтягивающий резистор на 10К, причём к минусу (GND). А вы программно включаете внутренний подтягивающий резистор, который тянет к плюсу питания. Сопротивление внутреннего резистора достаточно велико и не влияет на работу, пока. Но лучше так не делать. Ну и для понимания на будущее.
А так отлично, у меня похоже сделано, в быту очень удобно оказалось.
Если кто может подсказать — подскажите пожалуйста.
Вдруг так свет забыл выключить, а он сам потухнет по таймеру.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.