Actualmente estoy practicando para realizar un programa que cada cierto tiempo me guarde un dato tipo Float en memoria eeprom 24LC512 y se incremente dicha posición hasta llegar a 390 datos y estoy usando la librería AT24XC, para lo cual elabore un pequeño programa de prueba, para comprobar si me lee y guarda los datos tal como yo quiero, pero no me esta funcionando quería que me aclararan cuales errores estoy cometiendo ya que no lo puedo detectar y este es el programa que hice:
#include <Wire.h>
#include <AT24CX.h>
float temp;
float f;
int Time_Seg = 86400; // duracion de un dia 24 horas o 86400 seg
int i;
int Count_Seg;
AT24CX Memoria;
// setup
void setup() {
Serial.begin(9600);
Serial.println("Uso de la librería AT24CX para leer y escribir datos tipo Float");
Count_Seg = 0;
i=0;
temp = 3.14;
f=0;
}
void loop() {
if(Count_Seg >= 60){
Serial.print(F("Se guarda valor en memoria: "));
Serial.println(temp);
Serial.print("posicion[");
Serial.print(i);
Serial.println("] = ");
Memoria.writeFloat(i, temp);
Count_Seg = 0;
temp++;
i++;
if (i >10){
i=0;
}
}
delay(1000);
Count_Seg++;
f = Memoria.readFloat(i);
delay(100);
Serial.print("... leo en memoria: ");
Serial.print("posición[");
Serial.print(i);
Serial.print("] = ");
Serial.println(f);
}
Moderador:
En el título no debe usarse la palabra Ayuda. Edita!!
Edita también el código usando etiquetas tal como se explica en las normas que te dejo a continuación.
Después de varias pruebas logre hacer que mi memoria AT24C512 grabara la información correctamente y la leyera de la misma forma, mi error fue que a la hora de grabar los datos olvide que un Float equivale a 4 byte y a la hora de realizar la grabación lo realizaba de forma consecutiva, es decir, en la posición 1 colocaba por ejemplo 3.14 y en la 2 colocaba otro como 6.14 y que sucedía que sencillamente me borraba parte del dato en la primera celda, y cuando leia dicho dato me arrojaba pura basura. lo modifique y aquí les dejo el código, el cual trabaja de la siguiente manera. Graba un valor en determinado tiempo aquí es mas o menos 5 seg, pero se puede modificar dicho valor, que inicialmente lo puse de 22.33, colocado en el registro temp, el ira guardando el valor de temp incrementado en 1 y lo coloca en la próxima posición del float siguiente.
#include <Wire.h>
#include <AT24CX.h>
float temp;
float f;
int Time_Seg = 86400; // duracion de un dia 24 horas o 86400 seg
int i;
int j;
int Count_Seg;
AT24CX Memoria;
// setup
void setup() {
Serial.begin(9600);
Serial.println("Uso de la libreria AT24CX para leer y escribir varios tipos de datos");
Serial.println("----------------------");
Count_Seg = 0;
i=0;
j=0;
temp = 22.33;
f=0;
}
void loop() {
if(Count_Seg >= 5){
Serial.print(F("Se guarda valor en memoria["));
Serial.print(temp);
Serial.print("] posicion[");
Serial.print(i);
Serial.println("] = ");
Memoria.writeFloat(i, temp);
Count_Seg = 0;
if (i >360){
i=0;
temp = 22.33;
}
temp++;
i = i + 4;
}
delay(500);
Serial.println("Procedo a leer Memoria");
for(j=0;j<360+4*sizeof(float); j+= sizeof(float)){
f = Memoria.readFloat(j);
delay(10);
Serial.print("posicion[");
Serial.print(j);
Serial.print("] = ");
Serial.println(f);
}
Count_Seg++;
}
Espero que les sirva y si me puede sugerir como mejorarlo muchas gracias, funciona al 100%. Saludos