Buenas noches.
Hace ya varios días que intento almacenar datos tipo char secuencialmente (uno tras otro) en una memoria 24LC256 desde un Nano. En internet encontré varios códigos, pero la mayoría ejemplifican el almacenamiento solo en una o algunas posiciones de memoria.
Mi propósito más adelante es elaborar un datalogger en el que los datos sean almacenados en la memoria EEPROM y luego por medio una pequeña aplicación de visual basic sean leídos por el puerto serial.
He tratado reducir al mínimo el código para poder entenderlo mejor, inclusive inserté varios serial-prints como "debuggers" pero cuando se lee los datos almacenados (empleando la aplicación ofrecida por Sparkfun Reading and Writing Serial EEPROMs - SparkFun Learn, observo que se han guardado solo unos 15 datos y al parecer mi código regresa al inicio y comienza a sobreescribir el dato anterior.
Quisiera por favor alguna recomendación para mejorar el código:
#include <Wire.h>
#include <RTClib.h>
#define disk1 0x50
RTC_DS3231 rtc;
unsigned int address = 0;
char pal1[]="";
int analogo = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();
Serial.print("direccion actual inicio");
Serial.print(" ");
Serial.println(address);
Serial.println("Fecha(dd/mm/aa) Hora Temp(°C) Delta(Temp)");
Serial.println("===============================================");
}
void loop() {
DateTime now = rtc.now();
char buf2[] = "DD/MM/YYYY hh:mm:ss ";
now.toString(buf2);
Serial.println(strlen(buf2));
Serial.println(sizeof(buf2));
Serial.print("buf2 es: ");
Serial.println(buf2);
Serial.print("direccion antes del bucle");
Serial.println(address);
for(byte i=0; i<=strlen(buf2);i++){
writeEEPROM(disk1, address+i, buf2[i]);
Serial.print("contador=");
Serial.println(i);
}
address+=strlen(buf2)+1;
Serial.print("direccion despues del bucle");
Serial.println(address);
delay(1000);
}
//write a byte or single char - less than 256
void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) {
Wire.beginTransmission(deviceaddress);
Wire.write((byte)eeaddress >> 8); //writes the most significant byte, move LSB off to right to get rid of it
Wire.write((byte)eeaddress & 0xFF); //writes the least significant byte, mask off LSB with bitwise AND 0
Wire.write(data);
Wire.endTransmission();
delay(30); //15 need this for sure
}
//read a byte or single char - less than 256
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) {
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.write((byte)eeaddress >> 8); //writes the most significant byte
Wire.write((byte)eeaddress & 0xFF); //writes the least significant byte
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available())
rdata = Wire.read();
return rdata;
}