Товары из Китая

Свет в комнате с любого пульта 2. Работа над ошибками


  • Цена: $5-7
  • Краткий конспект.

    Предыдущая статья+коллектив муськовчан = управление светом с любого пульта как это должно быть )).

    После публикации статьи об управлении светом в комнате с любых пультов было высказано немало критических замечаний и интересных мыслей об улучшении предложенной конструкции. Часть замечаний оказалась, несомненно, по существу и была проведена работа по модернизации.

    Подведя итог коллективному обсуждению, я нарисовал новые основные черты идеального выключателя для себя.

    1. Он должен работать с любого пульта в доме – это основное требование;

    2. Выключатель должен работать и в обычном режиме, ибо, заходя в темную комнату, в руках пульта еще нет;

    3. Решение от НООТЕХНИКИ, упомянутое uncle_sem и еще несколькими читателями, где длительное нажатие любой кнопки любого пульта инициирует выключатель, не подходит мне по причине необходимости иногда долго держать нажатыми кнопки увеличения/уменьшения громкости на телевизоре из-за зачастую огромной разницы в уровне звука в фильмах, скачанных с интернета. И еще, у меня активные колонки также управляются с пульта, и, значит, и там вылезет та же проблема. Это подтвердил опыт муськовчанина Lone. Но от самой идеи я кое-что взял на вооружение.

    4. Выключатель должен быть обучаемым, это ценное предложение высказал пользователь Dimon_, предложив использовать мастер пульт, чтобы обучать выключатель без его демонтажа. Я пошел еще дальше, добавив от себя требование — без мастер пульта, без доп.кнопок и прочих приблуд, которые предложили некоторые муськовчане.

    По другим конструктивным предложениям.

    Заменять реле на твердотельное я не буду, так как смысла не вижу, хотя и заказал на Али такое для экспериментов. Спасибо за наводку пользователю serg_mur. Но те, кому нужно, могут применять и такое, в схеме ничего принципиально не меняется.

    Схема
    Схема не изменилась. Только по замечанию от kirich исправил в обозначении Grd на GND.

    Свет в комнате с любого пульта 2. Работа над ошибками

    Про регулировку яркости смысла говорить нет, поскольку лампы накаливания не использую давно.

    В выходной день я немного поправил скетч. Библиотеку 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. Если у кого будут посты типа: весь этот функционал реализуется на гораздо меньшем количестве компонентов и гораздо проще, прошу сразу давать ссылочки на такую реализацию. Но при этом прошу не забывать, что в моей задаче выключатель еще и должен работать так же, как и ранее.


СМОТРИ ТАКЖЕ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *