RSS блога
Подписка
Свет в комнате с любого пульта 2. Работа над ошибками
- Цена: $5-7
- Перейти в магазин
Краткий конспект.
Предыдущая статья+коллектив муськовчан = управление светом с любого пульта как это должно быть )).
После публикации статьи об управлении светом в комнате с любых пультов было высказано немало критических замечаний и интересных мыслей об улучшении предложенной конструкции. Часть замечаний оказалась, несомненно, по существу и была проведена работа по модернизации.
Подведя итог коллективному обсуждению, я нарисовал новые основные черты идеального выключателя для себя.
1. Он должен работать с любого пульта в доме – это основное требование;
2. Выключатель должен работать и в обычном режиме, ибо, заходя в темную комнату, в руках пульта еще нет;
3. Решение от НООТЕХНИКИ, упомянутое uncle_sem и еще несколькими читателями, где длительное нажатие любой кнопки любого пульта инициирует выключатель, не подходит мне по причине необходимости иногда долго держать нажатыми кнопки увеличения/уменьшения громкости на телевизоре из-за зачастую огромной разницы в уровне звука в фильмах, скачанных с интернета. И еще, у меня активные колонки также управляются с пульта, и, значит, и там вылезет та же проблема. Это подтвердил опыт муськовчанина Lone. Но от самой идеи я кое-что взял на вооружение.
4. Выключатель должен быть обучаемым, это ценное предложение высказал пользователь Dimon_, предложив использовать мастер пульт, чтобы обучать выключатель без его демонтажа. Я пошел еще дальше, добавив от себя требование — без мастер пульта, без доп.кнопок и прочих приблуд, которые предложили некоторые муськовчане.
По другим конструктивным предложениям.
Заменять реле на твердотельное я не буду, так как смысла не вижу, хотя и заказал на Али такое для экспериментов. Спасибо за наводку пользователю serg_mur. Но те, кому нужно, могут применять и такое, в схеме ничего принципиально не меняется.
Про регулировку яркости смысла говорить нет, поскольку лампы накаливания не использую давно.
В выходной день я немного поправил скетч. Библиотеку EEPROM2.h брал тут.
В самой схеме не менял ничего, хотя одна мысль о добавлении баззера появилась. Как теперь все работает?
Теперь собранная схема с новой прошивкой может обучаться с любого пульта. Для этого нужно последовательно нажать 3 разные кнопки на пульте и затем повторить эту процедуру еще 2 раза. Например, нажимаем кнопки ( 1, 2, 3) — (1, 2, 3) — ( 1, 2, 3). Набрать такую комбинацию случайно весьма проблематично, так что это аналог цифрового замка. После этого выключатель переходит в режим обучения. В данном скетче об этом сигнализирует светодиод, что присутствует на самой Ардуине, но логичнее будет включать баззер (пищалку), поскольку в закрытом выключателе именно сигнализация писком выглядит наиболее логичной. Баззер у меня был куплен ранее, брал здесь. Однако он оказался неисправным, поэтому я заказал на днях еще пару здесь, а пока обхожусь светодиодом.
Итак, как только выключатель перешел в режим обучения, достаем свои пульты и начинаем знакомство. Берем первый пульт и нажимаем кнопку, которую и назначаем ответственной за свет, затем следующий пульт и так далее. Можно, конечно, и на одном пульте назначить несколько кнопок. Закончить обучение можно, еще раз нажав последнюю назначенную кнопку. Тогда светодиод гаснет (пищалка молкнет) и выключатель переходит в обычный режим работы. Обучение закончится автоматически и при достижении максимального числа запомненных кнопок (в данном скетче 20). Коды пультов записываются в энергонезависимую память EEPROM, поэтому при отключении электричества все коды сохранятся.
Вот собственно и все. Сам выключатель также инвертирует состояние реле. Можно еще добавить управление не одной, а двумя группами ламп, (такое пожелание было высказано в личке), а в остальном, ИМХО, проект можно передавать в эксплуатацию. Или у кого-то еще будут интересные мысли?
Забыл здесь, правда пощелкать выключателем, но он так-же работает, как и в видео прошлой статьи.
P.S. Если у кого будут посты типа: весь этот функционал реализуется на гораздо меньшем количестве компонентов и гораздо проще, прошу сразу давать ссылочки на такую реализацию. Но при этом прошу не забывать, что в моей задаче выключатель еще и должен работать так же, как и ранее.
Предыдущая статья+коллектив муськовчан = управление светом с любого пульта как это должно быть )).
После публикации статьи об управлении светом в комнате с любых пультов было высказано немало критических замечаний и интересных мыслей об улучшении предложенной конструкции. Часть замечаний оказалась, несомненно, по существу и была проведена работа по модернизации.
Подведя итог коллективному обсуждению, я нарисовал новые основные черты идеального выключателя для себя.
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. Если у кого будут посты типа: весь этот функционал реализуется на гораздо меньшем количестве компонентов и гораздо проще, прошу сразу давать ссылочки на такую реализацию. Но при этом прошу не забывать, что в моей задаче выключатель еще и должен работать так же, как и ранее.
Самые обсуждаемые обзоры
+77 |
3911
147
|
+57 |
4064
72
|
взял телефон, щелкнул, все выключилось
ps Задумался… а не проще ли размещать девайс в плафоне люстры? Да и пультом целиться в выключаемое устройство логичнее, чем в выключатель… Надо будет обдумать такой вариант :)
Вот
При этом не нужны будут БП и реле
3 вариант будет? :)
Но к сожалению, данная реализация плохо работает со светодиодными лампами :(
короче от меня заслуженный плюс! ;)
Не знаю как свернуть под спойлер. :-)
))
У вас, судя по схеме, уже есть внешний подтягивающий резистор на 10К, причём к минусу (GND). А вы программно включаете внутренний подтягивающий резистор, который тянет к плюсу питания. Сопротивление внутреннего резистора достаточно велико и не влияет на работу, пока. Но лучше так не делать. Ну и для понимания на будущее.
А так отлично, у меня похоже сделано, в быту очень удобно оказалось.
Если кто может подсказать — подскажите пожалуйста.
Вдруг так свет забыл выключить, а он сам потухнет по таймеру.