Bom dia, estou construindo um webserver com o arduino unoR3 e EthernetShield original onde estou linkando umas imagens jpg que coloquei no http://imageshack.us/ gostaria de tirar do meio do caminho este serviço e colocar a imagem dentro de um cartão sd do modulo e apresentar no browser, como devo fazer isso??

Exibições: 6301

Responder esta

Respostas a este tópico

Eu to fazendo uma aplicação que vai precisar disso... Já tinha pesquisado mas ainda não cheguei no momento de usar (to parado antes).

Seugue:

Link:

http://arduino.cc/forum/index.php?action=printpage;topic=95099.0

Codigo:

/*
 A simple web server with microSD using an Arduino Wiznet Ethernet shield. 
 For Arduino IDE V1.0 only. Earlier IDEs require mods to this code.  
 created 18 Dec 2009
 by David A. Mellis
 modified 4 Sep 2010
 by Tom Igoe
 modified 14 Jan 2012
 by Tim Dicus
modified 5 Mar 2012
 by Jerry Sy aka doughboy
*/
#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and network settings for your controller below.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip( 192,168,1,17 );
//IPAddress gateway( 192,168,1,1 );
//IPAddress dns( 1,2,3,4 );
//IPAddress subnet( 255,255,255,0 );

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

char buffer[64];
int index = 0;

void setup()
{
//  Serial.begin(9600);

  // Set SS pins for both w5100 and microSD
  pinMode(10,OUTPUT);
  digitalWrite(10,HIGH);
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);
  
  // Start microSD.
  // This disables the SD SPI interface before returning
  SD.begin(4);

  // start the Ethernet connection and the server:
  // This leaves the w5100 SPI enabled
  if (Ethernet.begin(mac) == 0) {
    Ethernet.begin(mac, ip);
  }
  // disable w5100 SPI
  digitalWrite(10,HIGH);
  // now you can read/write to both w5100 and SD without manipulating the SS pins.

  delay(2000);
  server.begin();
//  Serial.println("Setup finished");
}

void loop()
{
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
//    Serial.println("Client!");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      while(client.available()) {
        char c = client.read();
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
//          Serial.println("sending response");
          // send a standard http response
          String s = buffer;
          String t;
          int idx = 0;
          if (s.startsWith("GET")) {
             client.println("HTTP/1.0 200 OK");
             if ((idx=s.indexOf(".htm"))>0  ) {
                 client.println("Content-Type: text/html");
             } else if ((idx=s.indexOf(".jpg"))>0) {
                 client.println("Content-Type: image/jpeg");               
             }
             t = s.substring(5,idx+5);
             client.println();
             sdCheck(client, t);
          }
          client.stop();
        }
        else if (c == '\r') {
          // you're starting a new line
          currentLineIsBlank = true;
          buffer[index]='\0';
          index=0;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
          buffer[index++] = c;
        }
      }
    }
//    Serial.println("Client disconnected.");
  }
}

void sdCheck(EthernetClient client, String file)
{
  char filename[13];
  file.toCharArray(filename, file.length());
  File myFile = SD.open(filename);

  if (myFile) {
//    Serial.println("sending testfile.txt...");
    byte buffer[256];
    int count = 0;
    if (myFile.available()) {
      while ((count=myFile.read(buffer,256))> 0 ) {
        client.write(buffer,count);
      } 
    }
    // close the file:
    myFile.close();
  } else {
    client.println("ERROR");
  }
}

pelo que pesquisei na net percebi que não deve ser tão complicado, pelo que entendi apenas vou enviar o conteudo como texto mesmo.

para quem quer se aprofundar nestas funções recomendo a utilizarem o software Charles Web Debugger, ele permite analisar cada GET POST REQUEST

nele eu percebi que a resposta ao /foto.jpg em formato RAW é a igual a abrir a foto no notepad

Um colega do curso de Engenharia, em seu TCC (na área de Domótica) fez algo similar. Só que o problema estava na velocidade que o cartão SD devolvia os dados pro processador. Era absurdamente mais rápido carregar as imagens da internet do que do SD, assim ficou a imagem no SD apenas como backup. Mas como o projeto dele dependia de internet, sem internet -> sem imagem, mas também sem sistema.

E sim, a imagem vem serializada, você vai ter o bitmap compactado (no caso do jpeg).

o ethernet shield original não funciona nos modos ethernet E sd card simultaneamente

o que vc tem que fazer é habilitar o modulo sd, ler a imagem, guarda-la numa variavel, desabilitar o modo sd, habilitar o modo ethernet e entao escrever a imagem na saida do client.print incluindo os headers

é mais dificil do que parece, porque o arduino tem memoria bem limitada, imagine que ele vai ter que guardar o programa E a imagem toda...

Como assim não funcionam simultaneamente? O SD é SPI e o Ethernet é RS-232, não?

nao brigue comigo, sou apenas o mensageiro, akakakka. Po, ta na documentação oficial isso :P

http://arduino.cc/en/Main/ArduinoEthernetShield

"Arduino communicates with both the W5100 and SD card using the SPI bus"

e mais pra baixo:

"Note that because the W5100 and SD card share the SPI bus, only one can be active at a time."

Exatamente o que eu disse, ambos não podem estar ativos ao mesmo tempo...

Ah sim! Se os 2 usam SPI realmente é necessário trabalhar com Buffer (memória). Aí confirma a solução que este meu colega utilizou no TCC, baixar tudo da "grande rede".

Poisé, o arduino em geral é um microcontrolador excelente, não sei se tem algum melhor, eu, particularmente, prefiro...

Mas tem algumas aplicações que não tem solução facil usando ele, pela baixa memória e pelo baixo poder de processamento..
Pra esse tipo de coisa mais complexa, que requer um processador de aplicações, tem o Raspberry, por exemplo.

Inclusive, não sei se você ja viu minhas postagens de Blog ( http://labdegaragem.com/profiles/blog/list?user=2kksumj33efkp) , mas estou trabalhando em 2 robos, ambos usam arduino e ethernet shield. Mas no maior eu estou pensando em usar um raspberry pra "servir" a interface web e ser realmente o "cerebro" do robo, o raspberry, via I2c(TWI) vai se comunicar com o arduino, e este sim sera encarregado das funçoes especificas de microcontroaldor: pwm pros drivers dos motores, leitura dos sensores, switches de luzes e reles, etc...

Sim, sim! Saber qual microcontrolador usar é o básico para um bom projetista.

Não adianta também usar um ARM de 256MB de RAM, 1Ghz de clock pra acender 3 leds.

E nem sempre um cluster com 30 Atmegas é viável.

que mer..d...cadoria ruim, muito trabalho a ser feito....

outra coisa que percebi foi que só de ter um cartão espetado no shild meu webserver fica doidão

havia feito um webserver para controlar uma lampada, e com um Pir saber qdo havia um movimento detectado no ambiente para gravar um log em bco de dados online, caso a conexao falhasse, grava o comando sql no log no cartão de memoria espetado no shild ethernet, para qdo a conexao voltasse, popular o bco novamente. Mas foi so conectar um display lcd 16x2 que a leitura do cartao nao funciona mais.Uso o mega. hunf...

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço