Ayuda para novato desesperado

Hola,

Llevo días intentando solucionar un problemilla en un Sketch sencillo pero no me salgo. El funcionamiento consiste en ir leyendo un archivo de texto en el Loop y a la vez chequear la conexión de un cliente web y la pulsación para leer o apagar un led.

La lectura del archivo hasta que no se pulsa sobre uno de los links de la web es correcta, si se pulsa en cualquiera de los links ya no vuelve a leer el arhivo de la SD.

Supongo que debe ser algo sencillo pero no lo soluciono,

Un saludo

Contenido del Skerch:

#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
String readString;
byte mac = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//dirección MAC de la Ethernet Shield que está con una etiqueta debajo la placa
IPAddress ip(192,168,0,15); // la IP al Arduino
EthernetServer server(80); //servidor Web con el puerto 80 que es el puerto HTTP por defecto
int led=32;
File myFile;
void setup()
{
// Se abre puerto de comunicación serie:
Serial.begin(9600);
Serial.print(“Inicializa Tarjeta SD”);
Ethernet.begin(mac, ip);
server.begin();

Serial.println(Ethernet.localIP());
pinMode(53, OUTPUT);
digitalWrite(53, HIGH);
pinMode(led, OUTPUT);
if (!SD.begin(53)) {
Serial.println(“Error inicializar tarjeta SD!”);
return;
}
Serial.println(“Tarjeta SD ok”);

}

void loop()
{
lee(); // lee archivo de texto
delay(50);
EthernetClient client = server.available();
myFile.close();
if (client) {

while (client.connected()) {
if (client.available()) {
char c = client.read();

if (readString.length() < 100) {
//store characters to string
readString += c;
//Serial.print(c);
}
//if HTTP request has ended
if (c == ‘\n’) {
///////////////
Serial.println(readString); //print to serial monitor for debuging
//now output HTML data header
if(readString.indexOf(’?’) >=0) { //don’t send new page
client.println(“HTTP/1.1 204 JAVO”);
client.println();
client.println();
}
else {
client.println(“HTTP/1.1 200 OK”); //send new page
client.println(“Content-Type: text/html”);
client.println();

client.println("");
client.println("");
client.println(“Pruebas de servidor web Arduino”);
client.println("");
client.println("");
client.println(“

WEB arduino JAVO

”);
client.println("<a href="/?on" target=“inlineframe”>ON");
client.println("<a href="/?off" target=“inlineframe”>OFF");
client.println("<IFRAME name=inlineframe style=“display:none” >");
client.println("");
client.println("");
client.println("");
}

delay(50);
//stopping client
client.stop();

///////////////////// control arduino pin
if(readString.indexOf(“on”) >0)//checks for on
{
digitalWrite(led, HIGH); // set pin 4 high
Serial.println(“Led On”);
}
if(readString.indexOf(“off”) >0)//checks for off
{
digitalWrite(led, LOW); // set pin 4 low
Serial.println(“Led Off”);
}
//clearing string for next read
readString="";

}
}
}
}

}
void lee()
{

myFile = SD.open(“test.txt”);
if (myFile) {
Serial.println(“test.txt:”);
// read from the file until there’s nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
} else {
// if the file didn’t open, print an error:
Serial.println(“error opening test.txt”);

}
}

JavoIno, lo primero te recomiendo siempre poner el cógido entre las etiquetas de codigo, lo haces con el ante penúltimo botón, si te posiciones sobre el dice "Code"

lo segundo, creo que el problema está en que luego que presionas un link, arduino se queda en el loop

while (client.connected()) {

para solucionarlo, la función "lee();" debería ir dentro del while, prueba incluyéndola para saber si esta vez consigue leerla (primero prueba repitiéndola en ambos lados)

y otra cosa

lee(); // lee archivo de texto
    delay(50);
     EthernetClient client = server.available();
      myFile.close();
  if (client) {

la linea "myFile.close();" está demás ya que la conexión al archivo ya fue cerrada en la misma función "lee();"

Muchas gracias gepd,

He probado lo que me dices, he puesto el código de lectura del archivo dentro del bucle While y continua con el error a partir de que se pulsa en cualquier link de la web.

No consigo dar con la solución y eso que el código es simple.

Saludos

Javolno

hice unas pruebas con mi Arduino (Mega) y todo parece funcionar bien, como tu quieres que funcione:

esto es lo que me muestra el monitor serial:

Inicializa Tarjeta SD
Tarjeta SD ok
192.168.x.x
test.txt:
texto de prueba
test.txt:
texto de prueba
test.txt:
texto de prueba
GET / HTTP/1.1
test.txt:
texto de prueba
GET /favicon.ico HTTP/1.1

Led On
test.txt:
texto de prueba
test.txt:
texto de prueba
test.txt:
texto de prueba
test.txt:
texto de prueba
test.txt:
texto de prueba
test.txt:
texto de prueba
test.txt:
texto de prueba
GET /?off HTTP/1.1

Led Off
test.txt:
texto de prueba
test.txt:
texto de prueba
test.txt:
texto de prueba
test.txt:
texto de prueba

Con algunas variantes, ese fue el código que usé:

#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

String readString; 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//dirección MAC de la Ethernet Shield que está con una etiqueta debajo la placa
EthernetServer server(80); //servidor Web con el puerto 80 que es el puerto HTTP por defecto
int led = 32;
File myFile;
void setup()
{
// Se abre puerto de comunicación serie:
  Serial.begin(9600);
  Serial.println("Inicializa Tarjeta SD");
  
  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  
    if (!SD.begin(4)) {
        Serial.println("Error inicializar tarjeta SD!");
        return;
  }
  Serial.println("Tarjeta SD ok");
  
  Ethernet.begin(mac);
  server.begin();
  Serial.println(Ethernet.localIP());
  
}
 
void loop()
{
    lee(); // lee archivo de texto
    delay(50);
     EthernetClient client = server.available();
  if (client) {
   
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (readString.length() < 100) {
          //store characters to string 
          readString += c; 
          //Serial.print(c);
        } 
        //if HTTP request has ended
        if (c == '\n') {
          ///////////////
          Serial.println(readString); //print to serial monitor for debuging 
            //now output HTML data header
          if(readString.indexOf('?') >=0) { //don't send new page
            client.println("HTTP/1.1 204 JAVO");
            client.println();
            client.println();  
          }
          else {
            client.println("HTTP/1.1 200 OK"); //send new page
            client.println("Content-Type: text/html");
            client.println();

            client.println("<HTML>");
            client.println("<HEAD>");
            client.println("<TITLE>Pruebas de servidor web Arduino</TITLE>");
            client.println("</HEAD>");
            client.println("<BODY>");
            client.println("<H1>WEB arduino JAVO</H1>");
            client.println("<a href=\"/?on\" target=\"inlineframe\">ON</a>"); 
            client.println("<a href=\"/?off\" target=\"inlineframe\">OFF</a>"); 
            client.println("<IFRAME name=inlineframe style=\"display:none\" >");          
            client.println("</IFRAME>");
            client.println("</BODY>");
            client.println("</HTML>");
          }

          delay(50);
          //stopping client
          client.stop();

          ///////////////////// control arduino pin
          if(readString.indexOf("on") >0)//checks for on
          {
            digitalWrite(led, HIGH);    // set pin 4 high
            Serial.println("Led On");
          }
          if(readString.indexOf("off") >0)//checks for off
          {
            digitalWrite(led, LOW);    // set pin 4 low
            Serial.println("Led Off");
          }
          //clearing string for next read
          readString="";

        }
      }
    }
  }

}
void lee()
{

  myFile = SD.open("test.txt");
   if (myFile) {
    Serial.println("test.txt:");
       // read from the file until there's nothing else in it:
    while (myFile.available()) {
        Serial.write(myFile.read());
    }
    Serial.println();
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");

  }
}

Eliminé la variable IP para que el router asignara una automáticamente, además cambié los ping que corresponden a arduino Mega.

lo demás está todo igual.

lo que no entiendo es para que quieras que lea el texto constantemente, ¿qué es lo que intentas hacer?

Ok,

Funcionando, el error estaba en "if (!SD.begin(4)) {" , tenía puesto 53 en vez de 4

Muchas gracias