Беспроводное оборудование nooLite и Умный дом (часть 1). Arduino

в 9:25, , рубрики: AMS, arduino, Arduino Mega Server, DIY, diy или сделай сам, IoT, noolite, Беспроводные технологии, Железо, Интернет вещей, сделай сам, сеть, умный дом

nooLite

Здравствуйте уважаемые читатели Geektimes! На этот раз я хочу представить вашему вниманию цикл статей об интеграции беспроводного оборудования nooLite в системы домашней автоматизации. Этот цикл будет похож на уже вышедшую серию статей (раз, два, три) об интеграции модулей Laurent в системы Умного дома, только рассказываться в нём будет о системе nooLite и после прочтения этого цикла у вас не останется вопросов по управлению приборами nooLite из вашего Умного дома.

О цикле статей

Цикл разбит на три части. В первой части вы узнаете о принципах работы беспроводного оборудования nooLite и организации управления им из ваших проектов на Arduino. Во второй части будет подробно рассказано об интеграции управляющего модуля MT1132 в Arduino Mega Server и об открывающихся в связи с этим возможностях по управлению Умным домом. А третья статья цикла будет повещена очень интересной теме — концепции создания приборов «100 в 1» на основе Arduino Mega Server. Будет подробно разобран пример создания беспроводной паяльной станции на AMS буквально из ничего — на основе всего одного беспроводного димера nooLite.

Кстати, паяльная станция, о которой пойдёт речь в третьей статье, уже присутствует в последней сборке Arduino Mega Server под номером 0.14. И самые любопытные читатели могут не дожидаться третьей статьи, а сразу скачать дистрибутив и самостоятельно разобраться с тем, как всё это работает.

паяльная станция

И самое замечательное, что таких приборов в AMS может находиться сотни, причём одновременно. Например, паяльная станция, метеостанция, охранный блок, контроллер оранжереи и т. д. И работать всё это может одновременно или «запускаться» загрузкой веб-странички или даже целого сайта, посвящённого конкретному устройству.

Но не будем забегать вперёд, само интересное оставим напоследок, а пока займёмся необходимой теоретической подготовкой. Обещаю, что всё будет изложено самым простым и доходчивым образом. Итак, начнём.

Оборудование nooLite

Оборудование nooLite это уже известная и популярная система и в Интернет довольно много информации о ней. Я постараюсь здесь кратко изложить основные моменты.

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

Есть ещё беспроводные датчики, управление приборами со смартфона и многое другое, но в одной статье всё охватить невозможно, здесь мы сосредоточимся только на интеграции nooLite с популярной платформой DIY — Arduino.

Из всего обширного спектра оборудования nooLite нас будет интересовать управляющий модуль MT1132 потому, что он рассчитан на подключение к Arduino и одноплатным компьютерам типа Raspberry Pi. И работает он по простому последовательному интерфейсу. Забегая немного вперёд, скажу, что модуль мне понравился своей простотой, предсказуемостью и надёжной работой. И я смог по достоинству оценить эти качества после месяца бесплодной борьбы с сетевым модулем на чипе W5500, который так и не пожелал нормально работать.

модуль MT1132

И особенно мне понравилось то, что (не считая питания) модуль подключается к Arduino всего одним (!) проводом (RX). Второй (TX) можно вообще не подключать. Модуль «односторонний», т. е. рассчитан только на посылку управляющих сигналов. В планах компании «Ноотехника» разработка и выпуск «двухсторонней» версии модуля.

SU111-300

Второй нужный нам элемент из оборудования nooLite — это силовой управляющий блок, например, SU111-300. Подключение блока элементарно и видно на иллюстрации. Два провода подключаются к сети 220 вольт, а два других — к нагрузке. Единственное, на что хотелось бы обратить внимание, это то, что модули поставляются с перемычкой, которая блокирует режим димирования и, если вы хотите регулировать мощность, то нужно разрезать эту перемычку (и не забыть заизолировать образовавшиеся оголённые провода).

PU311-2

На пультах я особо останавливаться не буду потому, что это «ручное» управление, а нас, в связи с автоматизацией, больше интересует автоматическое. Скажу только, что эксперименты проводились с пультом PU311-2, выполненным в виде настенного выключателя и он показал себя самым наилучшим образом, то есть чётко и без сбоев включал и выключал свет. Чем, собственно, хорошее оборудование и отличается от плохого — хорошее просто не замечаешь.

Концепция работы. «Привязка» и «Отвязка»

Прежде, чем вы сможете включать и выключать электроприборы при помощи системы nooLite, вам нужно «связать» управляющие модули с соответствующими силовыми блоками. Это делается при помощи процедуры т. н. «привязки» и «отвязки», подробно описанной в документации nooLite. Вкратце, всё сводится к нажатию пары кнопок на связываемых блоках и не представляет каких-либо трудностей.

В случае, когда вместо пульта используется управляющий модуль MT1132, процедура происходит несколько иным способом. А именно: поскольку у модуля нет кнопок, то нужно программным способом сформировать и послать управляющую команду на нужном канале, а после этого уже нажать кнопку на силовом блоке, подтверждая «привязку» или «отвязку».

Каналы — это «линии управления» и в модуле MT1132 их 32, о чём свидетельствуют две последние цифры в названии. Это значит, что при помощи этого модуля вы можете управлять 32 отдельными группами оборудования, что более чем достаточно для квартиры или небольшого дома. Если у вас большой дом, то модули могут работать в связке и масштабироваться на любое количество каналов.

Описание протокола

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

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

Тестовые команды

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

  • Привязка
  • Отвязка
  • Включение
  • Выключение
  • Установка мощности (димирование)

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

Подключение модуля MT1132

Как я уже сказал, подключение модуля MT1132 производится буквально одним проводом (кроме питания). Питаться модуль может как от напряжения 5 вольт, так и от напряжения 3.3 вольт. Поэтому не возникло никаких проблем с подключением ни к 5-вольтовой Arduino Mega, ни к 3.3-вольтовой Arduino Due. Единственный момент заключается в том, что при пониженном питании снижается дальность уверенной работы системы. И это нужно учитывать, если вы хотите питать модуль от напряжения 3.3 вольт.

Arduino

На модуле есть выводы RX и TX для приёма и посылки сигналов по последовательному интерфейсу. Критичным для работы модуля является подключение RX, для приёма управляющих команд от контроллера. Соответственно, контакт RX на стороне модуля соединяется с контактом TX (18) на стороне Arduino. Эта распиновка справедлива как для Arduino Mega, так и для Arduino Due.

Программная часть

Теперь давайте разберёмся с тем, как управлять всем этим хозяйством из скетчей на Ардуино. Сначала инициализируем Serial1, к которому мы подключили модуль МТ1132 (делается это на стандартной частоте 9600):

Serial1.begin(9600);

Теперь код главной управляющей функции:

void nooSendCommand(byte channel, byte command, byte data, byte format) {
  byte buf[12];

  for (byte i = 0; i < 12; i++) {
    buf[i] = 0;
  }

  buf[0] = 85;
  buf[1] = B01010000;
  buf[2] = command;
  buf[3] = format;
  buf[5] = channel;
  buf[6] = data;

  int checkSum = 0;
  for (byte i = 0; i < 10; i++) {
    checkSum += buf[i];
  }

  buf[10] = lowByte(checkSum);
  buf[11] = 170;

  for (byte i = 0; i < (12); i++) {
    Serial1.write(buf[i]);
  }
}

В принципе, нам даже не нужно знать как она работает, мы её можем использовать в режиме «чёрного ящика» или своеобразного API, у которого наружу «торчит» определённый интерфейс. Нам достаточно только знать, как пользоваться этим интерфейсом.

Как видите, там всего четыре параметра — канал, команда, данные и формат. По какому принципу формировать запросы к этому API, можно прочитать в вышеупомянутом документе, мы же ещё больше упростим себе задачу и обернём этот интерфейс в простые команды управления приборами nooLite.

void nooBind  (byte ch)         {nooSendCommand(ch, 15, 0, 0);}
void nooUnbind(byte ch)         {nooSendCommand(ch,  9, 0, 0);}
void nooOn    (byte ch)         {nooSendCommand(ch,  2, 0, 0);}
void nooOff   (byte ch)         {nooSendCommand(ch,  0, 0, 0);}
void nooValue (byte ch, byte v) {nooSendCommand(ch,  6, v, 1);}

Относительно сложной командой является только последняя, там, кроме канала, задаётся ещё и уровень мощности. В скетче есть ещё команды, на которых мы сейчас не будем останавливаться, но формируются они так же просто.

Собственно… всё! Проще некуда. В коде управляющие команды выглядят так:

nooBind(ch);
nooUnbind(ch);
nooOn(ch);
nooOff(ch);
nooValue(ch, v);

Теперь давайте на практике потренируемся в управлении силовым модулем nooLite. Итак, привязываем силовой блок на нулевом канале:

nooBind(0);

На силовом блоке начинает мигать светодиод. Нажимаем кнопку на блоке — светодиод перестаёт мигать — силовой блок привязан. Вместо нулевого канала можно использовать любой другой. И вы можете легко формировать номер канала в коде скетча в соответствии с вашими потребностями.

Включаем лампу (если мы привязали лампу на нулевом канале, то и команды для неё нужно посылать на этом канале):

nooOn(0);

Устанавливаем мощность (яркость свечения лампы):

nooValue(0, 100);

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

Вот (на всякий случай) формула, которая транслирует «стандартные» значения от 0 до 100 в формат, понимаемый модулем nooLite:

v = x * 1.2 + 34;

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

Выключаем прибор:

nooOff(0);

Отвязываем:

nooBind(0);

На силовом блоке начинает мигать светодиод. Подтверждаем отвязку, нажимая кнопку на силовом блоке. Всё, теперь силовой блок перестал реагировать на наши команды и мы можем «привязать» его снова на любом из 32 каналов модуля nooLite MT1132.

Вот полный текст скетча.

Полный код скетча

byte const PIN_TX = 18; // TX PIN (to RX noolite)
byte const PIN_RX = 19; // RX PIN (to TX noolite)

void nooSendCommand(byte channel, byte command, byte data, byte format) {
byte buf[12];

for (byte i = 0; i < 12; i++) {
buf[i] = 0;
}

buf[0] = 85;
buf[1] = B01010000;
buf[2] = command;
buf[3] = format;
buf[5] = channel;
buf[6] = data;

int checkSum = 0;
for (byte i = 0; i < 10; i++) {
checkSum += buf[i];
}

buf[10] = lowByte(checkSum);
buf[11] = 170;

for (byte i = 0; i < (12); i++) {
Serial1.write(buf[i]);
}
}

void nooBind (byte ch) {nooSendCommand(ch, 15, 0, 0);}
void nooUnbind (byte ch) {nooSendCommand(ch, 9, 0, 0);}

void nooOn (byte ch) {nooSendCommand(ch, 2, 0, 0);}
void nooOff (byte ch) {nooSendCommand(ch, 0, 0, 0);}
void nooTrigger(byte ch) {nooSendCommand(ch, 4, 0, 0);}
void nooCancel (byte ch) {nooSendCommand(ch, 10, 0, 0);}

void nooUp (byte ch) {nooSendCommand(ch, 3, 0, 0);}
void nooDown (byte ch) {nooSendCommand(ch, 1, 0, 0);}
void nooRevers (byte ch) {nooSendCommand(ch, 5, 0, 0);}

void nooValue (byte ch, byte v) {nooSendCommand(ch, 6, v, 1);}

void setup() {
Serial1.begin(9600);

/* Используем любую нужную команду единовременно
или пишем свой код в loop(), используя эти команды */

//nooBind(0);

//nooOn(0);
//nooOff(0);
//nooValue(0, 100);

//nooUnbind(0);
}

void loop(){

}

Промежуточный итог

Как вы видите, в управлении силовыми модулями nooLite при помощи Arduino нет ничего сложного, наоборот, управление феноменально простое: подсоединяется модуль одним проводом, а команды представляют собой чуть ли не естественный человеческий язык — «включить канал 0», «выключить канал 1», «установить мощность 50% на канале 3» — проще действительно некуда.

Бонус для тех, кто дочитал до конца

Буквально на днях вышла новая версия Arduino Mega Server под номером 0.14, в которой преодолены все детские болезни технологии и которая работает быстро и стабильно. И эта же версия содержит интегрированное ядро управления приборами nooLite и о том, как всё это работает, вы узнаете из следующей статьи цикла «Беспроводное оборудование nooLite и Умный дом (часть 2). Arduino Mega Server».

Автор: smart_alex

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js