Arduino+HTML+SD
- Войдите на сайт для отправки комментариев
Ср, 26/11/2014 - 15:49
Подскажите как использовать SD карту на Ethernet W5100 R3.
Каким образом правильно организовать подтяжку файла CSS с SD карты, что бы в скетч не ставить набор из
client.println("<style>#temp1 {font-family: Arial, Helvetica, sans-serif;color: #333;}</style>");
а просто добавить ссылку вида
client.print("link rel='stylesheet' href='http://ip/tp.css'");
при этом не увеличивать размер скетча?
Сделайте простейший "отвечатель" на HTTP запросы.
Нужно распарсить запрос и отдать файл html-странице, который она запрашивает.
А зачем?
Я хочу использовать полноценный CSS - подгрузаемый с SD карты
http://startingelectronics.com/tutorials/arduino/ethernet-shield-web-server-tutorial/
Как подключить SD я розабрался, но почему то после активации библиотеки #include <SD.h>, перестает отображаться страничка arduino.
Я делал так:
#include <SPI.h> #include <SD.h> #include <Ethernet.h> /* This creates an instance of the webserver. By specifying a prefix * of "", all pages will be at the root of the server. */ #define WEBDUINO_FAVICON_DATA "" #define WEBDUINO_SERVER_HEADER "Server: Themp/" #define WEBDUINO_AUTH_REALM "Themperature logger" #define PREFIX "" #include <WebServer.h> WebServer webserver(PREFIX, 80); // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,0,177); // char login[] = "dXNlcjoxOTI4Mzc0Ng==";//user:19283746 void fileCmd(WebServer &server, WebServer::ConnectionType type, char * url_tail, bool tail_complete) { if (server.checkCredentials(login)) { if (type != WebServer::HEAD) { if (SD.exists(url_tail)||strlen(url_tail) == 1){ File dataFile = SD.open(url_tail); if (dataFile) { if (dataFile.isDirectory()){ //Get index of directory server.httpSuccess(); server.printP(PSTR("<h1>Index of ")); server.print(url_tail); server.printP(PSTR("</h1>\n<table>\n<thead><th>File name</th><th>Size</th></thead>\n<tbody>\n")); while(true) { File entry = dataFile.openNextFile(); if (!entry) { entry.close(); break; } server.printP(PSTR("<tr><td><a href='")); server.print(entry.name()); if (entry.isDirectory()) { server.print("/"); } server.printP(PSTR("'>")); server.print(entry.name()); server.printP(PSTR("</a></td><td>")); server.print(entry.size()); server.printP(PSTR("</td></tr>")); entry.close(); } server.printP(PSTR("</tbody>\n</table>\n")); }else{ // Get file content server.httpSuccess(server.getMime(url_tail)); while (dataFile.available()) { if(server.write((char)dataFile.read()) == 0){ break; } } } }else{ server.httpNotFound(); } dataFile.close(); }else{ server.httpNotFound(); } } } else { /* send a 401 error back causing the web browser to prompt the user for credentials */ server.httpUnauthorized(); } } void setup(void) { Wire.begin(); rtc.begin(); Serial.begin(9600); pinMode(13,OUTPUT); if (!SD.begin(4)) { Serial.println("SD initialization failed!"); return; } digitalWrite(13,HIGH); Serial.println("SD initialization done."); Serial.println("Initializing Eternet!"); // start the Ethernet connection: if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); // using static ip: Ethernet.begin(mac, ip); } Serial.print("server is at "); Serial.println(Ethernet.localIP()); webserver.setDefaultCommand(&fileCmd); webserver.addCommand("sd", &fileCmd); //path to sd card webserver.begin(); } void loop(void) { digitalWrite(13,LOW); char buff[512]; int len = 512; /* process incoming connections one at a time forever */ webserver.processConnection(buff, &len); }хоть часть кода находится в библиотеке(специально исправленной для этого), но общая суть должна быть понятна.
В итоге код обрабатывает ссылки http_://192.168.0177/sd/test.txt, где /test.txt это путь на карточке
А зачем?
Я хочу использовать полноценный CSS - подгрузаемый с SD карты
Собственно я это и предложил...
Появилась проблема.
Когда ставлю карту в SD слот то по сети не возможно достучаться до ардуино да же не используя в скетче функции SD карты. Карту извлекаешь - все работает. В мониторе порта карту видно нормально.
Что это может быть?
Появилась проблема.
Когда ставлю карту в SD слот то по сети не возможно достучаться до ардуино да же не используя в скетче функции SD карты. Карту извлекаешь - все работает. В мониторе порта карту видно нормально.
Что это может быть?
Перед инициализацией карточки нужно выключить W5100
void setup() { Serial.begin(9600); // disable w5100 while setting up SD pinMode(10,OUTPUT); digitalWrite(10,HIGH); Serial.print("Starting SD.."); if(!SD.begin(4)) Serial.println("failed"); else Serial.println("ok"); // start the Ethernet connection and the server: Ethernet.begin(mac, ip, gateway, gateway, subnet); server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); }//setup()Странно у вас W5100 работает - у меня проблем особых не возникало - вот прямо сейчас лежит на столе и работает - и лог пишет и файл с карты может отдать по http.
если шилд на меге, надо выключить не используемое устройство на SPI, в сетапе 53 пин в HIGH
Спасибо!!!
Теперь нормально работает
ткните носом,пожалуйста,как забирать файл с карты...сделал ардуину сервером,управляю релюшками с интернета,смотрю за температурами...пишется лог на карту...теперь хочется его удаленно изымать=)спасибо...
File dataFile = SD.open("/log.txt"); while (dataFile.available()) { if(server.write((char)dataFile.read()) == 0){ break;// Файл не должен передаваться при разрыве связи } }Скопировал еще разок
ткните носом,пожалуйста,как забирать файл с карты...сделал ардуину сервером,управляю релюшками с интернета,смотрю за температурами...пишется лог на карту...теперь хочется его удаленно изымать=)спасибо...
File myFile = SD.open(filename); if (myFile){ while (myFile.available()) { client.write(myFile.read()); } myFile.close(); }Всем спасибо,буду разбираться,идеи понял!
странно, вообще-то работать не должно.
стандартные библиотеки sd и ethernet конфликтуют друг с другом, поэтому их рекомендуют не использовать одновременно, только переключаться между ними.
Это стопроцентно,только поочерёдно обращение к каждому устройству путем установки низкого уровня на пине CS...
Все работает. В этом вся фишка.
Конфликтуют только во время инициализации.
здравствуйте.я скачал последнюю версию библиотеки webserver.h на https://github.com/sirleech/Webduino
но при компиляции выдает кучу ошибок
все ищу как скачать удаленно файл с карты памяти=(
да - я просто имею привычку допиливать библиотеки, до нужного мне стостояния))) http://yadi.sk/d/B-IHNu6QJdiCX все целиком, если поискать то там есть тот самый скетч в оригинале(логер темпиратуры с DS18B20).
P.S. Вообще кто сказал что ардуино для блондинок - тот был неправ. Понимание своих действий обязательно не только на уровне "Копировать"->"Вставить".
здравствуйте.я скачал последнюю версию библиотеки webserver.h на https://github.com/sirleech/Webduino
но при компиляции выдает кучу ошибок
На сколько я понял, когда разбирался с этой библиотекой - это оболочка над стандартной библиотекой. Во всяком случае та, что смотрел я (с таким же названием) была именно оболочкой.
я ее специально допиливал, чтобы она работала как мне надо, переделал там функцию обработки путей url - путь может быть больше чем указан при инициализации - в итоге обработчик получает все пути с совпадающим началом - и можно прямо указывать путь в адресе - все что не совпадает уйдет в функцию обработки и может быть обработано там как например путь на флешке.
Вобщем ща сделаю свой форк. И обновлю всю эту библиотеку у себя. 2 те функции очень нужные ...
Афтор там много переделал, а самое главное часть моих переделок совпала с его переделками(коллективное сознание шоли?) - сам шоке)))
https://github.com/NeiroNx/Webduino - надо доработать функцию getMime и сделать пулл в его мастер дистрибутив.
Вобщем нужна адекватная помощь - сам как мог сделал уже, а надо лучше!
спасибо за то что отозвались...сначала очень обрадовался,нашел у вас эту библеотеку,подменил,но теперь компилятор не "ест" все строки где есть server.printP(PSTR** =(
UPD.После вашего обновления библиотеки скетч почти скомпилировался,вылезли только ошибки
Вот это я незнаю - это уже у вас чего то в других библиотеках - у меня все компилируется, только не ясно работает ли как работало.
Вообще в папке(на моем яндекс диске, на который есть ссылка вше) data/temp_to_csv_web оригинал проекта с задействованной функцией отображения файлов.
наконец скомпилировалось,сейчас ковыряюсь/разбираюсь=)кстати,вот та последняя ошибка была из-за библиотеки SD.h которую скачивал у вас,я когда не знал на что грешить и ее тоже подменил на вашу с яндекс диска...после вашей поправки в webserver.h вернул родную SD.h и ошибка ушла=)
прохожу авторизацию логин user,пароль 19283746...и что потом не делаю,получаю в ответ EPIC FAIL....файлы и в корень ложу,и в папку,все никак...в адрессной строке писал 192.168.1.100:100/sd/temp.txt и 192.168.1.100:100/sd/new/temp.txt(файл так же есть в папке new) и даже так 192.168.1.100:100/temp.txt.... всегда эпик фэил пишет=(
значит что-то поменялось в библиотеке...(у меня тоже не работает)
вобщем в WebServer.h в строках должно быть это, вместо того что там есть:
if ((verb_len >= strlen(m_commands[i].verb)) && (strncmp(verb, m_commands[i].verb, strlen(m_commands[i].verb)) == 0)) { // Skip over the "verb" part of the URL (and the question // mark, if present) when passing it to the "action" routine m_commands[i].cmd(*this, requestType, verb + strlen(m_commands[i].verb), tail_complete); return true; }После этого может перестать работать nextUrlParam в примерах, потому что ему нужен указатель на положение знака '?'. в случае когда имя запрашиваемой страницы равно имени указанном в функции надо добавить 1, чтобы пропустить знак '?'.
В библиотеке появилась команда UrlPath - которая получает на входе массив из имен папок и файла, но это не то что требуется чтобы читать файл с карты по указанному пути.
У себя проверил - после изменений начало работать...
спасибо,заработало!