Go Down

Topic: leer datos de la SD desde mi pc por ethernet (Read 2410 times) previous topic - next topic

victorlaclare

Jan 17, 2017, 07:41 pm Last Edit: Jan 18, 2017, 12:20 am by victorlaclare
buenas tardes, soy nuevo en el foro y queria compartir mi problema con ustedes para ver si es posible realizar lo que quiero hacer y como lo debo hacer.

el proyecto que estoy haciendo se basa en registrar el momento (dia, hora, mes, año) cuando una maquina detuvo su proceso y cuando inicio nuevamente, en pocas palabras es registrar los tiempo de parada de una maquina, hasta ahora puedo registrar los datos sin problemas en la SD, y tambien puedo mostrar los datos de la tarjeta en el puerto serie USB, es decir en el monitor serie. hasta ahora todo en orden, pero aqui viene el problema, cuando quiero hacer un codigo para que arduino tome los datos de la tarjeta almacenados en un .txt y me lo muestre en el navegador atravez de una conexión ethernet, es decir escribir el ip de mi arduino en el exprorer y cuando se conecte me muestre los datos de la tarjeta, hasta ahora pude conectarme y enviar un mensaje determinado pero como dije no puedo enviar los datos de la tarjeta, es posible hacer esto? les dejo el codigo que hice para que lo revisen

para hacer esto utilizo arduino MEGA, Ethernet Shield, RTC I2C

Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
// Configuración de direccion MAC e IP.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);

// Inicia la libreria Ethernet server con el puerto 80 (por defecto el puerto HTTP).
EthernetServer server(80);

void setup() {
// Inicia el puerto serie.
Serial.begin(9600);

// Inicia la conexión Ethernet y el servidor.
Ethernet.begin(mac, ip);
server.begin();
Serial.print("IP local del servidor ");
Serial.println(Ethernet.localIP());

pinMode(53, OUTPUT);
if (!SD.begin(4))
    {  Serial.println("No hay tarjeta");
        return;    // NO sigas
    }
 Serial.println("Sd encontrada.");
}


void loop() {

         
EthernetClient client = server.available(); // Escucha a los clientes entrantes.
   if (client) { // Si un cliente se conecta al servidor:
   Serial.println("Nuevo cliente");
   boolean currentLineIsBlank = true; // Marcador para enviar la respuesta desde el servidor.
       while (client.connected()) { // Repite mientas existe clientes conectados:
           if (client.available()) {
           char c = client.read();
           Serial.write(c); // Imprime por el puerto serie la petición del cliente (caracter a caracter)
               if (c == '\n' && currentLineIsBlank) { // Se envia la respuesta a una petición de un cliente cuando a finalizado la petición:
               // Respuesta:
               File dataFile = SD.open("data.html");   //abro el archivo .txt donde almacene los datos  
                   while (dataFile.available())   //mientras el archivo este disponible
                     Serial.write(dataFile.read()); //muestro los datos en monitor serial
               
               client.println("HTTP/1.1 200 OK"); // Enviar un encabezado de respuesta HTTP estándar
               client.println("Content-Type: text/html");
               client.println("Connection: close"); // Se cerrará la conexiós despues de enviar la respuesta.
               client.println("Refresh: 5"); // Refrescar automáticamente la página después de 5 segundos.
               client.println();
               client.println("<!DOCTYPE HTML>"); // Tipo de documento
               client.write(dataFile.read()); //tomo los datos de la tarjeta y los escribo en el cliente
               client.println("<html>"); // Etiqueta html inicio del documento.
               client.println("<br />"); // Etiqueta html salto de linea.
               client.println("</html>"); // Etiqueta html fin del documento.
               dataFile.close(); //cierro la comunicacion con la SD
               break;
               }
               if (c == '\n') { // Si el caracter es un salto de linea:
               currentLineIsBlank = true; // La petición a terminado, se respondera a dicha peticón en el sigueitne ciclo.
               }
               else if (c != '\r') { // Si el caracter no es un retorno de carro (la petición no a terminado).
               currentLineIsBlank = false; // Seguimos escuchando la petición.
               }
          }
      }
   delay(1); // Espera para dar tiempo al navegador a recivir los datos.
   client.stop(); // Cierra la conexión.
   Serial.println("Cliente desconectado");
   
   Serial.println();
   }
   
   delay(5000);
}


les agradeceria mucho por su ayuda

saludos

Lucario448

Esta línea debe quedar así:

Code: [Select]
enviarArchivo(client, dataFile); //tomo los datos de la tarjeta y los escribo en el cliente
Por el comentario ya debes saber cuál es.

Y agrega esto al final de todo:

Code: [Select]
void enviarArchivo(EthernetClient client, File file) {
  while (file.available()) client.write(file.read());
}




PD: código debe ir entre etiquetas generadas por </>

turco11

Hola, yo estoy teniendo el mismo problema y con la solución propuesta en la respuesta no hubo ningún cambio.
El primer error que encontré fue al tratar de abrir el archivo con el cliente conectado que daba error (a pesar que en el SETUP lo hacía bien sin ningún inconveniente). Revisando en varios lugares, por una extraña razón, si en vez de abrirlo una vez lo haces dos veces, el archivo se abre (cosa e mandinga). En tu caso sería:

               File dataFile = SD.open("data.html");   //abro el archivo .txt donde almacene los datos 
               dataFile = SD.open("data.html");   //abro el archivo .txt donde almacene los datos 
                   while (dataFile.available())   //mientras el archivo este disponible

Ahora el problema pasa a ser que en el momento de hacer la lectura del archivo y envío al cliente "client.write(dataFile.read())" se queda colgado ahí (el explorador recibe el encabezado pero no más) y nunca continúa la rutina.
Estoy asociando esto con los SS del SPI pero no le termino de encontrar la vuelta. Has podido avanzar algo en tu problema?

jairoroahatan

#3
Jul 28, 2020, 06:25 am Last Edit: Jul 28, 2020, 03:47 pm by surbyte Reason: Agregado de etiqueta para códigos/errores
Una posible solución es crear una variable de tipo String y con catenar la lectura hecha del archivo o fichero que se quiere imprimir.
Luego es imprimir la variable en las líneas del servidor del shield Ethernet.

Code: [Select]
String datoSd;

datoSd.concat(dataFile.read());

client.print(datoSd);



Nota: la lectura de la SD se hace por carácter por eso se usa while.


Yo lo que quiero hacer es descargar el fichero del navegador, si alguien ya lo ha logrado agradecería con todo mi corazón que comparta como sería el respectivo código.

Go Up