Помощь подключить кнопку к имеющемуся скетчу

artyom.clachin
Offline
Зарегистрирован: 06.02.2017

Доброго времени суток ардуинщики, второй день мучаюсь над вопросом о подключении кнопки к моему скетчу! 
Помогите пожалуйста, как вписать код с кнопкой в скетч, к примеру у меня уже подключена кнопка (на пин 10) в скетче я могу управлять светодиодами (pin 6,7,8,9) но очень хотелось бы к примеру (пусть это будет pin 6) включать pin 6 через web-интерфейс а выключать с кнопки и обратно!
Прикрепляю код, буду очень признателен если обьясните мне подробно или вдруг найдутся заметки по улучшению кода в плане компактности буду тоже очень признателен!
 

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

  Адрес включения светодиода:
  IP-АДРЕС - тот IP, полученный при запуске примера DhcpAdressPrinter

  <a href="/$1">http://IP-АДРЕС/$1</a>

  Для того, чтобы выключить:
  <a href="/$2">http://IP-АДРЕС/$2</a>

  и так далее....
*/
#include <EEPROM.h>           //библиотека энергонезависимой памяти
#include <SPI.h>              //библиотека для работы с SPI
#include <Ethernet.h>         //библиотека для работы с Ethernet 
boolean newInfo = 0;          //переменная для новой информации
//MAC адрес вашего Ethernet-модуля, если его у вас нет, введите любой
//или оставьте тот, что в примере (если не работает вставте сюда свой MAC адресс
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

//указываем IP адрес
//будьте внимательны! IP адрес указывается тот, который вы получили запустив пример DhcpAdressPrinter
IPAddress ip(192, 168, 0, 99); //пример МОЕГО IP адреса, вы вводите сюда СВОЙ

//инифиализация библиотеки Ethernet server library
EthernetServer server(80);


int i; //Для циклов for

void setup()
{
  pinMode(1, OUTPUT);       //инициализируем 7 пин как выход для реле
  pinMode(6, OUTPUT);       //инициализируем 7 пин как выход для реле
  pinMode(7, OUTPUT);       //инициализируем 7 пин как выход для реле
  pinMode(8, OUTPUT);       //инициализируем 8 пин как выход для реле
  pinMode(9, OUTPUT);       //инициализируем 9 пин как выход для реле
  if ( EEPROM.read(4) ) {digitalWrite(6, HIGH);} else {digitalWrite(6, LOW);} //проверяем состояние 6 реле и возвращаем его состояние
  if ( EEPROM.read(3) ) {digitalWrite(7, HIGH);} else {digitalWrite(7, LOW);} //проверяем состояние 7 реле и возвращаем его состояние
  if ( EEPROM.read(1) ) {digitalWrite(8, HIGH);} else {digitalWrite(8, LOW);} //проверяем состояние 8 реле и возвращаем его состояние
  if ( EEPROM.read(2) ) {digitalWrite(9, HIGH);} else {digitalWrite(9, LOW);} //проверяем состояние 9 реле и возвращаем его состояние


  //запускаем сервер с указанными ранее 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 или $2 Реле №1
        if (newInfo == 1) {                            //если есть новая информация
          Serial.println(c);
          if (c == '2') {                              //и "с" содержит 2
            Serial.println("ON");
            digitalWrite(8, HIGH);                     //гасим реле
            EEPROM.write(1, 1);                        //записываем данные о выключенном реле
          }

          if (c == '1') {                              //если "с" содержит 1
            Serial.println("OFF");
            digitalWrite(8, LOW);                      //то зажигаем реле
            EEPROM.write(1, 0);                        //записываем данные о включенном реле
          }
        }

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

          if (c == '3') {                              //если "с" содержит 3
            Serial.println("OFF");
            digitalWrite(9, LOW);                      //то зажигаем реле
            EEPROM.write(2, 0);                        //записываем данные о включенном реле
          }
        }

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

          if (c == '5') {                              //если "с" содержит 5
            Serial.println("OFF");
            digitalWrite(7, LOW);                      //то зажигаем реле
            EEPROM.write(3, 0);                        //записываем данные о включенном реле
          }
        }


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

          if (c == '7') {                              //если "с" содержит 7
            Serial.println("OFF");
            digitalWrite(6, LOW);                      //то зажигаем реле
            EEPROM.write(4, 0);                        //записываем данные о включенном реле
          }
        }

        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("<body>");
          client.print("<H1>Управление освещением через Реле</H1>");                  //заголовк на странице
          client.println("==============================");                           //линия из символов =
          client.println("<br />");     //Переходим на новую строку
          // Далее идут кнопки...
          
          client.print("<table border=\"1\">");
          client.println("<tr>");
          client.println("<th>Выходы</th>");
          client.println("<th>Состояние</th>");
          client.println("</tr>");
          client.println("<tr>");
          client.println("<td>");
          client.print("<div><center>pin 6</center></div>");
          client.print("<a href=\"/$8\"><button>On</button></a>");
          client.print("<a href=\"/$7\"><button>Off</button></a>");
          client.println("</td>");
          if ( EEPROM.read(4) ) {client.println("<td>Включено</td>");} else {client.println("<td>Выключено</td>");}
          client.println("</tr>");
          client.println("<tr>");
          client.println("<td>");
          client.print("<div><center>pin 7</center></div>");
          client.print("<a href=\"/$6\"><button>On</button></a>");
          client.print("<a href=\"/$5\"><button>Off</button></a>");
          client.println("</td>");
          if ( EEPROM.read(3) ) {client.println("<td>Включено</td>");} else {client.println("<td>Выключено</td>");}
          client.println("</tr>");
          client.println("<tr>");
          client.println("<td>");
          client.print("<div><center>pin 8</center></div>"); 
          client.print("<a href=\"/$2\"><button>On</button></a>");
          client.print("<a href=\"/$1\"><button>Off</button></a>");
          client.println("</td>");
          if ( EEPROM.read(1) ) {client.println("<td>Включено</td>");} else {client.println("<td>Выключено</td>");}
          client.println("</tr>");
          client.print("<tr>");
          client.print("<td>");
          client.print("<div><center>pin 9</center></div>"); 
          client.print("<a href=\"/$4\"><button>On</button></a>");
          client.print("<a href=\"/$3\"><button>Off</button></a>");
          client.print("</td>");
          if ( EEPROM.read(2) ) {client.println("<td>Включено</td>");} else {client.println("<td>Выключено</td>");}
          client.print("</tr>");
          client.println("</table>");
          client.println("<br />");
          client.print("<a href=\"/$7\&/$5\&/$1\&/$3\"><button>Выключить все</button></a>");
          client.println("<br />");
          client.println("<br />");
          client.print("<a href=\"/$8\&/$6\&/$2\&/$4\"><button>Включить все</button></a>");
          client.println("</body>");
          client.println("</html>");                                                  //закрываем тег HTML
          break;                                                                      //выход из цикла
        }

      }

    }
    delay(1);                                                                         //время на получение новых данных
    client.stop();                                                                    //закрываем соеднение
  }
 }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

artyom.clachin пишет:

к моему скетчу! 

Точно, не к чужому? Был бы Ваш скетч такого размера, уж кнопку бы как-нибудь подключили бы.

artyom.clachin пишет:

второй день мучаюсь 

Ну, и зачем так сразу сдаваться? Помучайтесь хотя бы недельку, мож чего и получится, заодно и научитесь. Что ж Вы как младенец, только-только обозначилась проблема, сразу "Вя-я-я, давай сиську!". Будьте мужчиной, работайте, решайте проблемы.

 

 

artyom.clachin
Offline
Зарегистрирован: 06.02.2017

Евгений, да скетч изначально я взял на просторах интернета, скетч был совсем прост, с помощью него можно было управлять только одной реле, без проверки на состояние, без записи в енергонезависимую память, так же в скетче не было управления через web, я переделал этот скетч, пусть правда немного коряво, но мне сейчас не до его усовершенствования до красивого вида, я не на выставку его готовлю! Поэтому у меня есть право называть его моим скетчем, особенно в данном случае. Где вы видели что я написал что-то подобное типа "Я сдаюсь я не могу ничего сделать, все бросаю это дело" Я попросил помощи у более опытных людей. Я конечно рад что меня критикуют, пусть даже такой как вы, но все же, есть стимул. А если вы можете только критиковать а не помогать людям, то можете идти!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я с Вашего позволения (или без оного) сам буду решать молу ли я идти, или не могу, и куда именно.