Arduino Классы / Методы....

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Otto
Сообщения: 49
Зарегистрирован: Ср мар 30, 2016 9:12 pm
Откуда: Омск
Благодарил (а): 108 раз
Поблагодарили: 9 раз

Arduino Классы / Методы....

Сообщение Otto » Вт июн 28, 2016 8:03 am

Подскажите как организовать подключение Arduino UNO + Ethernet Shild W5100 к MajorDoMo на Windows. Не нашёл инфы как создать класс с методами и свойствами в которых будет храниться история температуры и другая информация с датчиков (пока в планах, т.к. жду датчики), но уже сделал управление 8 релюшками через Arduino, и хотелось бы их управление сделать через классы. В основном попадается инфа с тем, что нужно про ESP8266, но это не то... Выручайте пожалуйста.
P.S. HTTP команды для управления Реле включения и выключения сделал немного своеобразно: в конце ссылке на вкл./выкл. не 1 и 0 стоит, а на каждое реле из 8 шт. свои значения. Думаю будет понятнее, если посмотрите скетч:
СпойлерПоказать

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

/*
  Ethernet Web Server на Шилде W5100.
  Управление реле при нажатии кнопки on/off (при вводе URL адреса) в браузере

  Пример:

  Адрес для доступа к реле:        |        Для того, чтобы включить Реле №1:
  http://192.168.1.74              |        http://192.168.1.74/$1

                      Для того, чтобы выключить Реле №2:
                      http://192.168.1.74/$A

  и так далее....
*/
#include <EEPROM.h>            //библиотека энергонезависимой памяти
#include <SPI.h>              //библиотека для работы с SPI
#include <Ethernet.h>        //библиотека для работы с Ethernet 
boolean newInfo = 0;        //переменная для новой информации
//MAC адрес вашего Ethernet-модуля
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };

//указываем IP адрес
IPAddress ip(192, 168, 1, 74); //пример МОЕГО IP адреса, вы вводите сюда СВОЙ

//инифиализация библиотеки Ethernet server library
//порт 80 по умолчанию для HTTP
EthernetServer server(80);

//адреса памяти для Реле в EEPROM
int address1 = 0;
int address2 = 0;
int address3 = 0;
int address4 = 0;
int address5 = 0;
int address6 = 0;
int address7 = 0;
int address8 = 0;

void setup()
{
  //инициализируем 8 пинов как выходы для реле
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  // =============Проверка циклов считывания EEPROM=============================
  //цикл считывания значения из EEPROM для реле №1
  if ( EEPROM.read(address1) ) {
    digitalWrite(2, HIGH);
  } else {
    digitalWrite(2, LOW);
  }

  //цикл считывания значения из EEPROM для реле №2
  if ( EEPROM.read(address2) ) {
    digitalWrite(3, HIGH);
  } else {
    digitalWrite(3, LOW);
  }

  //цикл считывания значения из EEPROM для реле №3
  if ( EEPROM.read(address3) ) {
    digitalWrite(4, HIGH);
  } else {
    digitalWrite(4, LOW);
  }

  //цикл считывания значения из EEPROM для реле №4
  if ( EEPROM.read(address4) ) {
    digitalWrite(5, HIGH);
  } else {
    digitalWrite(5, LOW);
  }

  //цикл считывания значения из EEPROM для реле №5
  if ( EEPROM.read(address5) ) {
    digitalWrite(6, HIGH);
  } else {
    digitalWrite(6, LOW);
  }

  //цикл считывания значения из EEPROM для реле №6
  if ( EEPROM.read(address6) ) {
    digitalWrite(7, HIGH);
  } else {
    digitalWrite(7, LOW);
  }

  //цикл считывания значения из EEPROM для реле №7
  if ( EEPROM.read(address7) ) {
    digitalWrite(8, HIGH);
  } else {
    digitalWrite(8, LOW);
  }

  //цикл считывания значения из EEPROM для реле №8
  if ( EEPROM.read(address8) ) {
    digitalWrite(9, HIGH);
  } else {
    digitalWrite(9, LOW);
  }

  //запускаем сервер с указанными ранее MAC и вашим IP
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
}

void loop()
{
  //принимаем данные, посылаемые клиентом
  EthernetClient client = server.available();
  if (client) {                                       //если запрос оканчивается пустой строкой
    boolean currentLineIsBlank = true;                //ставим метку об окончании запроса (дословно: текущая линия чиста)
    while (client.connected()) {                      //пока есть соединение с клиентом
      if (client.available()) {                       //если клиент активен
        char c = client.read();                       //считываем посылаемую информацию в переменную "с"

        if (newInfo && c == ' ') {                    //если переменная новой информации = 1 и "с", в которой записан запрос, равен пустой строке
          newInfo = 0;                                //то обнуляем переменную поступления новой информации
        }

        if (c == '$') {                               //если переменная "с", несущая отправленный нам запрос, содержит символ $
          //(все новые запросы) - "$" подразумевает разделение получаемой информации (символов)
          newInfo = 1;                                //то пришла новая информация, ставим метку новой информации в 1
        }

        /************************************************************************************************
          Примечание:
          Символ $ используется как обычный символ, который разделяет 1 от 2  и так далее...
          На практике применяют символ &, который разделяет новые переменные от последующих
          Это использьуется, например, в GET-запросах, которые выглядят подобным образом:
          client.print("GET /controlbar/wp-content/data.php?uid=" + ID + "&type=" + type + "&value=" + value);
          как видите, знак & разделяет значение переменной - ID и переменную type
        ***************************************************************************************************/

        //Проверяем содержание URL - присутствует $1 или $A Реле №1
        if (newInfo == 1) {                              //если есть новая информация
          Serial.println(c);
          if (c == 'A') {                               //и "с" содержит A
            Serial.println("ON");
            digitalWrite(2, HIGH);                     //гасим реле
            EEPROM.write(address1, 1); //сохраняем как On
          }

          if (c == '1') {                              //если "с" содержит 1
            Serial.println("OFF");
            digitalWrite(2, LOW);                     //то зажигаем реле
            EEPROM.write(address1, 0); //сохраняем как Off
          }
        }


        //Проверяем содержание URL - присутствует $2 или $B Реле №2
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'B') {                              //и "с" содержит B
            Serial.println("ON");
            digitalWrite(3, HIGH);                    //гасим реле
            EEPROM.write(address2, 1); //сохраняем как On
          }
          if (c == '2') {                              //если "с" содержит 2
            Serial.println("OFF");
            digitalWrite(3, LOW);                     //то зажигаем реле
            EEPROM.write(address2, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $3 или $C Реле №3
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'C') {                              //и "с" содержит C
            Serial.println("ON");
            digitalWrite(4, HIGH);                    //гасим реле
            EEPROM.write(address3, 1); //сохраняем как On
          }

          if (c == '3') {                              //если "с" содержит 3
            Serial.println("OFF");
            digitalWrite(4, LOW);                     //то зажигаем реле
            EEPROM.write(address3, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $4 или $D Реле №4
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'D') {                              //и "с" содержит D
            Serial.println("ON");
            digitalWrite(5, HIGH);                    //гасим реле
            EEPROM.write(address4, 1); //сохраняем как On
          }

          if (c == '4') {                              //если "с" содержит 4
            Serial.println("OFF");
            digitalWrite(5, LOW);                     //то зажигаем реле
            EEPROM.write(address4, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $5 или $E Реле №5
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'E') {                              //и "с" содержит E
            Serial.println("ON");
            digitalWrite(6, HIGH);                    //гасим реле
            EEPROM.write(address5, 1); //сохраняем как On
          }

          if (c == '5') {                              //если "с" содержит 5
            Serial.println("OFF");
            digitalWrite(6, LOW);                     //то зажигаем реле
            EEPROM.write(address5, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $6 или $F Реле №6
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'F') {                              //и "с" содержит F
            Serial.println("ON");
            digitalWrite(7, HIGH);                    //гасим реле
            EEPROM.write(address6, 1); //сохраняем как On
          }

          if (c == '6') {                              //если "с" содержит 6
            Serial.println("OFF");
            digitalWrite(7, LOW);                     //то зажигаем реле
            EEPROM.write(address6, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $7 или $G Реле №7
        if (newInfo == 1) {                              //если есть новая информация
          Serial.println(c);
          if (c == 'G') {                              //и "с" содержит G
            Serial.println("ON");
            digitalWrite(8, HIGH);                    //гасим реле
            EEPROM.write(address7, 1); //сохраняем как On
          }

          if (c == '7') {                              //если "с" содержит 7
            Serial.println("OFF");
            digitalWrite(8, LOW);                     //то зажигаем реле
            EEPROM.write(address7, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $8 или $H Реле №8
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'H') {                              //и "с" содержит H
            Serial.println("ON");
            digitalWrite(9, HIGH);                    //гасим реле
            EEPROM.write(address8, 1); //сохраняем как On
          }

          if (c == '8') {                              //если "с" содержит 8
            Serial.println("OFF");
            digitalWrite(9, LOW);                     //то зажигаем реле
            EEPROM.write(address8, 0); //сохраняем как Off
          }
        }

        if (c == '\n') {                              //если "с" равен символу новой строки
          currentLineIsBlank = true;                  //то начинаем новую строку
        }
        else if (c != '\r') {                         //иначе, если "с" не равен символу возврата курсора на начало строки
          currentLineIsBlank = false;                 //то получаем символ на текущей строке
        }

        if (c == '\n' && currentLineIsBlank) {        //выводим HTML страницу

          // =============Формируем HTML-страницу=================================================
          client.println("HTTP/1.1 200 OK");          //заголовочная информация
          client.println("Content-Type: text/html; charset=utf-8");  //тип и кодировка страницы
          client.println("Connection: close");
          // client.println("Refresh: 30");           //автоматическое обновление каждые 30 сек
          client.println();
          client.println("<!DOCTYPE HTML>");          //HTML тип документа

          //==============Вывод значений на Web-страницу============================
          client.println("<html>");                                       //открытие тега HTML
          client.print("<title>Arduino Web Server</title>");              //название страницы
          client.print("<H1>Управление освещением через Реле</H1>");      //заголовк на странице
          client.println("=========================================");    //линия из символом =
          client.println("<br />");       //Переходим на новую строку

          // Далее идут кнопки управления...
          client.print("<div>(Реле №1) Родительская спальня</div>");     //надпись над кнопкой
          client.print("<a href=\"/$1\"><button>On</button></a>");       //кнопка включить  №1
          client.print("<a href=\"/$A\"><button>Off</button></a>");      //кнопка выключить №A
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №2) Спальня Риты</div>");             //надпись над кнопкой
          client.print("<a href=\"/$2\"><button>On</button></a>");       //кнопка включить  №2
          client.print("<a href=\"/$B\"><button>Off</button></a>");      //кнопка выключить №B
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №3) Зал</div>");                      //надпись над кнопкой
          client.print("<a href=\"/$3\"><button>On</button></a>");       //кнопка включить  №3
          client.print("<a href=\"/$C\"><button>Off</button></a>");      //кнопка выключить №C
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №4) Моя комната</div>");              //надпись над кнопкой
          client.print("<a href=\"/$4\"><button>On</button></a>");       //кнопка включить  №4
          client.print("<a href=\"/$D\"><button>Off</button></a>");      //кнопка выключить №D
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №5) Кухня</div>");                     //надпись над кнопкой
          client.print("<a href=\"/$5\"><button>On</button></a>");        //кнопка включить  №5
          client.print("<a href=\"/$E\"><button>Off</button></a>");       //кнопка выключить №E
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №6) Прихожая</div>");                 //надпись над кнопкой
          client.print("<a href=\"/$6\"><button>On</button></a>");       //кнопка включить  №6
          client.print("<a href=\"/$F\"><button>Off</button></a>");      //кнопка выключить №F
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №7) Ванна</div>");                    //надпись над кнопкой
          client.print("<a href=\"/$7\"><button>On</button></a>");       //кнопка включить  №7
          client.print("<a href=\"/$G\"><button>Off</button></a>");      //кнопка выключить №G
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №8) Складская</div>");                //надпись над кнопкой
          client.print("<a href=\"/$8\"><button>On</button></a>");       //кнопка включить  №8
          client.print("<a href=\"/$H\"><button>Off</button></a>");      //кнопка выключить №H
          client.println("<br />");       //Переходим на новую строку
          client.println("</html>");    //закрываем тег HTML
          break;                        //выход из цикла
        }

      }

    }
    delay(1);                                          //время на получение новых данных
    client.stop();                                     //закрываем соеднение
  }
}
MajorDoMo + Linux Ubuntu 14.04.5 LTS на Безвентиляторном Мини ПК
CONNECT: http://connect.smartliving.ru/profile/852
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino Классы / Методы....

Сообщение nick7zmail » Вт июн 28, 2016 10:05 am

Otto писал(а):Подскажите как организовать подключение Arduino UNO + Ethernet Shild W5100 к MajorDoMo на Windows. Не нашёл инфы как создать класс с методами и свойствами в которых будет храниться история температуры и другая информация с датчиков (пока в планах, т.к. жду датчики), но уже сделал управление 8 релюшками через Arduino, и хотелось бы их управление сделать через классы. В основном попадается инфа с тем, что нужно про ESP8266, но это не то... Выручайте пожалуйста.
P.S. HTTP команды для управления Реле включения и выключения сделал немного своеобразно: в конце ссылке на вкл./выкл. не 1 и 0 стоит, а на каждое реле из 8 шт. свои значения.
Для дублирования свойств в объекты мд - просто после

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

digitalWrite(№, HIGH);
Добавляете GET запрос (сейчас не помню как это в ардуино делается конкретно, но что-то вроде)

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

getUrl("http://МД.ip/objects/?object=REL<№реле>&op=set&p=status&v=1<0 для LOW>" )
В данном случае статус, к примеру реле1 передастся в REL1.status.

Для управления из МД соотсветственно у того же REL1 (к примеру) создаем метод switch, и вписываем код к примеру

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

if (gg(REL1.status==1)) {
getUrl('адрес.ардуино/то, как вы вызываете параметры?А=1',0);
} else {
getUrl('адрес.ардуино/то, как вы вызываете параметры?А=0',0);
}
Далее добавляете выключатель в меню, привязываете его к свойству REL1.status, и ставите метод при переключении - REL1.switch.
Таким образом будет реализована 2х-сторонняя связь. При переключении из, к примеру, браузера - в МД будет передаваться актуальный статус реле, а при выключении из МД - будет меняться свойство статуса, отправляться соответствующая команда, и еще раз (в качестве подтверждения переключения) будет меняться свойство статус (по идее на тоже самое число, если переключение прошло удачно).
В кратце - как то так.
Мог накосячить со скобками или запятыми, т.к. присал не в редакторе, а просто из головы)). Но это видно будет.

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

UPD: Посмотрел, get для ардуины делается примерно так

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

  HttpClient client;
  client.get("http://www.arduino.cc/asciilogo.txt"); 
Заменить getUrl в первом случае (при запросе из ардуины в МД).
И да - с датчиками примерно так же, только вмето 1/0 - ставите v=<значение температуры>...
Лучше, конечно для всего этого дела MQTT протокол поднять (особенно если нужно частое обновление параметров датчиков)...но это уже совсем другая история))...
За это сообщение автора nick7zmail поблагодарил:
Otto (Вт июн 28, 2016 7:53 pm)
Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Otto
Сообщения: 49
Зарегистрирован: Ср мар 30, 2016 9:12 pm
Откуда: Омск
Благодарил (а): 108 раз
Поблагодарили: 9 раз

Re: Arduino Классы / Методы....

Сообщение Otto » Вт июн 28, 2016 12:25 pm

Не совсем понял как это сделать, пробовал, чёт не получается. Если можно по подробнее объясните пожалуйста
MajorDoMo + Linux Ubuntu 14.04.5 LTS на Безвентиляторном Мини ПК
CONNECT: http://connect.smartliving.ru/profile/852
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino Классы / Методы....

Сообщение nick7zmail » Вт июн 28, 2016 12:33 pm

Да вроде все максимально подробно объяснил....Что конкретно не понятно?
Начните с того что в скетч ардуино после каждого включения реле

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

digitalWrite(№реле, HIGH/LOW);
впишите запрос к серверу МД

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

HttpClient client;
  client.get("http://МД.ip/objects/?object=REL<№реле>&op=set&p=status&v=1<0 для LOW>"); 
В МД создайте класс (к примеру Relays), у класса свойство status. В классе объекты REL1, REL2...REL8 - и посмотрите меняются ли 0/1 при переключении релюшек.
HttpClient client; - можно 1 раз в начале скетча.
За это сообщение автора nick7zmail поблагодарил:
Otto (Вт июн 28, 2016 7:54 pm)
Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Otto
Сообщения: 49
Зарегистрирован: Ср мар 30, 2016 9:12 pm
Откуда: Омск
Благодарил (а): 108 раз
Поблагодарили: 9 раз

Re: Arduino Классы / Методы....

Сообщение Otto » Вт июн 28, 2016 2:23 pm

nick7zmail писал(а):Да вроде все максимально подробно объяснил....Что конкретно не понятно?
Начните с того что в скетч ардуино после каждого включения реле

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

digitalWrite(№реле, HIGH/LOW); 
впишите запрос к серверу МД

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

HttpClient client;
  client.get("http://МД.ip/objects/?object=REL<№реле>&op=set&p=status&v=1<0 для LOW>");
В МД создайте класс (к примеру Relays), у класса свойство status. В классе объекты REL1, REL2...REL8 - и посмотрите меняются ли 0/1 при переключении релюшек.
HttpClient client; - можно 1 раз в начале скетча.

При компиляции ругается: 'HttpClient' was not declared in this scope
и error: 'class EthernetClient' has no member named 'get'

И кстати, правильно ли я вставил код касаемо фигурных скобок?
СпойлерПоказать

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

#include <EEPROM.h>            //библиотека энергонезависимой памяти
#include <SPI.h>              //библиотека для работы с SPI
#include <Ethernet.h>        //библиотека для работы с Ethernet 
boolean newInfo = 0;        //переменная для новой информации
//MAC адрес вашего Ethernet-модуля
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };

//указываем IP адрес
IPAddress ip(192, 168, 1, 74); //пример МОЕГО IP адреса, вы вводите сюда СВОЙ

//инифиализация библиотеки Ethernet server library
//порт 80 по умолчанию для HTTP
EthernetServer server(80);

//адреса памяти для Реле в EEPROM
int address1 = 0;
int address2 = 0;
int address3 = 0;
int address4 = 0;
int address5 = 0;
int address6 = 0;
int address7 = 0;
int address8 = 0;

void setup()
{
  //инициализируем 8 пинов как выходы для реле
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  // =============Проверка циклов считывания EEPROM=============================
  //цикл считывания значения из EEPROM для реле №1
  if ( EEPROM.read(address1) ) {
    digitalWrite(2, HIGH);
  } else {
    digitalWrite(2, LOW);
  }

  //цикл считывания значения из EEPROM для реле №2
  if ( EEPROM.read(address2) ) {
    digitalWrite(3, HIGH);
  } else {
    digitalWrite(3, LOW);
  }

  //цикл считывания значения из EEPROM для реле №3
  if ( EEPROM.read(address3) ) {
    digitalWrite(4, HIGH);
  } else {
    digitalWrite(4, LOW);
  }

  //цикл считывания значения из EEPROM для реле №4
  if ( EEPROM.read(address4) ) {
    digitalWrite(5, HIGH);
  } else {
    digitalWrite(5, LOW);
  }

  //цикл считывания значения из EEPROM для реле №5
  if ( EEPROM.read(address5) ) {
    digitalWrite(6, HIGH);
  } else {
    digitalWrite(6, LOW);
  }

  //цикл считывания значения из EEPROM для реле №6
  if ( EEPROM.read(address6) ) {
    digitalWrite(7, HIGH);
  } else {
    digitalWrite(7, LOW);
  }

  //цикл считывания значения из EEPROM для реле №7
  if ( EEPROM.read(address7) ) {
    digitalWrite(8, HIGH);
  } else {
    digitalWrite(8, LOW);
  }

  //цикл считывания значения из EEPROM для реле №8
  if ( EEPROM.read(address8) ) {
    digitalWrite(9, HIGH);
  } else {
    digitalWrite(9, LOW);
  }

  //запускаем сервер с указанными ранее MAC и вашим IP
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
}

void loop()
{
  //принимаем данные, посылаемые клиентом
  EthernetClient client = server.available();
  if (client) {                                       //если запрос оканчивается пустой строкой
    boolean currentLineIsBlank = true;                //ставим метку об окончании запроса (дословно: текущая линия чиста)
    while (client.connected()) {                      //пока есть соединение с клиентом
      if (client.available()) {                       //если клиент активен
        char c = client.read();                       //считываем посылаемую информацию в переменную "с"

        if (newInfo && c == ' ') {                    //если переменная новой информации = 1 и "с", в которой записан запрос, равен пустой строке
          newInfo = 0;                                //то обнуляем переменную поступления новой информации
        }

        if (c == '$') {                               //если переменная "с", несущая отправленный нам запрос, содержит символ $
          //(все новые запросы) - "$" подразумевает разделение получаемой информации (символов)
          newInfo = 1;                                //то пришла новая информация, ставим метку новой информации в 1
        }

        /************************************************************************************************
          Примечание:
          Символ $ используется как обычный символ, который разделяет 1 от A  и так далее...
          На практике применяют символ &, который разделяет новые переменные от последующих
          Это использьуется, например, в GET-запросах, которые выглядят подобным образом:
          client.print("GET /controlbar/wp-content/data.php?uid=" + ID + "&type=" + type + "&value=" + value);
          как видите, знак & разделяет значение переменной - ID и переменную type
        ***************************************************************************************************/

        //Проверяем содержание URL - присутствует $1 или $A Реле №1
        if (newInfo == 1) {                              //если есть новая информация
          Serial.println(c);
          if (c == 'A') {                               //и "с" содержит A
            Serial.println("ON");
            digitalWrite(2, HIGH);                     //гасим реле
            EEPROM.write(address1, 1); //сохраняем как On
          }

          if (c == '1') {                              //если "с" содержит 1
            Serial.println("OFF");
            digitalWrite(2, LOW);                     //то зажигаем реле
            EEPROM.write(address1, 0); //сохраняем как Off
          }
           [color=#FF0000]HttpClient client;
          client.get("http://192.168.1.70:80/objects/?object=Lamp1&op=m&m=turnOff&", 0);
          client.get("http://192.168.1.70:80/objects/?object=Lamp1&op=m&m=turnOn&", 1);[/color]
        }

        //Проверяем содержание URL - присутствует $2 или $B Реле №2
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'B') {                              //и "с" содержит B
            Serial.println("ON");
            digitalWrite(3, HIGH);                    //гасим реле
            EEPROM.write(address2, 1); //сохраняем как On
          }
          if (c == '2') {                              //если "с" содержит 2
            Serial.println("OFF");
            digitalWrite(3, LOW);                     //то зажигаем реле
            EEPROM.write(address2, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $3 или $C Реле №3
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'C') {                              //и "с" содержит C
            Serial.println("ON");
            digitalWrite(4, HIGH);                    //гасим реле
            EEPROM.write(address3, 1); //сохраняем как On
          }

          if (c == '3') {                              //если "с" содержит 3
            Serial.println("OFF");
            digitalWrite(4, LOW);                     //то зажигаем реле
            EEPROM.write(address3, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $4 или $D Реле №4
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'D') {                              //и "с" содержит D
            Serial.println("ON");
            digitalWrite(5, HIGH);                    //гасим реле
            EEPROM.write(address4, 1); //сохраняем как On
          }

          if (c == '4') {                              //если "с" содержит 4
            Serial.println("OFF");
            digitalWrite(5, LOW);                     //то зажигаем реле
            EEPROM.write(address4, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $5 или $E Реле №5
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'E') {                              //и "с" содержит E
            Serial.println("ON");
            digitalWrite(6, HIGH);                    //гасим реле
            EEPROM.write(address5, 1); //сохраняем как On
          }

          if (c == '5') {                              //если "с" содержит 5
            Serial.println("OFF");
            digitalWrite(6, LOW);                     //то зажигаем реле
            EEPROM.write(address5, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $6 или $F Реле №6
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'F') {                              //и "с" содержит F
            Serial.println("ON");
            digitalWrite(7, HIGH);                    //гасим реле
            EEPROM.write(address6, 1); //сохраняем как On
          }

          if (c == '6') {                              //если "с" содержит 6
            Serial.println("OFF");
            digitalWrite(7, LOW);                     //то зажигаем реле
            EEPROM.write(address6, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $7 или $G Реле №7
        if (newInfo == 1) {                              //если есть новая информация
          Serial.println(c);
          if (c == 'G') {                              //и "с" содержит G
            Serial.println("ON");
            digitalWrite(8, HIGH);                    //гасим реле
            EEPROM.write(address7, 1); //сохраняем как On
          }

          if (c == '7') {                              //если "с" содержит 7
            Serial.println("OFF");
            digitalWrite(8, LOW);                     //то зажигаем реле
            EEPROM.write(address7, 0); //сохраняем как Off
          }
        }

        //Проверяем содержание URL - присутствует $8 или $H Реле №8
        if (newInfo == 1) {                             //если есть новая информация
          Serial.println(c);
          if (c == 'H') {                              //и "с" содержит H
            Serial.println("ON");
            digitalWrite(9, HIGH);                    //гасим реле
            EEPROM.write(address8, 1); //сохраняем как On
          }

          if (c == '8') {                              //если "с" содержит 8
            Serial.println("OFF");
            digitalWrite(9, LOW);                     //то зажигаем реле
            EEPROM.write(address8, 0); //сохраняем как Off
          }
        }

        if (c == '\n') {                              //если "с" равен символу новой строки
          currentLineIsBlank = true;                  //то начинаем новую строку
        }
        else if (c != '\r') {                         //иначе, если "с" не равен символу возврата курсора на начало строки
          currentLineIsBlank = false;                 //то получаем символ на текущей строке
        }

        if (c == '\n' && currentLineIsBlank) {        //выводим HTML страницу

          // =============Формируем HTML-страницу=================================================
          client.println("HTTP / 1.1 200 OK");          //заголовочная информация
          client.println("Content - Type: text / html; charset = utf - 8");  //тип и кодировка страницы
          client.println("Connection: close");
          // client.println("Refresh: 30");           //автоматическое обновление каждые 30 сек
          client.println();
          client.println(" < !DOCTYPE HTML > ");          //HTML тип документа

          //==============Вывод значений на Web-страницу============================
          client.println("<html>");                                       //открытие тега HTML
          client.print("<title>Arduino Web Server < / title > ");              //название страницы
          client.print("<H1>Управление освещением через Реле < / H1 > ");      //заголовк на странице
          client.println(" == == == == == == == == == == == == == == == == == == == == = ");    //линия из символом =
          client.println(" < br / > ");       //Переходим на новую строку

          // Далее идут кнопки управления...
          client.print("<div>(Реле №1) Родительская спальня < / div > ");     //надпись над кнопкой
          client.print(" < a href = \"/$1\"><button>On</button></a>");   //кнопка включить  №1
          client.print("<a href=\"/$A\"><button>Off</button></a>");      //кнопка выключить №A
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №2) Спальня Риты</div>");             //надпись над кнопкой
          client.print("<a href=\"/$2\"><button>On</button></a>");       //кнопка включить  №2
          client.print("<a href=\"/$B\"><button>Off</button></a>");      //кнопка выключить №B
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №3) Зал</div>");                      //надпись над кнопкой
          client.print("<a href=\"/$3\"><button>On</button></a>");       //кнопка включить  №3
          client.print("<a href=\"/$C\"><button>Off</button></a>");      //кнопка выключить №C
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №4) Моя комната</div>");              //надпись над кнопкой
          client.print("<a href=\"/$4\"><button>On</button></a>");       //кнопка включить  №4
          client.print("<a href=\"/$D\"><button>Off</button></a>");      //кнопка выключить №D
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №5) Кухня</div>");                     //надпись над кнопкой
          client.print("<a href=\"/$5\"><button>On</button></a>");        //кнопка включить  №5
          client.print("<a href=\"/$E\"><button>Off</button></a>");       //кнопка выключить №E
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №6) Прихожая</div>");                 //надпись над кнопкой
          client.print("<a href=\"/$6\"><button>On</button></a>");       //кнопка включить  №6
          client.print("<a href=\"/$F\"><button>Off</button></a>");      //кнопка выключить №F
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №7) Ванна</div>");                    //надпись над кнопкой
          client.print("<a href=\"/$7\"><button>On</button></a>");       //кнопка включить  №7
          client.print("<a href=\"/$G\"><button>Off</button></a>");      //кнопка выключить №G
          client.println("<br />");       //Переходим на новую строку
          client.println("<br />");       //Переходим на новую строку

          client.print("<div>(Реле №8) Складская</div>");                //надпись над кнопкой
          client.print("<a href=\"/$8\"><button>On</button></a>");       //кнопка включить  №8
          client.print("<a href=\"/$H\"><button>Off</button></a>");      //кнопка выключить №H
          client.println("<br />");       //Переходим на новую строку
          client.println("</html>");    //закрываем тег HTML
          break;                        //выход из цикла
        }

      }

    }
    delay(1);                                          //время на получение новых данных
    client.stop();                                     //закрываем соеднение
  }
} 
MajorDoMo + Linux Ubuntu 14.04.5 LTS на Безвентиляторном Мини ПК
CONNECT: http://connect.smartliving.ru/profile/852
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino Классы / Методы....

Сообщение nick7zmail » Вт июн 28, 2016 2:26 pm

Ну а как же библиотеку то подключить

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

#include <HttpClient.h>          
в начале скетча
Касательно скобок вроде все норм. Делать лучше через set

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

&op=set&p=status&v=1
а не через op=m...так реально проще, и свойство выставляется напрямую. А через op=m - в принимающем методе TurnOn и TurnOff должен быть код еще. И да- ", 1" и ", 0" не нужны.
Проще код для вашего случая привести)))

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

#include <HttpClient.h>  //в начало скетча
HttpClient HT_client;//в начало loop{}

 if (newInfo == 1) {                              //если есть новая информация
          Serial.println(c);
          if (c == 'A') {                               //и "с" содержит A
            Serial.println("ON");
            digitalWrite(2, HIGH);                     //гасим реле
            EEPROM.write(address1, 1); //сохраняем как On
HT_client.get("http://192.168.1.70:80/objects/?object=Lamp1&op=set&p=status&v=0");
          }

          if (c == '1') {                              //если "с" содержит 1
            Serial.println("OFF");
            digitalWrite(2, LOW);                     //то зажигаем реле
            EEPROM.write(address1, 0); //сохраняем как Off
HT_client.get("http://192.168.1.70:80/objects/?object=Lamp1&op=set&p=status&v=1");
          }
           
        }
PS: переименовал httpclient, т.к. просто client у вас есть уже.
PPS: Возможно 1 и 0 перепутан. В зависимости от того как вы реле подключали.
За это сообщение автора nick7zmail поблагодарил:
Otto (Вт июн 28, 2016 7:53 pm)
Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Otto
Сообщения: 49
Зарегистрирован: Ср мар 30, 2016 9:12 pm
Откуда: Омск
Благодарил (а): 108 раз
Поблагодарили: 9 раз

Re: Arduino Классы / Методы....

Сообщение Otto » Вт июн 28, 2016 7:53 pm

nick7zmail писал(а):Ну а как же библиотеку то подключить

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

#include <HttpClient.h>             
в начале скетча
Касательно скобок вроде все норм. Делать лучше через set

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

&op=set&p=status&v=1
а не через op=m...так реально проще, и свойство выставляется напрямую. А через op=m - в принимающем методе TurnOn и TurnOff должен быть код еще. И да- ", 1" и ", 0" не нужны.
Проще код для вашего случая привести)))

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

#include <HttpClient.h>  //в начало скетча
HttpClient HT_client;//в начало loop{}

 if (newInfo == 1) {                              //если есть новая информация
          Serial.println(c);
          if (c == 'A') {                               //и "с" содержит A
            Serial.println("ON");
            digitalWrite(2, HIGH);                     //гасим реле
            EEPROM.write(address1, 1); //сохраняем как On
HT_client.get("http://192.168.1.70:80/objects/?object=Lamp1&op=set&p=status&v=0");
          }

          if (c == '1') {                              //если "с" содержит 1
            Serial.println("OFF");
            digitalWrite(2, LOW);                     //то зажигаем реле
            EEPROM.write(address1, 0); //сохраняем как Off
HT_client.get("http://192.168.1.70:80/objects/?object=Lamp1&op=set&p=status&v=1");
          }
           
        } 
PS: переименовал httpclient, т.к. просто client у вас есть уже.
PPS: Возможно 1 и 0 перепутан. В зависимости от того как вы реле подключали.
Да я только начал изучать как пользоваться Arduino, поэтому очень слабо пока знаю что да как. Спасибо большое за помощь и терпение. Всё почти получилось, только появилась следующая проблема. Вроде код не большой, но из-за этих библиотек хавает много памяти. После первого включения или отключения любой релюшки шилд то ли Ардуинка виснут намертво, и так работает только с 1 разкоментированной строчкой. Если хоть одну строчку ещё разкоментирую, то вообще не грузится Web интерфейс. Может как то облегчить можно код, кто знает?
Вложения
img-2016-06-28-22-39-09.png
img-2016-06-28-22-39-09.png (79.08 КБ) 9721 просмотр
MajorDoMo + Linux Ubuntu 14.04.5 LTS на Безвентиляторном Мини ПК
CONNECT: http://connect.smartliving.ru/profile/852
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino Классы / Методы....

Сообщение nick7zmail » Вт июн 28, 2016 8:01 pm

В уно на столько мало памяти? Оо Фигасе, не знал...у самого мега...
Видимо как раз и виснет из-за недостатка памяти...

На самом деле - с самого начала хотел сказать что код далеко не оптимальный...Но переписывать было лень, если честно....
По идее его можно написать в разы короче...просто сделать 1 функцию на включение/выключение релюшек, и вызывать её с заданными параметрами - номерами релюшек и статусом....
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Otto
Сообщения: 49
Зарегистрирован: Ср мар 30, 2016 9:12 pm
Откуда: Омск
Благодарил (а): 108 раз
Поблагодарили: 9 раз

Re: Arduino Классы / Методы....

Сообщение Otto » Вт июн 28, 2016 8:40 pm

nick7zmail писал(а):В уно на столько мало памяти? Оо Фигасе, не знал...у самого мега...
Видимо как раз и виснет из-за недостатка памяти...

На самом деле - с самого начала хотел сказать что код далеко не оптимальный...Но переписывать было лень, если честно....
По идее его можно написать в разы короче...просто сделать 1 функцию на включение/выключение релюшек, и вызывать её с заданными параметрами - номерами релюшек и статусом....
У Вас нет каких либо наработок с примером, и напишите какие функции нужны будут для изучения, хочу попробовать дальше разобраться на сколько смогу и уменьшить в объёме код. Что я хочу от этого проекта: Управлять восемью Реле через Ethernet Shild с возможностью запоминания последнего состояния реле и иметь двухстороннюю связь. Остальные датчики я уже мысленно отбрасываю, можно ведь и 2 Ардуинки использовать для разных функций))
MajorDoMo + Linux Ubuntu 14.04.5 LTS на Безвентиляторном Мини ПК
CONNECT: http://connect.smartliving.ru/profile/852
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino Классы / Методы....

Сообщение nick7zmail » Вт июн 28, 2016 9:00 pm

Похожая наработка тут http://majordomo.smartliving.ru/forum/v ... 906#p32906
Но она для AMS...uno AMS не потянет, но куски кода вы можете брать оттуда. Там есть похожая функция - rel_sw вроде называлась...
Arduino вообще такая штука - много кода нужно дорабатывать/разрабатывать самому, под ваши потребности...
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Ответить