Go Down

Topic: Problemas Ethernet Shield, SD, Time y otros. (Read 91 times) previous topic - next topic

Cero

Necesito de su ayuda, resulta que al mezclar un servidor en ethernet shield, la sd, la libreria Time, me da problemas de escritura. Existen veces que no me lee los datos de la sd, otras veces no escribe en la sd, según yo la programación esta bien, necesito que me digan si estoy yo equivocado, o el arduino no funciona bien, o alguna de sus partes, me sería de mucha ayuda su sabiduría, vale decir que soy nuevo programando arduino.

Actualmente al agregar la linea setTime no permite que escriba en la sd, si la quito, no ocurre ningun problema.

Code: [Select]

#include <Time.h>
#include <TimeLib.h>
#include <SPI.h>
#include <SD.h>
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <Servo.h>

#define SD_CARD 4
#define BOTON 6
#define DATOS 7

#define RECIBIR 0
#define SOLTAR 170

/*SERVIDOR*******************************************/
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE};
IPAddress ip(192, 168, 1, 80);
EthernetServer eServer(80);

String readString;
/*SERVIDOR*******************************************/

/*SERVOMOTOR*/
Servo SG90;
/*SERVOMOTOR*/

File archivo;

void setup() {
  Serial.begin(9600);
  SG90.attach(DATOS);
  Ethernet.begin(mac, ip);
  eServer.begin();
 
  pinMode(SD_CARD, OUTPUT);
  pinMode(BOTON, INPUT);
  SG90.write(RECIBIR);

  iniciarLecturaSD();

  setTime(00,00,00,21,11,2017);
}

void loop() {
  webApp();
  onBoton();
}

void webApp() {
  EthernetClient client = eServer.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (readString.length() < 100) {
          readString += c;
        }

        if (c == '\n') {
          client.println("HTTP/1.1 200 OK");
          client.println("Context-Type: text/html");
          client.println();
          client.println("<html>");
          client.println("<head>");
          client.println("<title> Link Feeder </title>");
          client.println("</head>");
          client.println("<body>");
          client.println("<h1>LINK FEEDER</h1>");
          client.println("<h2>Alimentacion de Mascotas Remotamente</h2>");
          client.println("<h3><a href=\"/?feed\"\">Alimentar</a></h3>");
          client.println("<table>");
          archivo = SD.open("registro.bd");
          if (archivo) {
            while(archivo.available()) {
              client.write(archivo.read());
            }
            archivo.close();
          }
          client.println("</table>");
          client.println("</html>");
         
         
          if (readString.indexOf("?feed") > 0) {
            onServo();
          }

          readString = "";

          delay(500);
          client.stop();
        }
      }
    }
  }
}

void onServo() {
  SG90.write(SOLTAR);
  delay(2000);
  SG90.write(RECIBIR);

  saveNewFeed();
}

void onBoton() {
  if (digitalRead(BOTON) == HIGH) {
    onServo();
  }
}

void iniciarLecturaSD() {
    Serial.println("Inicializando Tarjeta SD...");
    if (!SD.begin(SD_CARD)) {
        Serial.println("ERROR - Fallo al inicializar.");
        return;
    }
    Serial.println("LISTO! - Tarjeta SD Inicializada.");
    String fileName = "registro.bd";
    if (!SD.exists(fileName)) {
        Serial.println("ERROR - No se encuentra "+fileName+"!");
        return;
    }
    Serial.println("LISTO! - "+fileName+" disponible y accesible.");
}

void saveNewFeed(){
  iniciarLecturaSD();
  File archivoTwo = SD.open("registro.bd", FILE_WRITE);
  if(archivoTwo){
    Serial.println("Escribiendo...");
    archivoTwo.println("<tr>");
    archivoTwo.println("<td>asd</td>");
    archivoTwo.println("<td>asd</td>");
    archivoTwo.println("</tr>");
    archivoTwo.flush();
    archivoTwo.close();
  }
}



Muchas Gracias

surbyte

Como alimentas todo: USB o fuente externa?

Lucario448

¿Que Arduino usas y/o cuanta memoria utilizada te reporta el compilador?
A veces tener poca memoria RAM hace cosas raras en el programa.

Cero

Como alimentas todo: USB o fuente externa?
Lo tengo conectado al USB mientras desarrollo.

¿Que Arduino usas y/o cuanta memoria utilizada te reporta el compilador?
A veces tener poca memoria RAM hace cosas raras en el programa.
Uso un UNO y la memoria me reporta casi un 80%. Y pensé que pudo ser por la memoria, y ya estoy pensando en comprar un MEGA

Lucario448

Y pensé que pudo ser por la memoria, y ya estoy pensando en comprar un MEGA
Quizá no haga falta. Con una buena optimización puede que sea suficiente:
Code: [Select]
#include <Time.h>
#include <TimeLib.h>
#include <SPI.h>
#include <SD.h>
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <Servo.h>

#define SD_CARD 4
#define BOTON 6
#define DATOS 7

#define RECIBIR 0
#define SOLTAR 170

#define NOMBRE_ARCHIVO "registro.bd"

/*SERVIDOR*******************************************/
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE};
IPAddress ip(192, 168, 1, 80);
EthernetServer eServer(80);

String readString;
/*SERVIDOR*******************************************/

/*SERVOMOTOR*/
Servo SG90;
/*SERVOMOTOR*/

File archivo;

void setup() {
  Serial.begin(9600);
  SG90.attach(DATOS);
  Ethernet.begin(mac, ip);
  eServer.begin();
 
  pinMode(SD_CARD, OUTPUT);
  pinMode(BOTON, INPUT);
  SG90.write(RECIBIR);

  iniciarLecturaSD();

  setTime(00,00,00,21,11,2017);
}

void loop() {
  webApp();
  onBoton();
}

void webApp() {
  EthernetClient client = eServer.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (readString.length() < 100) {
          readString += c;
        }

        if (c == '\n') {
          // No se ve muy ordenado, pero al menos así te carga la página un poco más rápido y sin sacrificar mucha RAM
          client.println(F("HTTP/1.1 200 OK\r\nContext-Type: text/html\r\n\r\n<html><head><title> Link Feeder </title></head><body><h1>LINK FEEDER</h1><h2>Alimentacion de Mascotas Remotamente</h2><h3><a href=\"/?feed\"\">Alimentar</a></h3>"));
          client.println(F("<table>"));
          archivo = SD.open(NOMBRE_ARCHIVO);
          if (archivo) {
            while(archivo.available()) {
              client.write(archivo.read());
            }
            archivo.close();
          }
          client.println(F("</table></html>"));
          
          
          if (readString.indexOf("?feed") > 0) {
            onServo();
          }

          readString = "";

          delay(500);
          client.stop();
        }
      }
    }
  }
}

void onServo() {
  SG90.write(SOLTAR);
  delay(2000);
  SG90.write(RECIBIR);

  saveNewFeed();
}

void onBoton() {
  if (digitalRead(BOTON) == HIGH) {
    onServo();
  }
}

void iniciarLecturaSD() {
    Serial.println(F("Inicializando Tarjeta SD..."));
    if (!SD.begin(SD_CARD)) {
        Serial.println(F("ERROR - Fallo al inicializar."));
        return;
    }
    Serial.println(F("LISTO! - Tarjeta SD Inicializada."));
    if (!SD.exists(fileName)) {
        Serial.print(F("ERROR - No se encuentra "));
 Serial.print(NOMBRE_ARCHIVO);
 Serial.println('!');
        return;
    }
    Serial.print(F("LISTO! - "));
 Serial.print(NOMBRE_ARCHIVO);
 Serial.println(F(" disponible y accesible."));
}

void saveNewFeed(){
  iniciarLecturaSD();
  File archivoTwo = SD.open(NOMBRE_ARCHIVO, FILE_WRITE);
  if (archivoTwo) {
    Serial.println(F("Escribiendo..."));
    archivoTwo.println(F("<tr>\r\n<td>asd</td>\r\n<td>asd</td>\r\n</tr>"));
    archivoTwo.close();
  }
}

Go Up