проблема с кодом для SD Card Web Server с использованием Ajax
- Войдите на сайт для отправки комментариев
Всем доброго времени суток.
Постигаю азы Arduino. Работаю над проектом управления освещением через веб браузер (при нажатии кнопки включения света в браузере Arduino подает сигнал отключения через радиопередатчик 433 мгц).
Скетч был взят из следующей статьи: http://startingelectronics.com/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-IO/
Скетч работает нормально только если закомментировать строчки под №132, 138 и далее по аналогии. А если убрать комментарии вебстраница не грузится. Проводил также опыт : строчки 132, 138 и по аналогии комментировал, загружал скетч, загружал страницу.....далее убирал комментарии, перезагружал скетч (страница в браузере остается открытой) и нажимал кнопки включения света - свет включался и отключался. Получается, что проблема в загрузке страницы из-за этих строчек.
Подскажите, плз, как мне исправить скетч, чтобы веб страница грузилась сразу и без костылей, чтобы веббраузер работал корректно?
Сылка на проект: https://drive.google.com/open?id=0B6rOXTl_OoAqfkhyQ0tLRkFVbHN2aFljZXZscTAtMllaR3JGX3RmdlUwcjNJS0V4RzM3NjQ&authuser=0
Код скетча:
/*-------------------------------------------------------------- Program: eth_websrv_SD_Ajax_in_out Author: W.A. Smith, http://startingelectronics.com --------------------------------------------------------------*/ #include <SPI.h> #include <Ethernet.h> #include <SD.h> // size of buffer used to capture HTTP requests #define REQ_BUF_SZ 60 #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); // MAC address from Ethernet shield sticker under board byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; IPAddress ip(192, 168, 0, 70); // IP address, may need to change depending on network EthernetServer server(80); // create a server at port 80 File webFile; // the web page file on the SD card char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string char req_index = 0; // index into HTTP_req buffer boolean LED_state[4] = {0}; // stores the states of the LEDs void setup() { mySwitch.enableTransmit(9); // Using Pin #9 // disable Ethernet chip pinMode(10, OUTPUT); digitalWrite(10, HIGH); Serial.begin(9600); // for debugging // initialize SD card Serial.println("Initializing SD card..."); if (!SD.begin(4)) { Serial.println("ERROR - SD card initialization failed!"); return; // init failed } Serial.println("SUCCESS - SD card initialized."); // check for index.htm file if (!SD.exists("index.htm")) { Serial.println("ERROR - Can't find index.htm file!"); return; // can't find index file } Serial.println("SUCCESS - Found index.htm file."); Ethernet.begin(mac, ip); // initialize Ethernet device server.begin(); // start to listen for clients } void loop() { EthernetClient client = server.available(); // try to get client if (client) { // got client? boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { // данные client доступные для чтения char c = client.read(); // чтение 1 byte (character) от client // ограничение размера принятого запроса HTTP // buffer first part of HTTP request in HTTP_req array (string) // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1) if (req_index < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // save HTTP request character req_index++; } // last line of client request is blank and ends with \n // respond to client only after last line received if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); // remainder of header follows below, depending on if // web page or XML page is requested // Ajax request - send XML file if (StrContains(HTTP_req, "ajax_inputs")) { // send rest of HTTP header client.println("Content-Type: text/xml"); client.println("Connection: keep-alive"); client.println(); SetLEDs(); // send XML file containing input states XML_response(client); } else { // web page request // send rest of HTTP header client.println("Content-Type: text/html"); client.println("Connection: keep-alive"); client.println(); // send web page webFile = SD.open("index.htm"); // open web page file if (webFile) { while(webFile.available()) { client.write(webFile.read()); // send web page to client } webFile.close(); } } // display received HTTP request on serial port Serial.print(HTTP_req); // reset buffer index and all buffer elements to 0 req_index = 0; StrClear(HTTP_req, REQ_BUF_SZ); break; } // every line of text received from the client ends with \r\n if (c == '\n') { // last character on line of received text // starting new line with next character read currentLineIsBlank = true; } else if (c != '\r') { // a text character was received from client currentLineIsBlank = false; } } // end if (client.available()) } // end while (client.connected()) delay(1); // give the web browser time to receive the data client.stop(); // close the connection } // end if (client) } // checks if received HTTP request is switching on/off LEDs // also saves the state of the LEDs void SetLEDs(void) { // LED 1 (pin 8) if (StrContains(HTTP_req, "LED1=1")) { LED_state[0] = 1; // save LED state //mySwitch.send(13747136, 24); //delay(1000); digitalWrite(8, HIGH); } else if (StrContains(HTTP_req, "LED1=0")) { LED_state[0] = 0; // save LED state //mySwitch.send(13747136, 24); //delay(1000); digitalWrite(8, LOW); } // LED 2 (pin 9) if (StrContains(HTTP_req, "LED2=1")) { LED_state[1] = 1; // save LED state //mySwitch.send(13746992, 24); //delay(1000); //digitalWrite(9, HIGH); } else if (StrContains(HTTP_req, "LED2=0")) { LED_state[1] = 0; // save LED state //mySwitch.send(13746992, 24); //delay(1000); //digitalWrite(9, LOW); } // LED 3 (pin 10) if (StrContains(HTTP_req, "LED3=1")) { LED_state[2] = 1; // save LED state //mySwitch.send(13746956, 24); //delay(1000); //digitalWrite(10, HIGH); } else if (StrContains(HTTP_req, "LED3=0")) { LED_state[2] = 0; // save LED state //mySwitch.send(13746956, 24); //delay(1000); //digitalWrite(10, LOW); } // LED 4 (pin 11) if (StrContains(HTTP_req, "LED4=1")) { LED_state[3] = 1; // save LED state //mySwitch.send(13746947, 24); //delay(1000); //digitalWrite(11, HIGH); } else if (StrContains(HTTP_req, "LED4=0")) { LED_state[3] = 0; // save LED state //mySwitch.send(13746947, 24); //delay(1000); //digitalWrite(11, LOW); } } // send the XML file with analog values, switch status // and LED status void XML_response(EthernetClient cl) { cl.print("<?xml version = \"1.0\" ?>"); cl.print("<inputs>"); // button LED states // LED1 cl.print("<LED>"); if (LED_state[0]) { cl.print("on"); } else { cl.print("off"); } cl.println("</LED>"); // LED2 cl.print("<LED>"); if (LED_state[1]) { cl.print("on"); } else { cl.print("off"); } cl.println("</LED>"); // LED3 cl.print("<LED>"); if (LED_state[2]) { cl.print("on"); } else { cl.print("off"); } cl.println("</LED>"); // LED4 cl.print("<LED>"); if (LED_state[3]) { cl.print("on"); } else { cl.print("off"); } cl.println("</LED>"); cl.print("</inputs>"); } // sets every element of str to 0 (clears array) void StrClear(char *str, char length) { for (int i = 0; i < length; i++) { str[i] = 0; } } // searches for the string sfind in the string str // returns 1 if string found // returns 0 if string not found char StrContains(char *str, char *sfind) { char found = 0; char index = 0; char len; len = strlen(str); if (strlen(sfind) > len) { return 0; } while (index < len) { if (str[index] == sfind[found]) { found++; if (strlen(sfind) == found) { return 1; } } else { found = 0; } index++; } return 0; }