Управление Светом
Модератор: immortal
- Oleg_Ltd
- Сообщения: 15
- Зарегистрирован: Пт янв 26, 2018 8:39 pm
- Откуда: Минск РБ
- Благодарил (а): 7 раз
- Поблагодарили: 0
- Контактная информация:
Управление Светом
Порошу помощи, требуется реализация управления освещением в Умном Доме по средствам MajorDomo+Arduino UNO+W5100. Подскажите на примере как прописать строчки в MJ на РНР для включения или выключения канала.
Для примера начал вот с такого скеттча из интернета автор Дмитрий Осипов:
#include <EtherCard.h> // Подключаем скачанную библиотеку. https://yadi.sk/d/R57sVoglbhTRN
// MAC Address должен быть уникальным в вашей сети. Можно менять.
static byte mymac[] = {
0x5A,0x5A,0x5A,0x5A,0x5A,0x5A };
// ip статический / постоянный Address нашей Web страницы.
static byte myip[] = { 192,168,1,55 };
// Буфер, чем больше данных на Web странице, тем больше понадобится значения буфера.
byte Ethernet::buffer[900];
BufferFiller bfill;
// Массив задействованных номеров Pins Arduino, для управления например 8 реле.
int LedPins[] = {
2,3,4,5,6,7,8,9};
// Массив для фиксации изменений.
boolean PinStatus[] = {
1,2,3,4,5,6,7,8};
//-------------
const char http_OK[] PROGMEM =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";
const char http_Found[] PROGMEM =
"HTTP/1.0 302 Found\r\n"
"Location: /\r\n\r\n";
const char http_Unauthorized[] PROGMEM =
"HTTP/1.0 401 Unauthorized\r\n"
"Content-Type: text/html\r\n\r\n"
"<h1>401 Unauthorized</h1>";
//------------
// Делаем функцию для оформления нашей Web страницы.
void homePage()
{
bfill.emit_p(PSTR("$F"
"<title>ArduinoPIN Webserver</title>"
"Light in Garage: <a href=\"?ArduinoPIN1=$F\">$F</a><br />"
"Light Yard: <a href=\"?ArduinoPIN2=$F\">$F</a><br />"
"ArduinoPIN 3: <a href=\"?ArduinoPIN3=$F\">$F</a><br />"
"ArduinoPIN 4: <a href=\"?ArduinoPIN4=$F\">$F</a><br />"
"ArduinoPIN 5: <a href=\"?ArduinoPIN5=$F\">$F</a><br />"
"ArduinoPIN 6: <a href=\"?ArduinoPIN6=$F\">$F</a><br />"
"ArduinoPIN 7: <a href=\"?ArduinoPIN7=$F\">$F</a><br />"
"ArduinoPIN 8: <a href=\"?ArduinoPIN8=$F\">$F</a>"),
http_OK,
PinStatus[1]?PSTR("off"):PSTR("on"),
PinStatus[1]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[2]?PSTR("off"):PSTR("on"),
PinStatus[2]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[3]?PSTR("off"):PSTR("on"),
PinStatus[3]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[4]?PSTR("off"):PSTR("on"),
PinStatus[4]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[5]?PSTR("off"):PSTR("on"),
PinStatus[5]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[6]?PSTR("off"):PSTR("on"),
PinStatus[6]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[7]?PSTR("off"):PSTR("on"),
PinStatus[7]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[8]?PSTR("off"):PSTR("on"),
PinStatus[8]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"));
}
//------------------------
void setup()
{
Serial.begin(9600);
// По умолчанию в Библиотеке "ethercard" (CS-pin) = № 8.
// if (ether.begin(sizeof Ethernet::buffer, mymac) == 0).
// and change it to: Меняем (CS-pin) на 10.
// if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0).
if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0);
if (!ether.dhcpSetup());
// Выводим в Serial монитор IP адрес который нам автоматический присвоил наш Router.
// Динамический IP адрес, это не удобно, периодический наш IP адрес будет меняться.
// Нам придётся каждый раз узнавать кой адрес у нашей страницы.
ether.printIp("My Router IP: ", ether.myip); // Выводим в Serial монитор IP адрес который нам присвоил Router.
// Здесь мы подменяем наш динамический IP на статический / постоянный IP Address нашей Web страницы.
// Теперь не важно какой IP адрес присвоит нам Router, автоматический будем менять его, например на "192.168.1.222".
ether.staticSetup(myip);
ether.printIp("My SET IP: ", ether.myip); // Выводим в Serial монитор статический IP адрес.
//-----
for(int i = 0; i <= 8; i++)
{
pinMode(LedPins,OUTPUT);
PinStatus=false;
}
}
// --------------------------------------
void loop()
{
delay(1); // Дёргаем микроконтроллер.
word len = ether.packetReceive(); // check for ethernet packet / проверить ethernet пакеты.
word pos = ether.packetLoop(len); // check for tcp packet / проверить TCP пакеты.
if (pos) {
bfill = ether.tcpOffset();
char *data = (char *) Ethernet::buffer + pos;
if (strncmp("GET /", data, 5) != 0) {
bfill.emit_p(http_Unauthorized);
}
else {
data += 5;
if (data[0] == ' ') {
homePage(); // Return home page Если обнаружено изменения на станице, запускаем функцию.
for (int i = 0; i <= 7; i++)digitalWrite(LedPins,PinStatus[i+1]);
}
// "16" = количество символов "?ArduinoPIN1=on ".
else if (strncmp("?ArduinoPIN1=on ", data, 16) == 0) {
PinStatus[1] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN2=on ", data, 16) == 0) {
PinStatus[2] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN3=on ", data, 16) == 0) {
PinStatus[3] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN4=on ", data, 16) == 0) {
PinStatus[4] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN5=on ", data, 16) == 0) {
PinStatus[5] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN6=on ", data, 16) == 0) {
PinStatus[6] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN7=on ", data, 16) == 0) {
PinStatus[7] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN8=on ", data, 16) == 0) {
PinStatus[8] = true;
bfill.emit_p(http_Found);
}
//------------------------------------------------------
else if (strncmp("?ArduinoPIN1=off ", data, 17) == 0) {
PinStatus[1] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN2=off ", data, 17) == 0) {
PinStatus[2] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN3=off ", data, 17) == 0) {
PinStatus[3] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN4=off ", data, 17) == 0) {
PinStatus[4] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN5=off ", data, 17) == 0) {
PinStatus[5] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN6=off ", data, 17) == 0) {
PinStatus[6] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN7=off ", data, 17) == 0) {
PinStatus[7] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN8=off ", data, 17) == 0) {
PinStatus[8] = false;
bfill.emit_p(http_Found);
}
//---------------------------
else {
// Page not found
bfill.emit_p(http_Unauthorized);
}
}
ether.httpServerReply(bfill.position()); // send http response
}
}
----------------------------------------------------------------------------------
Трубуется дать каманду на включение канала из MJ вроде как в PHP коде.
Может кто подскажет как это реализовать ?
Для примера начал вот с такого скеттча из интернета автор Дмитрий Осипов:
#include <EtherCard.h> // Подключаем скачанную библиотеку. https://yadi.sk/d/R57sVoglbhTRN
// MAC Address должен быть уникальным в вашей сети. Можно менять.
static byte mymac[] = {
0x5A,0x5A,0x5A,0x5A,0x5A,0x5A };
// ip статический / постоянный Address нашей Web страницы.
static byte myip[] = { 192,168,1,55 };
// Буфер, чем больше данных на Web странице, тем больше понадобится значения буфера.
byte Ethernet::buffer[900];
BufferFiller bfill;
// Массив задействованных номеров Pins Arduino, для управления например 8 реле.
int LedPins[] = {
2,3,4,5,6,7,8,9};
// Массив для фиксации изменений.
boolean PinStatus[] = {
1,2,3,4,5,6,7,8};
//-------------
const char http_OK[] PROGMEM =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";
const char http_Found[] PROGMEM =
"HTTP/1.0 302 Found\r\n"
"Location: /\r\n\r\n";
const char http_Unauthorized[] PROGMEM =
"HTTP/1.0 401 Unauthorized\r\n"
"Content-Type: text/html\r\n\r\n"
"<h1>401 Unauthorized</h1>";
//------------
// Делаем функцию для оформления нашей Web страницы.
void homePage()
{
bfill.emit_p(PSTR("$F"
"<title>ArduinoPIN Webserver</title>"
"Light in Garage: <a href=\"?ArduinoPIN1=$F\">$F</a><br />"
"Light Yard: <a href=\"?ArduinoPIN2=$F\">$F</a><br />"
"ArduinoPIN 3: <a href=\"?ArduinoPIN3=$F\">$F</a><br />"
"ArduinoPIN 4: <a href=\"?ArduinoPIN4=$F\">$F</a><br />"
"ArduinoPIN 5: <a href=\"?ArduinoPIN5=$F\">$F</a><br />"
"ArduinoPIN 6: <a href=\"?ArduinoPIN6=$F\">$F</a><br />"
"ArduinoPIN 7: <a href=\"?ArduinoPIN7=$F\">$F</a><br />"
"ArduinoPIN 8: <a href=\"?ArduinoPIN8=$F\">$F</a>"),
http_OK,
PinStatus[1]?PSTR("off"):PSTR("on"),
PinStatus[1]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[2]?PSTR("off"):PSTR("on"),
PinStatus[2]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[3]?PSTR("off"):PSTR("on"),
PinStatus[3]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[4]?PSTR("off"):PSTR("on"),
PinStatus[4]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[5]?PSTR("off"):PSTR("on"),
PinStatus[5]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[6]?PSTR("off"):PSTR("on"),
PinStatus[6]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[7]?PSTR("off"):PSTR("on"),
PinStatus[7]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
PinStatus[8]?PSTR("off"):PSTR("on"),
PinStatus[8]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"));
}
//------------------------
void setup()
{
Serial.begin(9600);
// По умолчанию в Библиотеке "ethercard" (CS-pin) = № 8.
// if (ether.begin(sizeof Ethernet::buffer, mymac) == 0).
// and change it to: Меняем (CS-pin) на 10.
// if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0).
if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0);
if (!ether.dhcpSetup());
// Выводим в Serial монитор IP адрес который нам автоматический присвоил наш Router.
// Динамический IP адрес, это не удобно, периодический наш IP адрес будет меняться.
// Нам придётся каждый раз узнавать кой адрес у нашей страницы.
ether.printIp("My Router IP: ", ether.myip); // Выводим в Serial монитор IP адрес который нам присвоил Router.
// Здесь мы подменяем наш динамический IP на статический / постоянный IP Address нашей Web страницы.
// Теперь не важно какой IP адрес присвоит нам Router, автоматический будем менять его, например на "192.168.1.222".
ether.staticSetup(myip);
ether.printIp("My SET IP: ", ether.myip); // Выводим в Serial монитор статический IP адрес.
//-----
for(int i = 0; i <= 8; i++)
{
pinMode(LedPins,OUTPUT);
PinStatus=false;
}
}
// --------------------------------------
void loop()
{
delay(1); // Дёргаем микроконтроллер.
word len = ether.packetReceive(); // check for ethernet packet / проверить ethernet пакеты.
word pos = ether.packetLoop(len); // check for tcp packet / проверить TCP пакеты.
if (pos) {
bfill = ether.tcpOffset();
char *data = (char *) Ethernet::buffer + pos;
if (strncmp("GET /", data, 5) != 0) {
bfill.emit_p(http_Unauthorized);
}
else {
data += 5;
if (data[0] == ' ') {
homePage(); // Return home page Если обнаружено изменения на станице, запускаем функцию.
for (int i = 0; i <= 7; i++)digitalWrite(LedPins,PinStatus[i+1]);
}
// "16" = количество символов "?ArduinoPIN1=on ".
else if (strncmp("?ArduinoPIN1=on ", data, 16) == 0) {
PinStatus[1] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN2=on ", data, 16) == 0) {
PinStatus[2] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN3=on ", data, 16) == 0) {
PinStatus[3] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN4=on ", data, 16) == 0) {
PinStatus[4] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN5=on ", data, 16) == 0) {
PinStatus[5] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN6=on ", data, 16) == 0) {
PinStatus[6] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN7=on ", data, 16) == 0) {
PinStatus[7] = true;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN8=on ", data, 16) == 0) {
PinStatus[8] = true;
bfill.emit_p(http_Found);
}
//------------------------------------------------------
else if (strncmp("?ArduinoPIN1=off ", data, 17) == 0) {
PinStatus[1] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN2=off ", data, 17) == 0) {
PinStatus[2] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN3=off ", data, 17) == 0) {
PinStatus[3] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN4=off ", data, 17) == 0) {
PinStatus[4] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN5=off ", data, 17) == 0) {
PinStatus[5] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN6=off ", data, 17) == 0) {
PinStatus[6] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN7=off ", data, 17) == 0) {
PinStatus[7] = false;
bfill.emit_p(http_Found);
}
else if (strncmp("?ArduinoPIN8=off ", data, 17) == 0) {
PinStatus[8] = false;
bfill.emit_p(http_Found);
}
//---------------------------
else {
// Page not found
bfill.emit_p(http_Unauthorized);
}
}
ether.httpServerReply(bfill.position()); // send http response
}
}
----------------------------------------------------------------------------------
Трубуется дать каманду на включение канала из MJ вроде как в PHP коде.
Может кто подскажет как это реализовать ?
-
- Сообщения: 3006
- Зарегистрирован: Чт авг 21, 2014 8:28 am
- Откуда: Киров, Россия
- Благодарил (а): 400 раз
- Поблагодарили: 1754 раза
- Контактная информация:
Re: Управление Светом
Ну а из браузера то получается управлять?
Код: Выделить всё
getURL('http://ip_ардуинки?ArduinoPIN1=on', 0); // включить 1ый pin
getURL('http://ip_ардуинки?ArduinoPIN1=off', 0); // выключить 1ый pin
Последний раз редактировалось skysilver Сб янв 27, 2018 12:09 am, всего редактировалось 1 раз.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Мой CONNECT | Блоги | Telegram
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: Управление Светом
У этого автора (Дмитрий Осипов) из браузера элементарно управляется любой его код. Задача управлять из МД. Для этого как минимум надо прописать адрес сервера. И отправлять статус реле на МД и получать значения обратно.
PS. Вспомнил молодость)) Очень крутой скетч для ENC60 (?) и NANO3 . Управляет 8-ю реле с памятью в EEPROM и выводом 4 значений аналоговых портов в браузере. К МД не имеет никакого отношения.
PSS. ВЕВ сервер откусывает 900 байт памяти и остается совсем ничего из 2-х килобайт.((. Для управления светом на форуме есть МегаЛайт контроллер.
PS. Вспомнил молодость)) Очень крутой скетч для ENC60 (?) и NANO3 . Управляет 8-ю реле с памятью в EEPROM и выводом 4 значений аналоговых портов в браузере. К МД не имеет никакого отношения.
PSS. ВЕВ сервер откусывает 900 байт памяти и остается совсем ничего из 2-х килобайт.((. Для управления светом на форуме есть МегаЛайт контроллер.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
- Vovix
- Сообщения: 1155
- Зарегистрирован: Пн янв 27, 2014 1:43 am
- Откуда: г.Ижевск
- Благодарил (а): 60 раз
- Поблагодарили: 532 раза
- Контактная информация:
Re: Управление Светом
а почему бы код не загнать в теги и не запихать под спойлер! Удобнее было бы всем, кто может вам помочь!Oleg_Ltd писал(а):Порошу помощи, требуется реализация управления освещением в Умном Доме по средствам MajorDomo+Arduino UNO+W5100. Подскажите на примере как прописать строчки в MJ на РНР для включения или выключения канала.
Для примера начал вот с такого скеттча из интернета автор Дмитрий Осипов:
....
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
- Oleg_Ltd
- Сообщения: 15
- Зарегистрирован: Пт янв 26, 2018 8:39 pm
- Откуда: Минск РБ
- Благодарил (а): 7 раз
- Поблагодарили: 0
- Контактная информация:
Re: Управление Светом
Из браузера все работает UNO+28j60, задача дать команду из MD
Для управления из MD Веб морда не нужна, поэтому и памяти больше остается под главную задачу вкл/выкл канала и передача его состояния.
МегаЛайт контроллер - это уже другая история, тогда проще наверное на ESP8266.
Тут задача такая, простое исполнительное устройство принимающее запросы из MajorDoMo, и главное по проводам. Весь остальной процесс обработки на сервере.
Для управления из MD Веб морда не нужна, поэтому и памяти больше остается под главную задачу вкл/выкл канала и передача его состояния.
МегаЛайт контроллер - это уже другая история, тогда проще наверное на ESP8266.
Тут задача такая, простое исполнительное устройство принимающее запросы из MajorDoMo, и главное по проводам. Весь остальной процесс обработки на сервере.
-
- Сообщения: 3006
- Зарегистрирован: Чт авг 21, 2014 8:28 am
- Откуда: Киров, Россия
- Благодарил (а): 400 раз
- Поблагодарили: 1754 раза
- Контактная информация:
Re: Управление Светом
Мой код проверял?
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Мой CONNECT | Блоги | Telegram
- Oleg_Ltd
- Сообщения: 15
- Зарегистрирован: Пт янв 26, 2018 8:39 pm
- Откуда: Минск РБ
- Благодарил (а): 7 раз
- Поблагодарили: 0
- Контактная информация:
Re: Управление Светом
Ваш код Работает ! Спасибо !skysilver писал(а):Ну а из браузера то получается управлять?
Код: Выделить всё
getURL('http://ip_ардуинки?ArduinoPIN1=on', 0); // включить 1ый pin getURL('http://ip_ардуинки?ArduinoPIN1=off', 0); // выключить 1ый pin
-
- Сообщения: 3006
- Зарегистрирован: Чт авг 21, 2014 8:28 am
- Откуда: Киров, Россия
- Благодарил (а): 400 раз
- Поблагодарили: 1754 раза
- Контактная информация:
Re: Управление Светом
Oleg_Ltd, пожалуйста.
Для спасибо также есть кнопка справа внизу.
Для спасибо также есть кнопка справа внизу.

- Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Мой CONNECT | Блоги | Telegram