MegaLight - контроллер освещения на Arduino Mega 2560+W5100

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

MegaLight - контроллер освещения на Arduino Mega 2560+W5100

Сообщение olehs » Вс ноя 22, 2015 6:59 pm

MegaLight позволяет настроить автономное управление освещением с заранее определенной логикой реакции на события кнопок (выключателей), а также внешнее управление по HTTP и отсылку событий в формате, совместимом с MajorDoMo

Для компиляции используйте Arduino IDE v1.6.5 от arduino.cc


UPD. Сейчас более актуальна и лучше поддерживается версия с конфигурированием с SD-карты (вместо веб-конфигурирования): MegaLight2
Небольшое описание можно найти тут (спасибо karsotrade)


Перед заливкой рекомендую задать статический IP (и, возможно, сменить MAC) для самого контроллера в файле MegaWeb.ino. По-умолчанию адрес 192.168.21.210 (позже его можно сменить в конфигурации)
Для связи с МЖД нужно указать его IP в файле MegaLight.ino. Если в МЖД используется авторизация, ее base64-код нужно указать в переменной mdAuth.


Описание.
Архитектурно MegaLight построен на 3-х понятиях:
1. Buttons - кнопки (выключатели, логические датчики).
2. Relays - реле. Это управляемые логическим уровнем устройства. Позже появилась возможность управления ШИМ, но название я уже не менял.
3. JointPoints - соединения. Эта абстрактная сущность позволяет связать между собой любую комбинацию Buttons и Relays, добавив условия, параметры и т.д.

Для конфигурирования нужно зайти браузером на адрес MegaLight по стандартному 80 порту.

Buttons
buttons.png
buttons.png (39.15 КБ) 28713 просмотров
ID - уникальный числовой идентификатор кнопки. Будет использоваться при настройке соединений (можно задавать просто по порядку)
Pin - номер пина (цифрового или аналогового), куда подключена кнопка. Не используйте пины 4, 10, 50-53, они используются Ethernet-шилдом. Аналоговые пины A* также имеют свое цифровое представление (см. таблицу)
Pullup type - тип подтяжки:
  • EXTERNAL_PULLDOWN - подтяжка внешним резистором к Gnd
  • INTERNAL_PULLUP - подтяжка внутренним резистором к Vcc (вход инвертирован)
  • EXTERNAL_PULLUP - подтяжка внешним резистором к Vcc (вход инвертирован)
Bounce interval (ms) - интервал подавления дребезга контактов (мс). Обычно 40мс достаточно.
Hold interval (ms) - время в мс, которое нужно удерживать кнопку, чтобы она перешла в состояние Hold (удержание).
Repeat - 1 или 0 - включить или выключить автоповтор нажатия в режиме удержания.
Repeat interval (ms) - интервал в мс, с которым повторять нажатия в режиме удержания (Repeat должно быть 1). Я обычно использую 150мс.
Double-click interval (ms) - интервал в мс, в течение которого два последовательных нажатия кнопки сгенерируют событие DoubleClick. 0 - не отслеживать двойное нажатие. Я обычно использую 800мс.
Prevent Click - 1 или 0 - предотвращать(1) генерацию события Click при первом нажатии, если за ним последовал DoubleClick. Имеет смысл только если Double-click interval больше нуля.
!DELETE! - удалить кнопку. Если ни одно Соединение не ссылается на эту кнопку, здесь будет галочка, иначе - к-во ссылающихся Соединений.

Для сохранения изменений нужно нажать кнопку Save Config.

Relays
relays.png
relays.png (37.91 КБ) 28713 просмотров
ID - уникальный числовой идентификатор реле. Будет использоваться при настройке соединений (можно задавать просто по порядку)
Pin - номер пина, к которому подключено управляемое устройство
PWM frequency (Hz) - частота ШИМ в герцах. Если 0 - то ШИМ не используется. У Mega 2560 порты с ШИМ 2 по 13 и 44 по 46.
On - состояние выхода - 1-вкл, 0-выкл.
Invert State - инверсия порта (Выкл - на выходе логическая 1, вкл - 0).
Dimmer value - если используется ШИМ - его скважность (0-255)
PowerOn Restore - какие параметры нужно сохранять при изменении и восстановить при включении контроллера
  • None - ничего не сохранять, при включении состояние и значение равны установленным при конфигурировании
  • State - восстанавливать последнее установленное состояние параметра On
  • Value - восстанавливать последнее установленное значение диммера (ШИМ)
  • State&Value - восстанавливать состояние и значение.
JointPoints
jointpoints.png
jointpoints.png (27.89 КБ) 28713 просмотров
ID - уникальный числовой идентификатор соединения (можно задавать просто по порядку)
Buttons - соединяемые кнопки
Events - события, см. далее (для редактирования нажать на Edit)
Relays - соединяемые реле
Order - последовательность проверки соединений (от меньшего числа к большему)
Final - 1 или 0. Если 1 - остановить дальнейшую проверку соединений при срабатывании события.

Events
events.png
events.png (47.07 КБ) 28713 просмотров
Здесь задаются действия над присоединенными реле в зависимости от событий, произошедших с привязанными кнопками.
Event
  • StateChanged - изменение состояние (кнопка нажата или отпущена)
  • Pressed - нажатие кнопки
  • Released - отпускание кнопки
  • Repeat - при каждом автоповторе
  • Hold - удержание кнопки
  • LongClick - длинное нажатие. Срабатывает по факту отпускания после удержания
  • Click - клик (короткое нажатие и отпускание)
  • DoubleClick - двойной клик
Action
  • Unassigned - события не обрабатывается
  • No action - ничего не делать. При этом событие считается сработавшим и при Final=1 последующие соединения обрабатываться не будут
  • On - включить
  • Off - выключить
  • Toggle - изменить состояние на противоположное
  • Value - установить значение диммера в определенное значение(только для ШИМ-каналов)
  • IncValue - увеличить или уменьшить значение диммера на фиксированное значение
Parameter - значение для событий, связанных с диммером. Для Value - значение диммера (от 0 до 255), для IncValue - шаг изменения (от -255 до 255).
Timeout (ms) - длительность действия.
Для действий, управляющих состоянием (No action, On, Off, Toggle) - время, через которое нужно изменить состояние на противоположное. Например: событие On с таймаутом 10000 включит реле, а через 10сек выключит. В общем случае выполняется действие [Action], а через [Timeout] мсек выполнится Toggle. Если в это время произойдет другое событие, изменяющее состояние конкретного реле, таймер останавливается.
Для действий, управляющих ШИМ-каналом (Value, IncValue) - время, в течение которого значение будет плавно переходить от текущего значения до заданного.
Condition - дополнительное условие срабатывания действия.
Здесь можно указать выражение с условием.
в зависимости от состояния реле, например:
R1 - реле с ID 1 включено
!R2 - реле с ID 2 выключено
в зависимости от значения ШИМ реле, например:
RV1>0 - значение диммера с ID 1 больше нуля
RV2<200 - значение диммера с ID 2 меньше 200
RV1=255 - значение диммера с ID 1 равно 255
RV1g100 - значение диммера с ID 1 больше или равно 100
RV1l100 - значение диммера с ID 1 меньше или равно 100 (это там прописная буква L)
в зависимости от состояния кнопки, например:
B10 - кнопка с ID 10 нажата
!B10 или BU10 - кнопка с ID 10 не нажата
BH10 - кнопка с ID 10 удерживается

Условия могут состоять из нескольких, объединенных операторами или заключенных в скобки.
Операторы:
! - НЕ
| - ИЛИ (вертикальная палка)
& - И
( ) - скобки
= - равно
> - больше
< - меньше
g - больше или равно
l - меньше или равно

Пример сложного выражения:
BH1|(R1&!R2)|(RV5=255)
условие сработает, если удерживается кнопка 1, либо если включено реле 1, а реле 2 выключено, либо диммер 5 на максимуме.

Config
Здесь можно сменить MAC и IP контроллера.

P.S. К сожалению, маленький объем оперативки у Ардуины не позволяет при данной структуре скетча завести больше десятка кнопок/реле/правил (каждого). В ближайшее время постараюсь что-то придумать.

Github
Вложения
MegaLight_0_2_1.zip
(229.15 КБ) 795 скачиваний
Последний раз редактировалось olehs Вс янв 21, 2018 10:27 pm, всего редактировалось 13 раз.
За это сообщение автора olehs поблагодарили (всего 13):
man8007 (Сб ноя 28, 2015 9:57 pm) • skysilver (Вт дек 01, 2015 5:16 pm) • -Юрий87- (Вс дек 06, 2015 11:12 pm) • denis (Сб авг 20, 2016 9:37 pm) • kiptim (Пт янв 27, 2017 8:29 pm) • Pooh (Пн фев 27, 2017 6:53 am) • Molostov (Пт апр 07, 2017 11:29 pm) • Frid (Вт авг 01, 2017 9:26 am) • Viktor1 (Пн дек 18, 2017 1:03 am) • Grizzluka (Вс янв 21, 2018 10:22 pm) и ещё 3
Рейтинг: 15.12%
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение olehs » Вс ноя 22, 2015 7:00 pm

Протокол взаимодействия по HTTP
Получение состояния реле
HTTP-GET запрос вида
http://megalight/state?c=get&n=1
n - ID нужного реле (обязательный)
Ответ: text/plain в виде
1;255
где первое число - состояние (1 - вкл), второе - значение диммера

Установка состояния реле
HTTP-GET запрос вида
http://megalight/state?c=set&n=1&o=1&v=200&t=30000
http://megalight/state?c=set&n=1&i=10
n - ID нужного реле (обязательный)
o - состояние (1 - вкл, 0 - выкл)
v - значение диммера (0-255)
i - инкремент/декремент значения диммера (-255 по 255)
t - таймаут в миллисекундах
Ответ: пусто

Получение состояния кнопки
HTTP-GET запрос вида
http://megalight/state?c=button&n=1
n - ID нужной кнопки/выключателя (обязательный)
Ответ: text/plain в виде
1
состояние (1 - нажата, 0 - не нажата)

Взаимодействие с МЖД
1. В объект ThisComputer нужно добавить свойство MegaLightURL c адресом MegaLight в виде
http://192.168.21.210
2. Импортировать класс MegaLight из файла MegaLight.txt и сделать его родителем класс Relays
class.png
class.png (63.37 КБ) 28576 просмотров
3. Добавить в объект ThisComputer метод setRelayState с кодом

Код: Выделить всё

$objects=getObjectsByClass("MegaLight");
foreach($objects as $obj) {
 if(gg($obj['TITLE'].".ID") == $params["id"])
 {
   sg($obj['TITLE'].".status", $params["on"]);
   sg($obj['TITLE'].".value", $params["v"]);
   break;
 }
} 
setRelayState.png
setRelayState.png (17.89 КБ) 28576 просмотров
4. Создать объекты класса MegaLight для каждого реле, указав его ID в соответствующем свойстве
5. Подвязать свойства status или value нужных реле к соответствующим элементам сцен. Для изменения привязать к методам turnOn, turnOff или switch
Вложения
MegaLight.zip
(662 байт) 644 скачивания
Последний раз редактировалось olehs Пн ноя 23, 2015 3:49 pm, всего редактировалось 1 раз.
За это сообщение автора olehs поблагодарили (всего 3):
skysilver (Вт дек 01, 2015 5:16 pm) • -Юрий87- (Вс дек 06, 2015 11:13 pm) • Yashalta (Пт янв 18, 2019 11:27 am)
Рейтинг: 3.49%
AlexSedov
Сообщения: 52
Зарегистрирован: Чт ноя 12, 2015 3:43 pm
Благодарил (а): 2 раза
Поблагодарили: 0

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение AlexSedov » Вс ноя 22, 2015 9:12 pm

Проверил. Поменял айпишники. Залил. Но зайти не могу на сайт по айпи.
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение olehs » Вс ноя 22, 2015 9:17 pm

а ping идет?
в arp -a видно?
AlexSedov
Сообщения: 52
Зарегистрирован: Чт ноя 12, 2015 3:43 pm
Благодарил (а): 2 раза
Поблагодарили: 0

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение AlexSedov » Вс ноя 22, 2015 9:21 pm

Да пингую
AlexSedov
Сообщения: 52
Зарегистрирован: Чт ноя 12, 2015 3:43 pm
Благодарил (а): 2 раза
Поблагодарили: 0

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение AlexSedov » Вс ноя 22, 2015 9:21 pm

В монитор порта смотрю а там
Config loaded (78 bytes).
Server started at 192.168.1.5
Started
AlexSedov
Сообщения: 52
Зарегистрирован: Чт ноя 12, 2015 3:43 pm
Благодарил (а): 2 раза
Поблагодарили: 0

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение AlexSedov » Вс ноя 22, 2015 9:23 pm

пытаюсь зайти на 192.168.1.5 пишет веб страница не доступна. А командную строку открываю и этот же айпи без проблем пингую.
AlexSedov
Сообщения: 52
Зарегистрирован: Чт ноя 12, 2015 3:43 pm
Благодарил (а): 2 раза
Поблагодарили: 0

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение AlexSedov » Вс ноя 22, 2015 9:28 pm

А не может быть такого что на 80 порту уже роутер сидит? конфликт. Поправьте если ошибаюсь.
AlexSedov
Сообщения: 52
Зарегистрирован: Чт ноя 12, 2015 3:43 pm
Благодарил (а): 2 раза
Поблагодарили: 0

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение AlexSedov » Вс ноя 22, 2015 9:29 pm

Что такое arp -a?
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение olehs » Вс ноя 22, 2015 9:34 pm

в командой строке ввести arp -a
выведет таблицу соответствий мак-адресов айпишникам. там рядом с 192.168.1.5 должен отобразиться тот же мак, что и в MegaWeb.ino
Ответить