Предыдущая статья+коллектив муськовчан = управление светом с любого пульта как это должно быть )).
После публикации статьи об управлении светом в комнате с любых пультов было высказано немало критических замечаний и интересных мыслей об улучшении предложенной конструкции. Часть замечаний оказалась, несомненно, по существу и была проведена работа по модернизации.
Подведя итог коллективному обсуждению, я нарисовал новые основные черты идеального выключателя для себя.
1. Он должен работать с любого пульта в доме – это основное требование; 2. Выключатель должен работать и в обычном режиме, ибо, заходя в темную комнату, в руках пульта еще нет; 3. Решение от НООТЕХНИКИ, упомянутое uncle_sem и еще несколькими читателями, где длительное нажатие любой кнопки любого пульта инициирует выключатель, не подходит мне по причине необходимости иногда долго держать нажатыми кнопки увеличения/уменьшения громкости на телевизоре из-за зачастую огромной разницы в уровне звука в фильмах, скачанных с интернета. И еще, у меня активные колонки также управляются с пульта, и, значит, и там вылезет та же проблема. Это подтвердил опыт муськовчанина Lone. Но от самой идеи я кое-что взял на вооружение. 4. Выключатель должен быть обучаемым, это ценное предложение высказал пользователь Dimon_, предложив использовать мастер пульт, чтобы обучать выключатель без его демонтажа. Я пошел еще дальше, добавив от себя требование — без мастер пульта, без доп.кнопок и прочих приблуд, которые предложили некоторые муськовчане.
По другим конструктивным предложениям.
Заменять реле на твердотельное я не буду, так как смысла не вижу, хотя и заказал на Али такое для экспериментов. Спасибо за наводку пользователю serg_mur. Но те, кому нужно, могут применять и такое, в схеме ничего принципиально не меняется.
Схема
Схема не изменилась. Только по замечанию от kirich исправил в обозначении Grd на GND.
Про регулировку яркости смысла говорить нет, поскольку лампы накаливания не использую давно.
В выходной день я немного поправил скетч. Библиотеку EEPROM2.h брал тут.
Скетч
#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();
}
}
В самой схеме не менял ничего, хотя одна мысль о добавлении баззера появилась. Как теперь все работает?
Теперь собранная схема с новой прошивкой может обучаться с любого пульта. Для этого нужно последовательно нажать 3 разные кнопки на пульте и затем повторить эту процедуру еще 2 раза. Например, нажимаем кнопки ( 1, 2, 3) — (1, 2, 3) — ( 1, 2, 3). Набрать такую комбинацию случайно весьма проблематично, так что это аналог цифрового замка. После этого выключатель переходит в режим обучения. В данном скетче об этом сигнализирует светодиод, что присутствует на самой Ардуине, но логичнее будет включать баззер (пищалку), поскольку в закрытом выключателе именно сигнализация писком выглядит наиболее логичной. Баззер у меня был куплен ранее, брал здесь. Однако он оказался неисправным, поэтому я заказал на днях еще пару здесь, а пока обхожусь светодиодом.
Итак, как только выключатель перешел в режим обучения, достаем свои пульты и начинаем знакомство. Берем первый пульт и нажимаем кнопку, которую и назначаем ответственной за свет, затем следующий пульт и так далее. Можно, конечно, и на одном пульте назначить несколько кнопок. Закончить обучение можно, еще раз нажав последнюю назначенную кнопку. Тогда светодиод гаснет (пищалка молкнет) и выключатель переходит в обычный режим работы. Обучение закончится автоматически и при достижении максимального числа запомненных кнопок (в данном скетче 20). Коды пультов записываются в энергонезависимую память EEPROM, поэтому при отключении электричества все коды сохранятся.
Вот собственно и все. Сам выключатель также инвертирует состояние реле. Можно еще добавить управление не одной, а двумя группами ламп, (такое пожелание было высказано в личке), а в остальном, ИМХО, проект можно передавать в эксплуатацию. Или у кого-то еще будут интересные мысли?
Как это работает на видео:
Забыл здесь, правда пощелкать выключателем, но он так-же работает, как и в видео прошлой статьи.
P.S. Если у кого будут посты типа: весь этот функционал реализуется на гораздо меньшем количестве компонентов и гораздо проще, прошу сразу давать ссылочки на такую реализацию. Но при этом прошу не забывать, что в моей задаче выключатель еще и должен работать так же, как и ранее.
Планирую купить+40Добавить в избранноеОбзор понравился+28
+51
Ехал я тут в машине со включенным Яндекс-Навигатором. И начал коллеге что-то про Яндекс рассказывать. А в Я.Навигаторе «яндекс» — активирующее слово. Сделать-то он ничего не сделал, но поиск постоянно запускал. =)
Вторая серия и во второй раз уже не сдержался: Весь функционал можно сразу на wifi делать — esp8266 прекрасно обойдется и без ардуины. В проекте, на который ссылался я в обзоре есть и ir приемник и реле и управление через gpio. Т.е. ничего программировать не надо (ну почти — логику «шатного» выключателя наверное надо будет прописать в логический блок). Управление по wifi — бонусом. Там же — настройка и обновление прошивки. Еще в плюс — меньший размер (меньше микро и нано точно). Эх, знал бы, что klop пойдет на второй круг — отписался бы в первом обзоре — глядишь и круг бы оказался другим :)
ps Задумался… а не проще ли размещать девайс в плафоне люстры? Да и пультом целиться в выключаемое устройство логичнее, чем в выключатель… Надо будет обдумать такой вариант :)
За счёт потребления тока, через лампочку протекает небольшой паразитный ток, который вызывает моргание светодиодной лампы в выключенном состоянии дистанционного выключателя
«Как это сложно, Веничка...». Не могу браться за то, чего не понимаю. А это тот случай, увы. А если еще и со светодиодами проблемы ожидаются, то и нафик тогда…
как правильно сказал ksiman — второй вариант сильно лучше. думается, алгоритм перехода в режим обучения тоже неплох. разве что к питанию прикопаться можно — но тут уж ничего не поделаешь, особенно в смысле проблем со светодиодами…
короче от меня заслуженный плюс! ;)
А баззер точно не рабочий? А то я на свой тоже так думал, а он, оказалось, пищал, если на ножку ардуины к которой он подключён не high, а low посылать. Видимо, на баззаре транзистор не той системы стоит :-) может у вас тот же случай?
Для двуклавишного скетч чуток подправить, двойное реле поставить вместо одинарного. На схеме на Ардуине еще одна нога задействуется. А логика управления с пульта — это уж каждый решает, как лучше. Возможно, с пульта кому-то совсем не нужно второй группой ламп управлять, кому-то хочется 2 кнопки на пульте для раздельного независимого управления группами, а кому-то покажется проще одной кнопкой перебор состояний или временнАя комбинация.
У вас, судя по схеме, уже есть внешний подтягивающий резистор на 10К, причём к минусу (GND). А вы программно включаете внутренний подтягивающий резистор, который тянет к плюсу питания. Сопротивление внутреннего резистора достаточно велико и не влияет на работу, пока. Но лучше так не делать. Ну и для понимания на будущее.
А так отлично, у меня похоже сделано, в быту очень удобно оказалось.
ещё бы таймер отключения нагрузок сюда прикрутить — часа так на 2-4, вообще тогда супер было бы.
Вдруг так свет забыл выключить, а он сам потухнет по таймеру.
взял телефон, щелкнул, все выключилось
ps Задумался… а не проще ли размещать девайс в плафоне люстры? Да и пультом целиться в выключаемое устройство логичнее, чем в выключатель… Надо будет обдумать такой вариант :)
Вот
При этом не нужны будут БП и реле
3 вариант будет? :)
Но к сожалению, данная реализация плохо работает со светодиодными лампами :(
короче от меня заслуженный плюс! ;)
Не знаю как свернуть под спойлер. :-)
))
У вас, судя по схеме, уже есть внешний подтягивающий резистор на 10К, причём к минусу (GND). А вы программно включаете внутренний подтягивающий резистор, который тянет к плюсу питания. Сопротивление внутреннего резистора достаточно велико и не влияет на работу, пока. Но лучше так не делать. Ну и для понимания на будущее.
А так отлично, у меня похоже сделано, в быту очень удобно оказалось.
Если кто может подсказать — подскажите пожалуйста.
Вдруг так свет забыл выключить, а он сам потухнет по таймеру.