Buenas a todos,
Escribo por aquí, ya que estoy teniendo un problema con la lectura de datos SD en un proyecto a ver si alguien me puede arrojar algo de ayuda...
En primer lugar, el proyecto consiste en recibir datos de un sensor, guardarlos en una SD y enviarlos por modbus.
El problema que tengo, es que si el arduino se desconectase, necesito que el ultimo valor del sensor no se pierda, por esto lo de usar la SD. He conseguido grabar el valor, pero no leerlo.
Me es indiferente ir guardando valores uno detrás de otro o un único valor y sobrescribir (de la segunda opción, no he conseguido ningún avance...). El caso es poder leer el valor de la SD y continuar en caso de desconexion.
Os pongo el código con el que consigo escribir, pero no leer el último valor desde la SD.
Muchas gracias de antemano.
#include <SPI.h>
#include <Ethernet.h>
#include "MgsModbus.h"
#include <SD.h>
int caudalMax = 15000; // Caudal masico en ml (0-15.000) L/h
int Valor;
int Valor1;
int incremento;
int acumulado=0;
int acumuladoL=0;
MgsModbus Mb;
File myFile;
String cadena = " ";
// Configuración ethernet
byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x94, 0xB5 };
IPAddress ip(192, 168, 1, 151);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
void setup()
{
Serial.begin(9600);
Serial.println("Iniciando SD ...");
if (!SD.begin(4)) {
Serial.println("No se pudo inicializar");
return;
}
Serial.println("inicializacion exitosa");
Ethernet.begin(mac, ip, gateway, subnet); // Inicialización ethernet
Mb.MbData[0] = 0; // holding Registrer 40001
Mb.MbData[1] = 0; // holding Registrer 40002
Mb.MbData[2] = 0; // holding Registrer 40003
}
void loop()
{
Mb.MbsRun();
leerSD();
analogReadResolution(12); //Damos resolucion de 12 bits al Due
Valor = analogRead(0); //Leemos la entrada analógica
Valor1 = map(Valor , 0, 4096, 0, caudalMax); //Escalamos el valor
Serial.println("Valor leido y escalado:");
Serial.println(Valor1);
incremento = Valor1/360; //ml a incrementar en cada vuelta de 10 segundos
Serial.println("Valor de incremento:");
Serial.println(incremento);
acumulado+=incremento; //Añadimos al acumulado el incremento (ml)
Serial.println("Acumulado:");
Serial.println(acumulado);
acumuladoL=acumulado/1000; //Acumulado en L
Serial.println("Acumulado en litros:");
Serial.println(acumuladoL);
escribirSD();
Mb.MbData[0] = Valor1;
Mb.MbData[1] = acumulado;
Mb.MbData[2] = acumuladoL;
//Serial.println(Mb.MbData[0]);
delay (10000);
}
void escribirSD()
{
myFile = SD.open("datos.txt", FILE_WRITE);//abrimos el archivo
if (myFile) {
Serial.println("Escribiendo SD");
myFile.println(Valor1);
myFile.close(); //cerramos el archivo
}
else {
Serial.println("Error al abrir el archivo");
}
}
void leerSD()
{
myFile = SD.open("datos.txt",FILE_READ);//abrimos el archivo
if (myFile)
{
bool line=false;
myFile.seek(myFile.size()-1); //Ubicacion en posicion anterior a ultimo caracter
while (myFile.available())
{
if(line==false) //Primero leer en reversa para buscar salto de linea
{
char caracter=myFile.read();
Serial.println(caracter);
myFile.seek(myFile.position()-2);
if(caracter=='\n') //Cuando encuentra salto de linea cambia estado
{
line=true;
}
}
if(line==true) //Empieza a leer normalmente de izquierda a derecha
{
char caracter=myFile.read();
//Serial.println(caracter);
cadena=cadena+caracter;
if(caracter=='\n') //La cadena termina en este caracter
{
break;
}
}
}
myFile.close(); //cerramos el archivo
}
else
{
Serial.println("Error al abrir el archivo");
}
cadena="";
}