Web-сервер с формой некоректно работает

vbogom
Offline
Зарегистрирован: 17.03.2013

Здравствуйте!
Есть проблема. Хочу управлять освещением и с помощью выключателей, и через сеть. Схему сделал, все хорошо работает. Сейчас хочу добавить управление через сеть. Пишу код для веб-сервера. За основу взял код с http://saprinc.ru/content/arduino-veb-server-2.
Код нормально работает, но я хотел бы чтобы страница была бы более информативна для человека. Для этого был добавлен java-скрипт и цветовое оформление управляемых каналов (сейчас данный код закомментирован). Вот здесь и возникает проблема :( Если я хоть что-то разкомментирую, то программа не работает.
Привожу код:

//ver 0.7

//За основу код взят с: http://saprinc.ru/content/arduino-veb-server-2

/*
IN0200080D
 ON - включение
 OF - выключение
 IN - инверсия
 02 - количество сдиговых регистров (на одном сдвиговом регистре 8 каналов), в данном случае 2 регистра (запись в десятичном представлении)
 00 - битовая маска первого управляемого регистра
 08 - битовая маска второго управляемого регистра
 0D - Контрольная сумма (равна O(49)^N(4E)^02^00^08)
 */



#include <SPI.h>
#include <Ethernet.h>

char* masWebBut[16]={
  "IN02010004","IN02020007","IN02040001","IN0208000D","IN02100015","IN02200025","IN02400045","IN02800085",
  "IN02000104","IN02000207","IN02000401","IN0200080D","IN02001015","IN02002025","IN02004045","IN02008085"};//Передаваемые значения по Web, через соответствующие кнопки
byte RegLed1=0;//Значение первого регистра 
byte RegLed2=0;//Значение второго регистра

// MAC адрес нашего  Ethernet шилда
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 200); // IP по которому мы будем обращаться к этой странице
EthernetServer server(80);  // порт 80

String HTTP_req;          //  HTTP запрос

void setup()
{
  Ethernet.begin(mac, ip);  // запускаем Ethernet шилд
  server.begin();           // старт сервера
  Serial.begin(9600);       // старт COM порта
}

void loop()
{
  EthernetClient client = server.available();  // try to get client

  if (client) {  
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {   
        char c = client.read(); 
        HTTP_req += c;  // сохраняем  HTTP запрос по одному символу за раз

        if (c == '\n' && currentLineIsBlank) {
          //отправляем стандартный заголовок 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          // отправляем страницу
          client.println("<!DOCTYPE html>");
          client.println("<html  lang='ru'>");
          client.println("<head>");
//                    client.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Win1251\">");
          client.println("<title>LEDs</title>");

          //Скрипт автообновления
          client.println("<SCRIPT>");
          client.println("<!--");
//                    client.println("function fresh() {document.location=\"http://192.168.1.200/\";}");
//                    client.println("setInterval(\"fresh()\",5000);");
          client.println("-->");
          client.println("</SCRIPT>");



          client.println("</head>");

          client.println("<body>");
          client.println("<h1>LEDs</h1>");
          client.println("<form method='get'>");
          client.println("<table style='text-align: center; width: 100%;' border='1' cellpadding='2' cellspacing='2'><tbody><tr>");

          Visio_LEDs(client);

          client.println("</tr><tr>");
          for (byte i=0;i<16;i++)
          {
            byte j=i+1;
            client.print("<td><button value='");
            client.print(masWebBut[i]);
            client.print("' name='LED");
            client.print(j);
            client.println("'></button></td>");
          };
          client.print("</tr></tbody></table><div style='text-align: center;'>Stat_LEDs=");
          StateLEDs(client);
          client.println("<br>");
          client.println("<button value='OF02FFFF0B' name='alloff'>All Off</button>");
          client.println("<button value='ON02FFFF03' name='allon'>All On</button>");
          client.println("</div></form></body>");
          client.println("</html>");
          break;
        }

        if (c == '\n') {

          currentLineIsBlank = true;
        } 
        else if (c != '\r') {

          currentLineIsBlank = false;
        }
      } 
    } 
    delay(1);      
    client.stop(); // закрытие соединения 
  };
  ChangeLEDs();
}

void ChangeLEDs()
{
  if (HTTP_req.length()==0) return;
  Serial.println("++++++");
  Serial.println(HTTP_req);
  int pos=HTTP_req.indexOf("HTTP");
  Serial.println("------------------------------");
  Serial.print("pos=");
  Serial.println(pos);
  if (pos<10) 
  {
    HTTP_req="";//Очищаем запрос после обработки
    return;
  };

  Serial.print("HTTP_req.substring=");
  Serial.println(HTTP_req.substring(HTTP_req.indexOf("=")+1,pos-1));
  String st=String(HTTP_req.substring(HTTP_req.indexOf("=")+1,pos));
  st.toUpperCase();

  Serial.println(st);//Отладочная информация

  HTTP_req="";//Очищаем запрос после обработки
  byte oper=byte(st.charAt(0))+byte(st.charAt(1));
  String st_Control=st.substring(2,4);

  Serial.print("Count_Reg_str=");
  Serial.println(st_Control); //Отладочная информация

  byte Count_Reg = st_Control.toInt();

  Serial.print("Count_Reg=");
  Serial.println(Count_Reg); //Отладочная информация

  byte RegLed1_t=HexToByte(st.substring(4,6));//Значение первого регистра 
  byte RegLed2_t=HexToByte(st.substring(6,8));//Значение второго регистра 
  st_Control=String(byte(st.charAt(0))^byte(st.charAt(1))^Count_Reg^RegLed1_t^RegLed2_t,HEX);
  if (st_Control.length()==1) st_Control='0'+st_Control;
  st_Control.toUpperCase();

  Serial.println("----------------");//Отладочная информация
  Serial.print("st_Control=");
  Serial.print(st_Control);
  Serial.print(" --- ");
  Serial.print("st.substring=");
  Serial.println(st.substring(8,10));//Отладочная информация
  Serial.println("----------------");//Отладочная информация

  if (!st_Control.equals(st.substring(8,10))) return;
  switch (oper){
  case 157://ON
    RegLed1|=RegLed1_t;
    RegLed2|=RegLed2_t;
    break;
  case 149://OF
    RegLed1&=!RegLed1_t;
    RegLed2&=!RegLed2_t;
    break;
  case 151://IN
    RegLed1^=RegLed1_t;
    RegLed2^=RegLed2_t;
  };

  Serial.println(RegLed1,BIN);//Отладочная информация
  Serial.println(RegLed2,BIN);//Отладочная информация

}


void Visio_LEDs(EthernetClient cl) //"Оформляем" состояние светодиодов
{
  //  byte t=RegLed1;
  //  for (byte i=1; i<9;i++)
  //  {
  //    if (t&1)
  //    {
  //      cl.print("<td style='background-color: rgb(255, 255, 204);'>LED");//Горит светодиод
  //    } else {
  //      cl.print("<td style='background-color: rgb(51, 204, 255);'>LED");//Не горит светодиод
  //    };
  //    cl.print(i);
  //    cl.println("</td>");
  //    t=t>>1;
  //  };
  //  t=RegLed2;
  //  for (byte i=1; i<9;i++)
  //  {
  //    if (t&1)
  //    {
  //      cl.print("<td style='background-color: rgb(255, 255, 204);'>LED");//Горит светодиод
  //    } else {
  //      cl.print("<td style='background-color: rgb(51, 204, 255);'>LED");//Не горит светодиод
  //    };
  //    cl.print(i+8);
  //    cl.println("</td>");
  //    t=t>>1;
  //  };
}

void StateLEDs(EthernetClient cl)
{
  String st=String(RegLed1,HEX);
  if (st.length()==1) st='0'+st;
  String st1=String(RegLed2,HEX);
  if (st1.length()==1) st1='0'+st1;
  st+=st1;
  st1=String(RegLed1^RegLed2,HEX);
  if (st1.length()==1) st1='0'+st1;
  st+=st1;  
  st.toUpperCase();
  cl.println(st);
}

byte HexToByte(String st)
{
  byte result=SymbToByte(st.charAt(0))*16+SymbToByte(st.charAt(1));
  return result; 
}

byte SymbToByte(char c)
{
  byte b = byte(c)-48;
  if (b>9){
    b-=7;
  };
  return b;
}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Какая ардуина известно только Вам, соответственно сколько в ней ОЗУ, тоже знаете только Вы.
При этом все тексты, Вы 'кладете' именно в ОЗУ. Слово PROGMEM, нигде не фигурирует
Если человеку платят мало, а делает он много, то он тоже не будет работать

vbogom
Offline
Зарегистрирован: 17.03.2013

Код выполняю на arduino uno. Память сегодня проверю.

vbogom
Offline
Зарегистрирован: 17.03.2013

Большое спасибо. Видемо действительно из-за оперативки. Будем исправлть...