Z-Wave LED контроллер с энкодером. Z-Uno + MOSFET + Encoder +18





В комнате где играет ребенок я установил дополнительную подсветку в виде LED ленты. Изначально я планировал, что буду управлять яркостью ленты, это удобно для настройки ночной подсветки. У меня уже был Z-Wave диммер на 220В, поэтому дешевле было докупить диммируемый трансформатор на 12В за 1000р, чем специальный RGBW контроллер от Fibaro за 5500р.

Это решение работает, но есть минусы:

  • Задержка при диммировании
  • Нельзя установить очень маленький уровень яркости

Спустя год использования, я решил изготовить свой Z-Wave LED контроллер, но с энкодером и в корпусе от диммера, для установки в подрозетник.

Принципиальная схема устройства элементарна, к Z-Uno напрямую подключается энкодер 3-мя пинами: пин A, пин B и кнопка. Мосфет подключается к PWM пину.



Материалы и цены:
Материал Фото Цена
1 Z-Wave плата Z-Uno 3500 р
2 MOSFET IRLR8729 27 р
3 Encoder EC11 50 р

Z-Wave плата Z-Uno программируется в среде Arduino, скетч для обработки сигналов от энкодера и управления мосфетом занимает всего 143 строчки кода с комментариями. Скетч работает следующим образом:

Каждые 128 мкс по прерыванию от таймера проверяем, в какую сторону крутят колесико, от дребезга защищаемся 4-х кратной проверкой состояния. В лупе проверяем нажатие кнопки, при каждом нажатии выключаем ленту или включаем на предыдущий уровень яркости. Яркость можно задавать как с энкодера, так и с телефона или другого Z-Wave выключателя.



Код Rotary Dimmer LED Control
#define PUSH_BUTTON       23
#define ENCODER_CHA_PIN   19
#define ENCODER_CHB_PIN   20
#define LEV_SHIFT         8
#define ENCODER_DEBONCE   4
#define STATE_IDLE       0xFF
#define STATE_SKIP       0xFE

ZUNO_SETUP_ISR_GPTIMER(gpt_handler);
ZUNO_SETUP_CHANNELS(ZUNO_SWITCH_MULTILEVEL(getter, setter));

byte level = 0;
byte last_reported_level = 0;
byte g_state = STATE_IDLE;
byte g_pins  = 0;
byte g_debounce_time = 0;
byte last_push_button_state = HIGH;
byte stored_level = 0;
dword last_level_changed_time = 0;

// Runs every 128 ?s
void gpt_handler() {
      byte pins = 0;
      pins = !digitalRead(ENCODER_CHA_PIN);
      if(!digitalRead(ENCODER_CHB_PIN))
        pins |= 2;

      if(g_pins == pins) {
          // Is the state stable?
          g_debounce_time++;
          if(g_debounce_time>ENCODER_DEBONCE) {
              if(g_state == STATE_IDLE) {
                  g_state = pins;
              }
              else if(g_state == STATE_SKIP) {
                   if(pins == 0)
                     g_state = 0;
              }
              else {
                  if((g_state == 0 && pins == 1) ||
                     (g_state == 1 && pins == 3) ||
                     (g_state == 3 && pins == 2) ||
                     (g_state == 2 && pins == 0) ) {
                        if (level < 39) {
                            level++;
                        }
                        else if ((level + LEV_SHIFT) <= 255) {
                            level += LEV_SHIFT;
                        }
                        else if ((level + LEV_SHIFT) > 255){
                            level = 255;  
                        }
                  }
                  else
                  if((g_state == 0 && pins == 2) ||
                     (g_state == 2 && pins == 3) ||
                     (g_state == 3 && pins == 1) ||
                     (g_state == 1 && pins == 0) ) {
                        if (level <= 39 && level !=0) {
                          level--;
                        }
                        else if (level >= LEV_SHIFT) {
                          level -= LEV_SHIFT;
                        }
                        else if (level < 0) {
                          level = 0;
                        }
                  }
                    
                  if(g_state != pins)    
                    g_state = STATE_SKIP;
              }
              g_debounce_time = 0;
          }  
      }
      else {
          g_debounce_time = 0;
      }
      g_pins = pins;
}

void setup() {
    Serial.begin();
    pinMode(PUSH_BUTTON, INPUT_PULLUP);
    pinMode(ENCODER_CHA_PIN, INPUT);
    pinMode(ENCODER_CHB_PIN, INPUT_PULLUP);

    zunoGPTInit(ZUNO_GPT_SCALE1024|ZUNO_GPT_CYCLIC); // 32 MHz/1024 = 31.25 kHz (tick is 32 ?s)
    zunoGPTSet(4); // 32 ?s * 4 = 128 ?s
    zunoGPTEnable(1);
}

void loop() {
    // Do we need to report the level?
    if(last_reported_level != level) {
        if (level > 0) {
          stored_level = level; 
        }
        last_reported_level = level;
        analogWrite(PWM1, level);
        last_level_changed_time = millis();
        
        Serial.print("Level: ");
        Serial.println(level);
    }

    // Button handler
    byte current_push_button_state = digitalRead(PUSH_BUTTON);
    if (current_push_button_state != last_push_button_state) {
        last_push_button_state = current_push_button_state;
        // if button pressed
        if (last_push_button_state == LOW) {
            // if LED turned ON, turn OFF   
            if (level > 0) {
                analogWrite(PWM1, 0);
                level = 0;  
            }
            // Restore last level
            else {
                analogWrite(PWM1, stored_level);
                level = stored_level;
            }
        }
    }

    // Send report if 2 seconds level not changed
    if (last_level_changed_time && millis() > last_level_changed_time + 2000) {
        last_level_changed_time = 0;
        zunoSendReport(1); 
    }
}

void setter(byte value) {
    if (value > 99) {
      value = 99;
    }
    level = (long)value * 255 / 99;
    analogWrite(PWM1, level);
}

byte getter(void) {
  return last_reported_level * 99 / 255;
}


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



Для нового Z-Wave LED контроллера я модифицировал корпус диммера — просверлил отверстие для энкодера и немного поменял крепление рамки, чтобы использовать рамку от другого выключателя. За дизайн не пинайте, делал из подручных материалов. Можно использовать и готовый корпус от обычного диммера, чтобы выглядело эстетично.



ЛУТ решает! Для изготовления единичного экземпляра платы, лучше ЛУТА я не знаю технологии, поэтому изготовил 2 платы, которые идеально помещаются в корпусе старого диммера. В нижней части находится Z-Uno, мосфет и колодка для подключения питания и ленты, кстати мосфет рассчитан на напряжения до 30В, поэтому ленту можно использовать, как 12В, так и 24В, без радиатора ток лучше не превышать более 5А.



В верхней части расположен только энкодер.



Соединив бутерброд из плат и поместив его в корпус, получился Z-Wave LED контроллер.



На данный момент Z-Wave LED контроллер не установлен в подрозетник и лежит на тумбе под телевизор. Некоторое время еще потестирую работу.



Но уже сейчас удобство управления LED лентой сильно повысилось, при управлении с колесика или прикроватного выключателя яркость изменяется мгновенно. В Z-Wave шкала диммирования находится в диапазоне от 0 до 99, с помощью колесика можно выбрать уровень яркости от 0 до 255. При вращении на 1 деление после 0 светодиоды чуть светят, ночью это никого не разбудит, но поможет не наступать на случайно забытый кубик LEGO на полу.

На изготовление устройства ушло 3 вечера, 1 вечер — написание прошивки, 1 вечер ЛУТ, 1 вечер работа напильником.

ОБНОВЛЕНО 21.01.2018
Есть несколько идей по доработке дизайна, хотел бы комментарии получить.
Идея 1. На алике закажу готовый красивый диммер со стеклянной панелью и заменю начинку, с этим я справлюсь.
Идея 2. Использовать крутилку с дисплеем как у климат контроля в машине, на дисплее будет отображаться текущей уровень яркости. Проблема в том, что не могу найти крутилку с дисплеем отдельно от климат контроля.

Вы можете помочь и перевести немного средств на развитие сайта



Комментарии (56):

  1. vconst
    /#10555939

    Ленту наклеили прямо на обои?

    Эх… Хотел я сделать управление лентами на Ардуино, но забуксовал на диммировании большой мощности и плюнул. В итоге купил готовые диммера, но цены на них конские :(

    • aivs
      /#10555953

      Лента наклеена на потолочный бордюр, смотрит вниз, думал рассеиватель добавить, но не захотел терять в яркости.

      • vconst
        /#10555963

        Не отваливается, не отгорает? Греется не сильно?

        Я не рискнул клеить ленты просто так, без теплоотвода, но у меня на них основное освещение сделано.

        • aivs
          /#10555977

          Больше года назад клеил, горит по 8 часов в день. Не греется, она же открытая, чего ей греться. Как приклеил, так и забыл.

          • vconst
            /#10555987

            Мои ленты жрут почти 300 ватт… Без радиатора стремно.

            • aivs
              /#10556007

              Эта лента 4.5м жрет 30Вт.

              • vconst
                /#10556019

                Тогда да, можно вообще не париться.

                • Popadanec
                  /#10556605

                  А как вы решили вопрос отвода излишков тепла.

                  • vconst
                    /#10556609

                    Приклеил их на алюминиевые уголки.

                  • GennPen
                    /#10557143

                    Тоже делал освещение(рассеянное от потолка), в целом при максимальной нагрузке вышло около 400 Вт. Две полосы на алюминиевом профиле, который отлично рассеивает тепло.

                    • Danov
                      /#10561985

                      Это на какую площадь комнаты?

                      • GennPen
                        /#10562549

                        Комната около 20 кв.м., периметр около 18 м.
                        Изначально попробовал RGB-ленту, примерно 12 Вт/м, вышло около 200 Вт на максимуме, но не понравился ее белый оттенок, поэтому добавил белую ленту. В итоге если их обе включать на полную — потребляют около 400 Вт, но обе одновременно я не включаю, в контроллере поставил ограничение в 200Вт.

              • saggy
                /#10559651

                Лента запитана с одной стороны? Потери яркости не наблюдается в конце ленты?

                • aivs
                  /#10559655

                  на 5 метрах не чувствуется потерь

  2. An_private
    /#10555945

    > RGBW контроллер
    Судя по всего одному ключу — это одноканальный контроллер, а не RGBW — нет возможности регулировать отдельные цветовые компоненты

  3. aivs
    /#10555957

    Правильно, исправил

  4. ClearAirTurbulence
    /#10556195

    Спасибо, довольно интересно. В особенности ссылка на энкодер.
    1. Интересено, сложно ли сделать полноченный RGB контроллер с панелью управления с тремя энкодерами HLS (Hue Luminance Saturation)… Китайские достали невозможностью по-людски задать цвет.
    2. Голая лента такая голая… Надеюсь, CRI у нее человеческий.

    • allcreater
      /#10556353

      Да почти то же самое получится, что в этой статье, только больше контролов будет(если Вы хотите управлять и H, и L, и S), ну и три транзистора, по одному на канал. Нужно только найти формулу перевода из HSL в RGB, а дальше — как везде.

    • GennPen
      /#10557163

      Если и делать, то делать в RGBW. Т.к. добиваться белый (или похожий) оттенок на китайских RGB лентах — это тихий ужас.
      Когда начинал делать освещение в комнате, то думал обойдусь обычной RGB-лентой, но в итоге сильно разочаровался, заказал белую ленту и на ардуине сделал контроллер HSL->RGBW

      • ClearAirTurbulence
        /#10557849

        Спасибо за совет, я в курсе :)
        Если нужен W, вопросов нет, конечно, нужна RGBW лента. Более того, даже дорогие премиум-ленты без W смешением RGB нормального белого не смогут дать, это данность.

        А у вас именно HSL-контроллер? Как управление реализовано — тремя энкодерами, или есть какие-нибудь хитрости, типа запоминания-восстановления понравившихся цветов через пресеты?

        • GennPen
          /#10557911

          А у вас именно HSL-контроллер?
          Самодельный, для кодирования цвета — два линейных переменных резистора — L- и S- (яркость и насыщенность) а енкодером — H-канал (цвет).

          • ClearAirTurbulence
            /#10558671

            Если не секрет, с чем связано такое решение?
            Почему не три ротационных энкодера, или не три резистора?

            • GennPen
              /#10558693

              Яркость и насыщенность привычней регулировать от нуля(нижнее положение) до максимума(верхнее положение). А у канала цвета нет «нуля», по сути он и выбирается по круговой шкале, поэтому и решил делать енкодером, который можно крутить в любую сторону на любой угол.

              • ClearAirTurbulence
                /#10558997

                Тогда еще вопрос: резисторы нормально служат? И какие использованы? А то некоторые хлипкие, и некоторые сомнения в их долговечности и точности… Хотелось бы линейный энкодер, но те, что я находил, имеют весьма странные ценники (может, плохо искал).

  5. aivs
    /#10556219

    Не вижу сложности, если один энкодер прекрасно работает, то и 3 будут. Плюс, всегда есть возможность задать точный уровень с помощью Z-Wave контроллера.
    Если бы планировал ремонт, то и нишу под ленту продумал. А в моем случае нужно было дополнительное освещение без больших затрат.

    • vconst
      /#10556289

      Если бы планировал ремонт, то и нишу под ленту продумал.
      Как раз пишу статью про освещение лентами, накатал уже 7 страниц, а до монтажа еще не дошел %)
      Я приделал на стену алюминиевые уголки. Минимальные вмешательства в интерьер, времени отнимает немного, сделать просто. Рекомендую.

  6. allcreater
    /#10556349

    Хмм, что за адский ужас творится с ценами на электронику с поддержкой ZWave, ZigBee и иже с ними? Вроде бы протоколы задуманы для соединения кучи мелких и в теории недорогих устройств, а получаем то, что есть.
    Никто не подскажет, есть ли что-то подобное и менее дорогое? 3500 за хорошее устройство не жалко, но не стоит ведь того такая ардуинка. С другой стороны, есть те же ESP32, но идеологически не очень пригодны для умного дома, управлять с WiFi розетками — это какой-то уж очень оверкилл.

    Извините за оффтоп, давно пригорает :(

    • aivs
      /#10556381

      Да, у многих пригорает, но таков рынок Z-Wave. Хочешь готовое решение быстро — плати деньги, нет — иди разрабатывай свой протокол на wi-fi или nfr ни с кем не совместимый.
      Хотелось бы, чтобы Z-Uno стоило на порядок дешевле. Но производитель не спешит с снижением цены.
      В мире Z-Wave только Z-Uno позволяет разрабатывать пользователям свои уникальные устройства. Был один аналог, но давно про него не слышно.

    • vasimv
      /#10556385

      Потому что все кушать хотят, лицензии на эти протоколы стоят дорого. В результате — нет ни разработчиков, ни производителей. Думаю, не сильно ошибусь с прогнозом, если скажу что все эти протоколы постепенно умрут. Так что WiFi на сегодняшний день — самое оптимальное. Появится еще какой-нибудь WiFi LE, так вообще будет идеально.

      • aivs
        /#10556395

        Ошибаетесь на счет «умрут». Месяц назад Silicon Labs — производитель в том числе и ZigBee чипов купила Sigma Designs — производителя чипов и владельца лицензий Z-Wave.
        Эти протоколы только набираю обороты, сейчас в очень сильной компании.

        • vasimv
          /#10556417

          Ну, это мое личное мнение. То что один производитель покупает производителя конкурирующего протокола — скорее признак как раз близкой смерти. WiFi и Bluetooth уже прочно обосновались на этом рынке, пользователям совершенно не захочется ставить еще какие-то гейты wifi<->z-wave, когда можно просто купить девайс с wifi и управлять с телефона. Потеряли эти z* слишком много времени из-за своей жадности.

        • vp7
          /#10556593

          Был такой обалденный стандарт — FireWire.
          Пользовался им почти 10 лет назад, была и видео-камера и внешний HDD.
          Для своего времени он совершил прорыв, существенно обходил USB 2.0 (позволял передавать данные с гарантированной задержкой) и многое и многое.

          Но одна единственная ошибка с лицензированием поставила на нём жирный крест.
          ZigBee/Z-Wave действительно может завоевать мир, если оптовая стоимость конечного модуля будет в пределах $1-2, а в обыкновенной квартире будет по 20+ устройств, поддерживающих такой стандарт.

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

    • telobezumnoe
      /#10557169

      а что сложного выделить отельную вайфай сеть для них, поставить отдельно mqtt сервер на роутер и пользоваться? у меня дома уже с год работает насколько контроллеров… и никаких проблем с передачей данных пока не выявлено. та же лента rgb прекрасно диммируется и меняются цвета с телефона, более того с телефона на все это прикрутил голосовое управление. то же самое с zwave тем более за такие деньги это не получится

    • dernuss
      /#10557489 / -1

      есть те же ESP32
      А есть esp8266 и esp8265. Дешего и сердито.

      • allcreater
        /#10557677

        Есть, конечно! Разумеется, они ещё бюджетнее, но, положим, даже монструозный(в плане избыточных возможностей) ESP32 у официальных поставщиков стоят всего 300р за модуль, что больше чем на порядок дешевле, чем описанные в статье Z-Wave модули, а, во-вторых, у новых SoC уже есть Bluetooth/BLE, что лично мне кажется более перспективной заменой вайфая. Может, я и извращенец, но этот стек кажется более подходящим для управления небольшими устройствами.

        • aivs
          /#10557691

          ESP32 не может работать от батарейки, BLE может. Для любителей BLE производитель Z-Wave устройств Fibaro выпускает и BLE версии с HomeKit
          https://homekit.fibaro.com/

        • dernuss
          /#10557981

          А как же управление через интернет?

          • allcreater
            /#10558053

            Ну, задумывалось так, что BLE/Bluetooth устройства общаются с хабом или между собой(ходят слухи, что BLE теоретически может в ячеистую топологию, но лично я ещё не разбирался, что для этого нужно и возможно ли вообще), а дальше уже интернеты.

            Прямое управление по вайфаю в этом плане звучит вроде бы логично, маршрутизация и настройка подсетей в этом случае определяется роутером, но не хочется засорять все доступные частоты сигналом от кучи устройств. Может быть, мои беспокойства напрасны. Если это действительно не мешает соседям и не снижает скорость в собственной сети до минимальной из поддерживаемых клиентами — тогда, наверное, пригодно.

            • dernuss
              /#10558883

              Если честно то я слабо представляю Bluetooth устройства типа диммеров и прочих, так как 1) мощность Bluetooth очень мала. Фактически радиус одна комната, 2) уж как то сложно спаривать Bluetooth устройства, 3) Нужен ещё хаб

              Если с хабом, тогда уж лучше либо сделать самому свой аналог z-wave, на каких нибудь si4432 недорогих и esp. Или копить деньги или ждать снижения цены на z-wave или аналоги.

              Насчет засорять сигналом, для частных домов wifi вариант точно подходит, насчет квартир в многоэтажных домах — не знаю. Но такие устройства не качают торренты. Так что тоже не думаю что будут проблемы.

    • DmitrySpb79
      /#10560129

      > Хмм, что за адский ужас творится с ценами на электронику с поддержкой ZWave, ZigBee и иже с ними?

      На самом деле, нет никакого адского ужаса — просто все эти товары не рассчитаны на российский рынок.

      К примеру Philips Hue в России практически не встречаются, а в Голландских магазинах они везде в электротоварах лежат. Просто 30Евро за лампочку для России это «ужас-ужас», а в Голландии это 3 раза на электричке до работы и обратно доехать.

      • aivs
        /#10560545

        Откуда такая оценка российского рынка, если вам дорого лампочка за 30$ с радиоуправлением, значит она вам не нужна.

        • DmitrySpb79
          /#10560617

          Я думаю, в России за такую цену она многим не нужна :) Искал я как-то выключатель с диммером именно под Hue в Питере, не нашел (сейчас может уже появились, не знаю, было год назад). Аналогично было с датчиками движения.

  7. aivs
    /#10556421

    Да не, бред

  8. kaplson
    /#10557173

    Круглая светодиодная люстра с пультом, умеющая светить теплым, холодным, ярким, слабым, с режимом ночной подсветки (1Вт) и имитацией заката солнца стоит 4-5 тысяч рублей (а за 6 умеет светить любым цветом).

    • aivs
      /#10557175

      Тут про умный дом, а люстра только с одного пульта управляется

      • rustavelli
        /#10557297

        от xiaomi светильник за $60 через wifi управляется. Цена на эти zwave запредельная.

      • kaplson
        /#10557345

        То, что я увидел на фотографии, на умный дом не похоже.

        • aivs
          /#10557363

          Там между фоток еще немного текста есть, где рассказывается, что лента управляется не только с энкодера, но и с телефона и с выключателя при входе, и с прикроватного выключателя. Можете почитать мои предыдущие статьи, там много про обустройство моей домашней автоматизации.


      • Igrek_L
        /#10557459

        Если речь об Estаres то пульт там на 433 МГц, кодировка довольно легко снифится, после чего управление доступно не только с пульта но из «Умного дома». У меня два таких светильника, оба успешно заведены в Domoticz посредством broadlink_а.

        • aivs
          /#10557467

          А вот если с пульта поуправлять то в Domoticz это видно, обратная связь есть?

          • Igrek_L
            /#10559597

            Не пользуюсь больше родными пультами, все управляется сейчас из Domoticz

  9. kolayuk
    /#10557217

    Как корпус делали? 3D принтер или что то более доступное для простых смертных?

    • aivs
      /#10557239

      Сверло и напильник, курпус то был от диммера.

  10. Igrek_L
    /#10561243

    Есть несколько идей по доработке дизайна, хотел бы комментарии получить.
    ...

    По моему мнению «крутилка» ломает дизайн и удобства. По сути в том или ином варианте использования (день/ночь/игра/...) выставляется вполне определенный уровень подсветки + включаются/выключаются дополнительные источники света. То есть сцены. Сцены удобны и не требуют крутилок. Несколько режимов с привязкой ко времени суток/активности гораздо удобней. Переключать между ними можно обычными кнопками или голосом, жестами, да чем угодно!
    Кстати, за сопоставимые деньги можно приобрести ленту с ws8212 и управлять яркостью/цветом каждого диодика в ленте. Несложным Easy ESP например. У меня так сделана ночная подсветка в коридоре и имитация рассвета/заката в комнате сына. Попутно по люстре можно определять время. :) Зеленым диодикомком она показывает на часы, а красным минуты. Особенно удобно утром на работу выходить.