На этот раз предлагаю немного позаниматься магией (почему нет?) и создать магический кристалл для наших повседневных нужд. Использовать его мы будем по прямому назначению — для прорицания различных неочевидных сущностей и событий. И понадобится нам для изготовления сего артефакта всего два ингредиента — Arduino Mega Server и беспроводной контроллер светодиодной ленты nooLite SD111-180.
Кристалл будет не декоративный (для обмана доверчивой публики), а самый что ни на есть функциональный, со множеством магических свойств.
Итак, приступим…
Школа магии
Как вы сами понимаете, нельзя просто так взять и совершить какое-нибудь чудо, нужно сначала пройти школу магии и освоить азы этого непростого искусства. И тут я вас отсылаю к циклу статей (раз, два, три) об интеграции оборудования nooLite в системы домашней автоматизации и рекомендую ознакомиться с ними перед дальнейшим чтением. В этих статьях подробно разобраны все основы и технические детали работы Arduino Mega Server с беспроводным оборудованием nooLite. Поэтому всё дальнейшее повествование я буду вести предполагая, что вы уже ознакомились с предыдущими статьями.
Модуль
Все эксперименты мы будем проводить с беспроводным контроллером nooLite SD111-180, который позволяет управлять светодиодными лентами «по воздуху», без каких-либо проводов. Подключение, как всегда у nooLite, самое простое — два провода к блоку питания для светодиодных лент и четыре — к самой ленте: «плюс» и три канала R, G, B.
Программная часть
В предыдущих статьях говорилось о ядре управления nooLite, интегрированном в систему Arduino Mega Server. И там же упоминалось, что в ядре реализован базовый набор функций для управления приборами nooLite и предлагалось всем желающим, по аналогии, добавить в ядро другие необходимые функции. Теперь мы облегчим вам эту задачу и добавим в ядро функции для беспроводного управления светодиодными лентами.
Прежде всего добавляем «главную» функцию, которая формирует управляющие команды для модуля nooLite MT1132.
void nooSendCommandLed(byte channel, byte command, byte r, byte g, byte b, byte format) {
byte buf[12];
ledLastState[0] = r;
ledLastState[1] = g;
ledLastState[2] = b;
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] = r;
buf[7] = g;
buf[8] = b;
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]);
}
}
Это родная сестра функции nooSendCommand, которую мы рассматривали в первой статье. Она только немного изменена для специфических нужд управления светодиодными лентами. Добавлена установка 6, 7, 8 байтов управляющей команды, которые содержат яркость по трём каналам R, G, B. И добавлен массив
byte ledLastState[] = {127, 127, 127};
содержащий последнее установленное значение цвета светодиодной ленты. Это нужно для того, чтобы можно было включать и выключать свет, сохраняя установленное значение цвета. Если этого не сделать, то после выключения и последующего включения, цвет сбросится на белый, что не очень удобно.
И для работы со светодиодной лентой выбираем третий канал
byte const NOO_CHANNEL_3 = 2;
Можно было бы выбрать любой другой из 32 каналов, с которыми работает модуль nooLite MT1132.
Теперь мы имеем базовую функцию, управляющую работой контроллера светодиодной ленты nooLite SD111-180, и, соответственно, и самой светодиодной лентой. И теперь мы можем приступать к написанию функций-обёрток, которые упростят нам написание кода для управления цветом свечения ленты.
Базовая обёртка
void nooLed (byte ch, byte r, byte g, byte b) {
nooSendCommandLed(ch, 6, r, g, b, 3);
}
Просто указываем канал и цвета свечения. В нашем распоряжении 16 миллионов оттенков. Далее пишем функции-обёртки для базовых цветов (вы можете добавить такие функции для своих любимых цветов).
void nooRed (byte ch, byte v) {nooSendCommandLed(ch, 6, v, 0, 0, 3);}
void nooGreen (byte ch, byte v) {nooSendCommandLed(ch, 6, 0, v, 0, 3);}
void nooBlue (byte ch, byte v) {nooSendCommandLed(ch, 6, 0, 0, v, 3);}
void nooYellow (byte ch, byte v) {nooSendCommandLed(ch, 6, v, v, 0, 3);}
void nooMagenta(byte ch, byte v) {nooSendCommandLed(ch, 6, v, 0, v, 3);}
void nooCyan (byte ch, byte v) {nooSendCommandLed(ch, 6, 0, v, v, 3);}
Просто указываем канал и интенсивность свечения в диапазоне от 0 до 255. И ещё несколько «концептуальных» функций. Белый, чёрный и интенсивность серого.
void nooBlack (byte ch) {nooSendCommandLed(ch, 6, 0, 0, 0, 3);}
void nooWhite (byte ch) {nooSendCommandLed(ch, 6, 255, 255, 255, 3);}
void nooGray (byte ch, byte v) {nooSendCommandLed(ch, 6, v, v, v, 3);}
И последняя функция, которой мы дополним ядро nooLite в системе Arduino Mega Server, это функция восстановления последнего цвета свечения ленты (сами модули nooLite не запоминают это значение). Используется эта функция для включения ленты (после выключения, которое сбрасывает цвет на белый).
void nooSetLedLastState(byte ch) {
nooSendCommandLed(ch, 6, ledLastState[0], ledLastState[1], ledLastState[2], 3);
}
Вот полный код нового ядра управления nooLite.
Полный код ядра
/*
Modul nooLite for Due
part of Arduino Mega Server project
*/
#ifdef NOO_FEATURE
byte const PIN_TX = 18; // TX PIN (to RX noolite)
byte const PIN_RX = 19; // RX PIN (to TX noolite)
byte const NOO_CHANNEL_1 = 0; // channel (address) 0...31 (MT1132)
byte const NOO_CHANNEL_2 = 1;
byte const NOO_CHANNEL_3 = 2;
byte const NOO_CHANNEL_4 = 3;
byte const NOO_CHANNEL_5 = 4;
void nooInit() {
Serial1.begin(9600);
modulNoo = MODUL_ENABLE;
started("nooLite");
}
void nooWork() {
}
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]);
}
/*
Serial.println(">");
for (byte i = 0; i < (12); i++) {
Serial.print(buf[i]);
}
Serial.println();
*/
}
byte ledLastState[] = {127, 127, 127};
void nooSendCommandLed(byte channel, byte command, byte r, byte g, byte b, byte format) {
byte buf[12];
ledLastState[0] = r;
ledLastState[1] = g;
ledLastState[2] = b;
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] = r;
buf[7] = g;
buf[8] = b;
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]);
}
}
// command data format
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 nooLed (byte ch, byte r, byte g, byte b) {nooSendCommandLed(ch, 6, r, g, b, 3);}
void nooBlack (byte ch) {nooSendCommandLed(ch, 6, 0, 0, 0, 3);}
void nooWhite (byte ch) {nooSendCommandLed(ch, 6, 255, 255, 255, 3);}
void nooGray (byte ch, byte v) {nooSendCommandLed(ch, 6, v, v, v, 3);}
void nooRed (byte ch, byte v) {nooSendCommandLed(ch, 6, v, 0, 0, 3);}
void nooGreen (byte ch, byte v) {nooSendCommandLed(ch, 6, 0, v, 0, 3);}
void nooBlue (byte ch, byte v) {nooSendCommandLed(ch, 6, 0, 0, v, 3);}
void nooYellow (byte ch, byte v) {nooSendCommandLed(ch, 6, v, v, 0, 3);}
void nooMagenta(byte ch, byte v) {nooSendCommandLed(ch, 6, v, 0, v, 3);}
void nooCyan (byte ch, byte v) {nooSendCommandLed(ch, 6, 0, v, v, 3);}
void nooSetLedLastState(byte ch) {nooSendCommandLed(ch, 6, ledLastState[0], ledLastState[1], ledLastState[2], 3);}
#endif // NOO_FEATURE
Всё, на этом с описанием дополнений ядра мы заканчиваем и переходим к интерфейсу управления цветом свечения светодиодных лент системы AMS.
Интерфейс управления светодиодными лентами
По предыдущим статьям вы помните интерфейс управления приборами nooLite системы Arduino Mega Server. Мы не будем особенно изощряться и просто добавим ещё одну секцию к уже имеющимся трём (две секции управления приборами и одна секция «привязки»/«отвязки» модулей).
Скриншоты других секций с подробными пояснениями вы можете увидеть в предыдущих статьях, посвящённых интеграции AMS с системой nooLite. Новая секция даёт возможность включать и выключать светодиодную ленту и выбирать цвет свечения из нескольких предустановленных вариантов.
Это только пример интеграции и вы можете сделать на основе этого примера любой другой интерфейс. Можно сделать выбор цвета, плавное изменение цветов или предусмотреть сценарии включения, выключения и изменения цвета подсветки и т. д. и т. п.
Внутренняя кухня
Интерфейс управления это только часть доступных возможностей, которые предоставляет Arduino Mega Server с интегрированным ядром управления приборами nooLite. И это, так сказать, надводная часть айсберга. А подводная часть — это возможность использовать функции-обёртки в коде самой системы. Вы можете легко, буквально в одну строчку кода, управлять свечением ленты и индицировать с её помощью любые внутренние параметры системы (температура, охранные функции, включение приборов и т. д.) и внешние, приходящие по сети в виде команд от других устройств Умного дома.
И тут мы переходим к самому интересному.
Магический кристалл
Теперь давайте поговорим собственно о «магическом кристалле». О чём идёт речь? Представьте себе любое искусственное окружение человека — интерьер квартиры или офиса, зал для проведения каких-либо мероприятий, урбанистическое окружение наших городов (остановки, столбы, тумбы и т. п.) и т. д. Так вот, идея состоит в том, что при нынешнем уровне развития технологий любой предмет можно сделать «индикатором» любых событий и параметров. Можно пойти ещё дальше и сделать любой предмет интерактивным или «живым», можно также снабдить любой предмет характерным голосом и т. п. (привет, Алиса!), но это тема уже другой статьи, об этом мы поговорим в другой раз.
Возьмём, к примеру, вашу комнату. На полке, рядом с телевизором, или просто среди «творческого беспорядка» на столе может лежать небольшой предмет, например, «магический шар» который, в зависимости от каких-либо параметров или событий, меняет свой цвет, оттенок или яркость свечения. Он никому не мешает и не привлекает внимание, он не производит никаких шумов, но вам достаточно бросить беглый взгляд на него и вам становится ясно какая температура на улице, пришло ли вам письмо по электронной почте, сколько осталось пива в холодильнике, пора ли кормить рыбок или принимать прописанные вам доктором таблетки от склероза.
Особо важные события «магический кристалл» может индицировать миганием или даже звуком. И все параметры этой системы вы задаёте сами, в зависимости от ваших потребностей и вашей фантазии: цвет и интенсивность свечения, события и параметры, на которые реагирует «магический кристалл» и т. п. Таких «кристаллов» может быть несколько и они могут быть любого вида, совсем не обязательно в виде шара.
Теперь от мелких и «незаметных» вещей давайте перейдём к средним формам. Это может быть напольная или потолочная подсветка, светящиеся стены (части стен) или ниши и т. п. элементы интерьера. Например, подсветка может служить цветовыми часами, когда ночью она меняет свет в зависимости от времени, а утром постепенно становится ярче и служит в качестве «естественного» будильника.
И, наконец, это неисчерпаемый кладезь идей для различных перформансов и оформления массовых мероприятий, таких, как вечеринки, корпоративные мероприятия и т. п. собрания людей, где маленький магический кристалл превращается в 2-х метровые кубы и шары, меняющие цвет в зависимости от, например, результатов голосования за или против чего-либо.
Заключение
И всё, что вам нужно, чтобы реализовать все эти идеи — это Arduino Mega Server, беспроводной контроллер светодиодных лент nooLite SD111-180 и немного фантазии. Все нововведения, описанные в этой статье, появятся в следующей, 0.15 версии системы AMS, а самые нетерпеливые из вас могут взять код модуля ядра nooLite из этой статьи и начать творить чудеса прямо сейчас.
Предыдущие статьи:
Беспроводное оборудование nooLite и Умный дом (часть 1). Arduino
Беспроводное оборудование nooLite и Умный дом (часть 2). Arduino Mega Server
Беспроводное оборудование nooLite и Умный дом (часть 3). Паяльная станция
Arduino Mega Server промо на Youtube, демонстрирующее работу с реальной системой
Arduino Mega Server promo
Mulin
<зануда>
Шарики на втором рендере красивые, но вот каустики ненастоящие. Полоса свечения довольно широкая, а значит и градиент перехода яркости каустики на полу, должен возрастать с квадратом расстояния и быть не уже ширины светящейся полосы даже на минимальном расстоянии :)
</зануда>
smart_alex
Да… даже не знаю что сказать…