// Klop 2020
#include <IRremote.h>
#include <EEPROM2.h>
#define led 13 // светодиод
#define speaker 9 // плюс пищалки
#define RECV_PIN 5 // нога на IRDA приемник
#define DP1 6 // нога на реле 1
#define DP2 7 // нога на реле 2
#define VIK1 2 // нога на выключатель 1
#define VIK2 3 // нога на выключатель 2
#define maxstack 8 // размер стека-1
#define maxbut 40 // максимум запомненных кнопок
byte maxpults;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long butt[maxbut];
unsigned long buttstack[maxstack+1];
bool VikState[]={false, false};
bool sost[]={true,true};
bool flaglearn = false;
byte DP[]={DP1, DP2};
byte VIK[]={VIK1, VIK2};
//------------------------------------------------------------
void setup()
{
irrecv.enableIRIn(); // Старт ресивера IRDA
pinMode(DP1, OUTPUT); // выход на реле 1
pinMode(DP2, OUTPUT); // выход на реле 2
pinMode(VIK1, INPUT); // вход выключателя 1
pinMode(VIK2, INPUT); // вход выключателя 2
VikState[0]=digitalRead(VIK1);
VikState[1]=digitalRead(VIK2);
digitalWrite(DP1, HIGH); // зависит от реле!!! При необходимости заменить на LOW
digitalWrite(DP2, HIGH); // зависит от реле!!! При необходимости заменить на LOW
pinMode(speaker, OUTPUT);
pinMode(led, OUTPUT);
digitalWrite(led, LOW); // гасим светодиод
for (maxpults=0;maxpults<maxbut;maxpults++)
{EEPROM_read(maxpults*4, butt[maxpults]); // читаем значения пультов
if (butt[maxpults]==0) break;
}
}
//------------------------------------------------------------
void ChangeRelay(byte n)
{
sost[n]=!sost[n];
digitalWrite(DP[n],sost[n]);
}
//------------------------------------------------------------
void mybeep(byte n) // звук, n - число пиков
{
for (byte i=0;i<n;i++)
{analogWrite(speaker,150);
delay(100);
analogWrite(speaker,0);
delay(50);
}
}
//------------------------------------------------------------
void IFVIKSTATE()
{
for (byte i=0;i<2;i++)
{
if (VikState[i] != digitalRead(VIK[i])) // если изменилось состояние кнопки выключателя
{ ChangeRelay(i);
VikState[i]=!VikState[i];
delay(800);
}
}
}
//------------------------------------------------------------
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);
mybeep(1);
flaglearn=true;
for (byte i=0;i<maxstack+1;i++) // чистим стек
buttstack[i]=0;
maxpults=0;
}
}
//------------------------------------------------------------
void IFPULTS()
{
if (irrecv.decode(&results))
{ if (flaglearn) { // если флаг обучения взведен, входим в режим обучения пульта
if ((maxpults>0) && (results.value==butt[maxpults-1]) || (maxpults==maxbut))
{ // режим обучения отключаем при дублировании последней кнопки
flaglearn=false;
digitalWrite(led, LOW);
mybeep(5);
butt[maxpults]=0;
for (byte i=0;i<=maxpults;i++) // записываем коды в EEPROM
EEPROM_write(i*4, butt[i]);
} else
{ for (byte i=0;i<maxpults-1;i++) // был ли такой код ранее?
if (butt[i]==results.value) goto m1;
butt[maxpults]=results.value; // такого кода ранее не было
maxpults++;
mybeep(maxpults%2+1);
}
} else
{ // обычный режим ловли кода кнопки пульта
iflearn(results.value);
for (byte i=0;i<maxpults;i++) // сравним полученный код с каждым из пультов
{ if (results.value==butt[i])
{ ChangeRelay(i%2); // если код совпал, переключаем соответствующее реле
break; // и выходим из цикла
}
}
}
m1:
delay(400); // убираем дребезг
irrecv.resume();
}
}
//------------------------------------------------------------
void loop()
{
IFVIKSTATE(); // проверяем выключатели
IFPULTS(); // проверяем пульты
}
+125 |
3957
120
|
+116 |
4978
85
|
+35 |
1892
48
|
потом все таки на блютуэ перешел, с обратной связью оказалось поудобней
www.youtube.com/watch?v=5Sl787khXZQ
не только лишь все…
Что-то непонятно, а как реализована возможность включения/выключения света выключателем?… Сорри. Прочитал в «публикации 4-х летней давности»Об этой проблеме в статье написано особо, в том числе описано как я ее решил для себя.
Так с дачей понятно. А как с квартирой. Ну смотри, схема стандартная. В подрозетник к выключателю где планируется использовать двойной выключатель заводят 3 провода. Первый скажем фаза вход (многие электрики кланы на снипы, госты и прочее и я часто встречал когда фаза идет напрямую на потребитель, а разрывают ноль), от выключателя на светильники идет по проводу после выключателя фаза. Ты отключил один, переведя его на ноль. Но выход у тебя то остался один провод. Как по нему ты управляешь двумя проводами? Стоп. Ты вообще отказался от 2-х источников света в таком раскладе? Но зачем тогда 2 реле? Или это уже фотки из дачного варианта?
Хоть по блубупу, хоть по вифи, хоть по инфраред, хоть по хлопку, хоть по касанию, хоть проведи рукой… И т.д.
У самого подобная лампа на ESP8266 -> wifi MQTT-> Raspberry Pi-> Xiaomi Gateway->Xiaomi Button
БП типа вашего у меня не пошел в силу очень «грязного» питания. Пульты с таким не работают нормально. Но и свой я покупал в районе бакса (б\у с разборки на али).
WI-FI предполагает смарт, который как раз не всегда под рукой — это раз. А во вторых, чтобы им воспользоваться — придется снять защиту, найти свое приложение, запустить его. Потом пальцем попасть в нужный значок. Проще встать и выключить свет вручную.
К тому же по WiFi можно и заливать новые скетчи через Arduino IDE.
Лично у меня ни одного пульта в доме нет.
10 пультов прошлый век, сейчас лучше использовать что то вроде Logitech Harmony или хотя бы Broadlink Universal IR Remote Controller.
Это да. Но есть вероятность, что ваш сосед у вас будет светом управлять (а вы у него)). А если я в отпуске при этом? Безопасность выше всего. Поэтому только ИК.
Такая вероятность равна 0, кнопка привязывается к конкретному шлюзу.
Спецификация ZigBee ориентирована на приложения, требующие гарантированной безопасной передачи данных при относительно небольших скоростях и возможности длительной работы сетевых устройств от автономных источников питания (батарей), она при малом энергопотреблении поддерживает не только простые топологии сети («точка-точка», «дерево» и «звезда»), но и самоорганизующуюся и самовосстанавливающуюся ячеистую (mesh) топологию с ретрансляцией и маршрутизацией сообщений.Wikipedia®
Свою лампу я могу прямо из отпуска включать через телеграмм или другим способом, имитируя нахождение дома, или наоборот выключить если забыл.
www.sparkfun.com/datasheets/Sensors/Temperature/MLX90614_rev001.pdf
У которого и температура сенсора самого показана, и 1х1 матрица с объективом:
youtu.be/0iNoJzhLny0
И луч направлен на взмах руки человека или просто теплого тела любого. Фиг знает сколько у него частота, написано 8Hz, но у их тепловизионного 32х24 (не болометр, а сегнетоэлектрический датчик, ну и стекло другое) есть и 64Hz режим при описании в некоторых местах в 8Hz, просто рост шума происходит существенный.
А тут инфракрасное в другом смысле. Ну, я уже отвык наводить пульт на приемник, пора использовать блютуз и прочее радио на 2.4.
P.S.: Для авторов раздела *Самоделки* предлагаю карантин сделать бессрочным..:))
-самым грамотным и толковым можно и без сохранения зарплаты(-они и на «муське»
заработают не меньше!)… ;-)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.