Web-сервер с формой некоректно работает
- Войдите на сайт для отправки комментариев
Чт, 31/07/2014 - 00:02
Здравствуйте!
Есть проблема. Хочу управлять освещением и с помощью выключателей, и через сеть. Схему сделал, все хорошо работает. Сейчас хочу добавить управление через сеть. Пишу код для веб-сервера. За основу взял код с 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; }
Какая ардуина известно только Вам, соответственно сколько в ней ОЗУ, тоже знаете только Вы.
При этом все тексты, Вы 'кладете' именно в ОЗУ. Слово PROGMEM, нигде не фигурирует
Если человеку платят мало, а делает он много, то он тоже не будет работать
Код выполняю на arduino uno. Память сегодня проверю.
Большое спасибо. Видемо действительно из-за оперативки. Будем исправлть...