RTC vs Ether shield, молчит - no response)
- Войдите на сайт для отправки комментариев
Чт, 24/09/2020 - 20:28
Добрый вечер!
Имеется : arduino uno, DS3231 , Ethernet shield w5200. Пытаюсь их всех подружить. не знаю почему, но когда подключаю библиотеку RTC функционал умирает, без него все работает.
У меня сервер и пару страниц с данными, на основной странице время смог прикрутить только после того как убрал не сколько условий типа, ну все это ж мелочь?!!:
else if (StrContains(HTTP_req, "GET /timer.png")) // { // webFile = SD.open("timer.png"); // if (webFile) // { // client.println("HTTP/1.1 200 OK"); // client.println(); // } // }
на второй странице, по сути где я вообще не обращаюсь ко времени, пол функционала не хочет работать, загрузка страницы есть, имя файла в ардуино отправляет, а загружать данные из флешки и выводить на страницу не хочет. гугл показывает net::ERR_EMPTY_RESPONSE (request.send(null);)
вот код + html +js. Суть, на флешке храниться данные в txt, на странице выбираю дату данных, которые хочу получить, отправляется в ардуино имя файла(н-р 20-05-02) путь постоянен(String fileName="data/"+dateName+".txt"),и считываю с кнопкой загрузка данные вида (10:30 22.04.2020- smth wrong), провожу некоторые манипуляции и вывожу в итоге в виде таблицы данные. Все.
P.S
P.S.S Если кто то протестит, в js нет условия на отсутствие файла с введеной датой.т.е будет пустая страница).
#include <Wire.h> #include <SPI.h> #include <Ethernet.h> #include <SD.h> #include <DS3232RTC.h> #define REQ_BUF_SZ 30 byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; //мак адрес IPAddress ip(192, 168, 1, 5); // айпи адрес сервера EthernetServer server(80); //порт сервера File webFile; EthernetClient client; char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string char req_index = 0; // index into HTTP_req buffer String dateName; void setup() { SD.begin(4); Ethernet.begin(mac, ip); // initialize Ethernet device server.begin(); // start to listen for clients setSyncProvider(RTC.get); } void loop() { String fileName="data/"+dateName+".txt"; //------------------------------ Код для шилда---------------------//// listen for incoming clients client = server.available(); if (client) { boolean currentLineIsBlank = true; // an http request ends with a blank line while (client.connected()) { if (client.available()) { char c = client.read(); if (req_index < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // save HTTP request character req_index++; } if (c == '\n' && currentLineIsBlank) { if (StrContains(HTTP_req, "GET / ") || StrContains(HTTP_req, "GET /chart.htm")) { clientPrintClose(); webFile = SD.open("index.htm"); } else if (StrContains(HTTP_req, "GET /favicon.ico")) { webFile = SD.open("favicon.ico"); if (webFile) { client.println("HTTP/1.1 200 OK"); client.println(); } } // // else if (StrContains(HTTP_req, "GET /fire.png")) // { // webFile = SD.open("EC.png"); // if (webFile) // { // client.println("HTTP/1.1 200 OK"); // client.println(); // } // } // // else if (StrContains(HTTP_req, "GET /temp.png")) // { // webFile = SD.open("temp.png"); // if (webFile) // { // client.println("HTTP/1.1 200 OK"); // client.println(); // } // } // // else if (StrContains(HTTP_req, "GET /timer.png")) // { // webFile = SD.open("timer.png"); // if (webFile) // { // client.println("HTTP/1.1 200 OK"); // client.println(); // } // } // else if (StrContains(HTTP_req, "GET /style.css")) { webFile = SD.open("style.css"); if (webFile) { client.println("HTTP/1.1 200 OK"); client.println(); } } else if (StrContains(HTTP_req,"dat=")) { String Temp = HTTP_req; dateName=Temp.substring(11,19); clientPrintClose(); } else if (StrContains(HTTP_req, "ajax_alarm")) { webFile = SD.open(fileName); if (webFile) { client.println(webFile.read()); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: keep-alive"); client.println(); } } if (webFile) { while (webFile.available()) { client.write(webFile.read()); // send web page to client } webFile.close(); } Serial.println(HTTP_req); Serial.println(dateName); Serial.println(fileName); req_index = 0; StrClear(HTTP_req, REQ_BUF_SZ); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1); // close the connection: client.stop(); } } void StrClear(char *str, char length) { for (int i = 0; i < length; i++) { str[i] = 0; } } 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; } void clientPrintClose() { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connnection: close"); client.println(); }
html+js
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>Alarms</title> <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"> <link rel="StyleSheet" href="style.css"> </head> <body> <header> <hr noshade size="2px" color="white"> </header> <main> <div id="alarm" class ="grid"> <div style="margin:10px 0 0 0;" id="date_alarm_div"><input type="date" id="dat" onmouseout="dateSender()"><input class="buttonz" id="date_ALoader" type ="button" value="Load" onClick="GetAlarmState()"></div> <div id="info_header"><div>Time</div> <div>State</div></div> <div id="info"></div> </div> </main> <footer> <hr size="1px" color="white"> <!--Прямая линия под таблицей--> </footer> <script> function GetAlarmState() { nocache = "&nocache=" + Math.random() * 1000000; var request = new XMLHttpRequest(); request.onreadystatechange = function() { if (this.readyState == 4&&this.status == 200) { if (this.responseText != null) { var info = this.responseText.split("\n"); var status=[]; var data=[]; var div=document.getElementById("info"); clear(div); for (var i=0;i<info.length;i++) { data.push(info[i].split("-").slice(0,1).join()); status.push(info[i].split("-").slice(1,2).join()); var div_data=document.createElement("div"); var div_status=document.createElement("div"); var node_data=document.createTextNode(data[i]); var node_status=document.createTextNode(status[i]); div.appendChild(div_data); div.appendChild(div_status); div_data.appendChild(node_data); div_status.appendChild(node_status); }}}} request.open("GET", "ajax_alarm" + nocache, true); request.send(null); } function clear(elem) {elem.innerHTML = '';} function dateSender() { var dat= document.getElementById("dat").value; var request = new XMLHttpRequest(); request.open("GET", "dat="+dat, true); request.send(null); } </script> </Body> </html>
Ставлю на недостаток RAM.
иначе говоря, atmega328 не тянет мой проект?а могу я вывести в порт остаток RAM?чтоб убедиться
https://www.google.com/search?q=arduino+freememory+function
250 - это мало. Тем более если оперировать стрингами. Откройте для себя макрос F() , избавьтесь от библиотеки SD, перенеся исходники страницы в PROGMEM и тогда влезет все написанное выше в 328-й МК.
Благодарю, уже начал разбираться с памятью.
около 260 байт уже не хочет ниче грузить, мк просто виснит.
хотя освободил 1 стринг (посредник задания пути), а ОЗУ все равно осталось 260 и оно Грузит!