Arduino+HTML+SD

ramzes.ru
Offline
Зарегистрирован: 19.11.2014

Подскажите как использовать 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'");

при этом не увеличивать размер скетча?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Сделайте простейший "отвечатель" на HTTP запросы.

Нужно распарсить запрос и отдать файл html-странице, который она запрашивает.

ramzes.ru
Offline
Зарегистрирован: 19.11.2014

А зачем?

Я хочу использовать полноценный CSS - подгрузаемый с SD карты 

Бублик
Бублик аватар
Offline
Зарегистрирован: 05.12.2012
ramzes.ru
Offline
Зарегистрирован: 19.11.2014

Как подключить SD я розабрался, но почему то после активации библиотеки #include <SD.h>, перестает отображаться страничка arduino.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Я делал так:

#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 это путь на карточке

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

ramzes.ru пишет:

А зачем?

Я хочу использовать полноценный CSS - подгрузаемый с SD карты 

Собственно я это и предложил...

ramzes.ru
Offline
Зарегистрирован: 19.11.2014

Появилась проблема.

Когда ставлю карту в SD слот то по сети не возможно достучаться до ардуино да же не используя в скетче функции SD карты. Карту извлекаешь - все работает. В мониторе порта карту видно нормально.

Что это может быть?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

ramzes.ru пишет:

Появилась проблема.

Когда ставлю карту в 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() 

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Странно у вас W5100 работает -  у меня проблем особых не возникало -  вот прямо сейчас лежит на столе и работает - и лог пишет и файл с карты может отдать по http.

Бублик
Бублик аватар
Offline
Зарегистрирован: 05.12.2012

если шилд на меге, надо выключить не используемое устройство на SPI, в сетапе 53 пин в HIGH 

ramzes.ru
Offline
Зарегистрирован: 19.11.2014

Спасибо!!!

Теперь нормально работает

pastry777
Offline
Зарегистрирован: 16.01.2014

ткните носом,пожалуйста,как забирать файл с карты...сделал ардуину сервером,управляю релюшками с интернета,смотрю за температурами...пишется лог на карту...теперь хочется его удаленно изымать=)спасибо...

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013
            File dataFile = SD.open("/log.txt");
            while (dataFile.available()) {
               if(server.write((char)dataFile.read()) == 0){
                 break;// Файл не должен передаваться при разрыве связи
               }              
            }

Скопировал еще разок

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

pastry777 пишет:

ткните носом,пожалуйста,как забирать файл с карты...сделал ардуину сервером,управляю релюшками с интернета,смотрю за температурами...пишется лог на карту...теперь хочется его удаленно изымать=)спасибо...

 File myFile = SD.open(filename);
          if (myFile){
              while (myFile.available()) {
              client.write(myFile.read());
            }
            myFile.close();
            }

 

pastry777
Offline
Зарегистрирован: 16.01.2014

Всем спасибо,буду разбираться,идеи понял!

Maverik
Offline
Зарегистрирован: 12.09.2012

странно, вообще-то работать не должно.

стандартные библиотеки sd и ethernet конфликтуют друг с другом, поэтому их рекомендуют не использовать одновременно, только переключаться между ними.

pastry777
Offline
Зарегистрирован: 16.01.2014

Это стопроцентно,только поочерёдно обращение к каждому устройству путем установки низкого уровня на пине CS...

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Все работает. В этом вся фишка.

Конфликтуют только во время инициализации.

pastry777
Offline
Зарегистрирован: 16.01.2014

здравствуйте.я скачал последнюю версию библиотеки webserver.h на https://github.com/sirleech/Webduino

но при компиляции выдает кучу ошибок

qqqqqqqqqqqq.ino: In function 'void fileCmd(WebServer&, WebServer::ConnectionType, char*, bool)':
qqqqqqqqqqqq.ino:35: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:37: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:44: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:49: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:51: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:53: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:56: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq:59: error: 'class WebServer' has no member named 'getMime'
qqqqqqqqqqqq:67: error: 'class WebServer' has no member named 'httpNotFound'
qqqqqqqqqqqq:71: error: 'class WebServer' has no member named 'httpNotFound'
qqqqqqqqqqqq.ino: In function 'void setup()':
qqqqqqqqqqqq:83: error: 'Wire' was not declared in this scope
 
как видно в классе webserver вообще отсутствуют getMime,httpNotFound 
могли бы вы выложить вашу библиотеку с которой у вас все это работало?спасибо..
pastry777
Offline
Зарегистрирован: 16.01.2014

все ищу как скачать удаленно файл с карты памяти=(

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

да - я просто имею привычку допиливать библиотеки, до нужного мне стостояния))) http://yadi.sk/d/B-IHNu6QJdiCX все целиком, если поискать то там есть тот самый скетч в оригинале(логер темпиратуры с DS18B20).

P.S. Вообще кто сказал что ардуино для блондинок - тот был неправ. Понимание своих действий обязательно не только на уровне "Копировать"->"Вставить".

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

pastry777 пишет:

здравствуйте.я скачал последнюю версию библиотеки webserver.h на https://github.com/sirleech/Webduino

но при компиляции выдает кучу ошибок

qqqqqqqqqqqq.ino: In function 'void fileCmd(WebServer&, WebServer::ConnectionType, char*, bool)':
qqqqqqqqqqqq.ino:35: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:37: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:44: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:49: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:51: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:53: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq.ino:56: warning: only initialized variables can be placed into program memory area
qqqqqqqqqqqq:59: error: 'class WebServer' has no member named 'getMime'
qqqqqqqqqqqq:67: error: 'class WebServer' has no member named 'httpNotFound'
qqqqqqqqqqqq:71: error: 'class WebServer' has no member named 'httpNotFound'
qqqqqqqqqqqq.ino: In function 'void setup()':
qqqqqqqqqqqq:83: error: 'Wire' was not declared in this scope
 
как видно в классе webserver вообще отсутствуют getMime,httpNotFound 
могли бы вы выложить вашу библиотеку с которой у вас все это работало?спасибо..

На сколько я понял, когда разбирался с этой библиотекой - это оболочка над стандартной библиотекой. Во всяком случае та, что смотрел я (с таким же названием) была именно оболочкой.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

я ее специально допиливал, чтобы она работала как мне надо, переделал там функцию обработки путей url - путь может быть больше чем указан при инициализации - в итоге обработчик получает все пути с совпадающим началом - и можно прямо указывать путь в адресе - все что не совпадает уйдет в функцию обработки и может быть обработано там как например путь на флешке.

Вобщем ща сделаю свой форк. И обновлю всю эту библиотеку у себя. 2 те функции очень нужные ...

Афтор там много переделал, а самое главное часть моих переделок совпала с его переделками(коллективное сознание шоли?) - сам  шоке)))

https://github.com/NeiroNx/Webduino - надо доработать функцию getMime и сделать пулл в его мастер дистрибутив.

Вобщем нужна адекватная помощь - сам как мог сделал уже, а надо лучше!

pastry777
Offline
Зарегистрирован: 16.01.2014

спасибо за то что отозвались...сначала очень обрадовался,нашел у вас эту библеотеку,подменил,но теперь компилятор не "ест" все строки где есть server.printP(PSTR**  =(

 

UPD.После вашего обновления библиотеки скетч почти скомпилировался,вылезли только ошибки

qqqqqqqqqqqq.cpp.o: In function `fileCmd(WebServer&, WebServer::ConnectionType, char*, bool)':
C:\Program Files\Arduino/qqqqqqqqqqqq.ino:39: undefined reference to `File::~File()'
qqqqqqqqqqqq.cpp.o: In function `WebServer::printP(char const*)':
C:\Program Files\Arduino/qqqqqqqqqqqq.ino:51: undefined reference to `File::~File()'
qqqqqqqqqqqq.cpp.o: In function `fileCmd(WebServer&, WebServer::ConnectionType, char*, bool)':
C:\Program Files\Arduino/qqqqqqqqqqqq.ino:61: undefined reference to `File::~File()'
NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Вот это я незнаю - это уже у вас чего то в других библиотеках - у меня все компилируется, только не ясно работает ли как работало.

Вообще в папке(на моем яндекс диске, на который есть ссылка вше) data/temp_to_csv_web оригинал проекта с задействованной функцией отображения файлов.

pastry777
Offline
Зарегистрирован: 16.01.2014

наконец скомпилировалось,сейчас ковыряюсь/разбираюсь=)кстати,вот та последняя ошибка была из-за библиотеки 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.... всегда эпик фэил пишет=(

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

значит что-то поменялось в библиотеке...(у меня тоже не работает)

вобщем в 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 - которая получает на входе массив из имен папок и файла, но это не то что требуется чтобы читать файл с карты по указанному пути.

У себя проверил - после изменений начало работать...

pastry777
Offline
Зарегистрирован: 16.01.2014

спасибо,заработало!