#1 2017-09-02 20:39:37

sqafarov
Участник
Зарегистрирован: 2017-09-02
Сообщений: 5

WEB сервер

Доброго времени суток,

Помогите пожалуйста с кодом, я пытаюсь собрать систему для удаленного управления воротами и шлагбаумами. А во всех примерах которые я нарыл в инете кнопки в веб морде нажимаются и не "отщелкиваются". А мне нужно чтобы было как при нажатии на обыкновенную кнопку (нажал включилась - отпустил отключилась). Ниже привожу код, заранее оговорюсь он не мой. Также не могу задать айпишник, пишу одно а по видимому DHCP меняет его на свой. Из оборудования вот это: Arduino Nano v3, EthernetShield ENC28J60, релюшки обычные ардуиновские, библиотека для EtherCard. Слезно прошу вашей помощи.

/* 
 -----------------------
 Ïîäêëþ÷àºìî ï³íè "ENC28J60 Module" äî Arduino Uno.
 VCC -   3.3V
 GND -    GND
 SCK - Pin 13
 SO  - Pin 12
 SI  - Pin 11
 CS  - Pin 10 Ìîæíà âèáðàòè áóäü-ÿêèé. 
  ------------------
 */

#include <EtherCard.h>  // Ïîäêëþ÷àºì ñêà÷àíó á³áë³îòåêó. https://yadi.sk/d/R57sVoglbhTRN

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // присваиваем mac адрес
static byte myip[] = { 192, 168, 1, 222 };                    // ip в локальной сети
static byte subnet[] = { 255, 255, 255, 0 };  // присваиваем маску подсети
static byte gateway[] = { 192, 168, 1, 1 };   // присваиваем адрес шлюза по умолчанию
static byte hisport[] = { 80 }; // присваиваем порт для подключения


// Áóôåð, ÷èì á³ëüøå äàíèõ íà Web ñòîð³íö³, òèì á³ëüøå ïîòð³áíå çíà÷åííÿ áóôåðà.
byte Ethernet::buffer[1000];
BufferFiller bfill;

// Ìàñèâ çàä³ÿíèõ íîìåð³â ï³í³â Arduino, äëÿ êåðóâàííÿ 4 ðåëå.
int LedPins[] = {
  2,3,4,5};

// Ìàñèâ äëÿ ô³êñàö³¿ çì³í.
boolean PinStatus[] = {
  1,2,3,4};

//-------------

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>";

void homePage()
{
  bfill.emit_p(PSTR("$F"
    "<title>.:: TS Group ::.</title>" 
    "<br>"
    "<h1><p align = center>BARRIER Control Center</p></h1>"
    "<br>"
    "<h2><p align = center>Open the barrier</p></h2>"
    "<p align = center><button><h1><a href=\"?ArduinoPIN1=$F\">$F</a></h1></button></p>"
    "<br>"
    "<h2><p align = center>Stop the barrier</p></h2>"
    "<p align = center><button><h1><a href=\"?ArduinoPIN2=$F\">$F</a></h1></button></p>"  
    "<br>"
    "<h2><p align = center>Close the barrier</p></h2>"
    "<p align = center><button><h1><a href=\"?ArduinoPIN3=$F\">$F</a></h1></button></p>"
    "<br>"
    "<h2><p align = center>Auto</p></h2>"
    "<p align = center><button><h1><a href=\"?ArduinoPIN4=$F\">$F</a></h1></button></p>"),   

  http_OK,
  PinStatus[1]?PSTR("off"):PSTR("on"),
  PinStatus[1]?PSTR("<font color=\"green\"><b>OPENING</b></font>"):PSTR("<font color=\"red\">STAY</font>"),
  PinStatus[2]?PSTR("off"):PSTR("on"),
  PinStatus[2]?PSTR("<font color=\"green\"><b>STOPING</b></font>"):PSTR("<font color=\"red\">STAY</font>"),
  PinStatus[3]?PSTR("off"):PSTR("on"),
  PinStatus[3]?PSTR("<font color=\"green\"><b>CLOSING</b></font>"):PSTR("<font color=\"red\">STAY</font>"),
  PinStatus[4]?PSTR("off"):PSTR("on"),
  PinStatus[4]?PSTR("<font color=\"green\"><b>ENABLE</b></font>"):PSTR("<font color=\"red\">DISABLE</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 àäðåñà íåçðó÷íà, áî ïåð³îäè÷íî çì³íþºòüñÿ. 
  // Íàì äîâåäåòüñÿ ÷àñòî ä³çíàâàòèñÿ, ÿêà àäðåñà íàøî¿ Web ñòîð³íêè.
  ether.printIp("My Router IP: ", ether.myip); // Âèâîäèìî â Serial ìîí³òîð IP àäðåñó, ÿêó íàì ïðèñâî¿â Router. 

  //Òàêîæ ìè ìîæåìî âñòàíîâèòè ñòàòè÷íó IP àäðåñó íàøî¿ ñòîð³íêè ³ çâåðòàòèñÿ äî Arduino ïî í³é 
  
    //ether.staticSetup(myip);

  ether.printIp("My SET IP: ", ether.myip); // Âèâîäèìî â Serial ìîí³òîð ñòàòè÷íó IP àäðåñó. 
  //-----

  for(int i = 0; i <= 4; i++)
  {
    pinMode(LedPins[i],OUTPUT); 
    digitalWrite (LedPins[i],HIGH);
    PinStatus[i]=false;
  }  
}

// --------------------------------------

void loop()
{

  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 <= 3; i++)digitalWrite(LedPins[i],!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("?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 {
        // Page not found
        bfill.emit_p(http_Unauthorized);
      }
    }
    ether.httpServerReply(bfill.position());    // send http response
  }
}

#2 2017-09-02 21:43:35

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 570

Re: WEB сервер

А как вы хотите, что бы вам помогли?

#3 2017-09-02 22:05:06

sqafarov
Участник
Зарегистрирован: 2017-09-02
Сообщений: 5

Re: WEB сервер

Вячеслав Азаров пишет:

А как вы хотите, что бы вам помогли?

Подсказать, направить )) но конечно не посылать ))

#4 2017-09-02 22:17:43

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 570

Re: WEB сервер

Если вы хотите иметь видимый везде сервер то вам придется купить статический IP адрес. Для того, что бы сделать такую кнопку как вам хочется нужно написать обработку событий кнопки на JS и передавть ее состояние серверу по AJAX.

#5 2017-09-02 22:22:53

sqafarov
Участник
Зарегистрирован: 2017-09-02
Сообщений: 5

Re: WEB сервер

Вячеслав Азаров пишет:

Если вы хотите иметь видимый везде сервер то вам придется купить статический IP адрес. Для того, что бы сделать такую кнопку как вам хочется нужно написать обработку событий кнопки на JS и передавть ее состояние серверу по AJAX.

Насчет статики я знаю, а вот обработка JS и передача по Ajax ... это пипец

#6 2017-09-03 19:04:26

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,269

Re: WEB сервер

зачем ajax?
вот есть вариант on / off
https://gist.github.com/bbx10/667e3d4f5f2c0831d00b

а на js есть куча всяких евентов..

надите веб девелопера ) 
он все все сделает. задача то для молодых по рангу.

#7 2017-09-03 19:34:45

sqafarov
Участник
Зарегистрирован: 2017-09-02
Сообщений: 5

Re: WEB сервер

NoName пишет:

зачем ajax?
вот есть вариант on / off
https://gist.github.com/bbx10/667e3d4f5f2c0831d00b

а на js есть куча всяких евентов..

надите веб девелопера ) 
он все все сделает. задача то для молодых по рангу.

Большое спасибо )) Есть такой ))

#8 2017-09-03 20:39:21

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 570

Re: WEB сервер

sqafarov пишет:
NoName пишет:

зачем ajax?
вот есть вариант on / off
https://gist.github.com/bbx10/667e3d4f5f2c0831d00b

а на js есть куча всяких евентов..

надите веб девелопера ) 
он все все сделает. задача то для молодых по рангу.

Большое спасибо )) Есть такой ))

Можно вообще без HTTP обойтись, а страницу, для браузера, хранить у себя на диске. Это кому как хочется.

Редактировался Вячеслав Азаров (2017-09-03 20:40:23)

#9 2017-09-04 11:35:33

sqafarov
Участник
Зарегистрирован: 2017-09-02
Сообщений: 5

Re: WEB сервер

Вячеслав Азаров пишет:
sqafarov пишет:
NoName пишет:

зачем ajax?
вот есть вариант on / off
https://gist.github.com/bbx10/667e3d4f5f2c0831d00b

а на js есть куча всяких евентов..

надите веб девелопера ) 
он все все сделает. задача то для молодых по рангу.

Большое спасибо )) Есть такой ))

Можно вообще без HTTP обойтись, а страницу, для браузера, хранить у себя на диске. Это кому как хочется.

Можно поподробнее?

#10 2017-09-04 12:22:28

Вячеслав Азаров
Участник
Из Запорожье
Зарегистрирован: 2017-05-25
Сообщений: 570

Re: WEB сервер

sqafarov пишет:

Можно поподробнее?

Можно. Вы можете организовать передачу через вэб сокеты, какие вам захочется. И программу делать в браузере совсем не обязательно. Вы же не будете публиковать свои данные и выключатели на весь мир.

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела