Explications sur l écriture sur une eeprom

Bonsoir,
Je bricole toujours mon arduino pour avancer.
Je teste, modifie, triture des sketch pour apprendre.
J’ai commencer par le I2C car je trouve ca génial de limiter les cables…

J’en suis ,apres le lcd 1602, le am2320 a l’écriture sur une eeprom toujour en I2C

J’utilise ce modèle, que j’ai déjà bidouillé :

/*
  *  Use the I2C bus with EEPROM 24LC64
  *  Sketch:    eeprom.ino
  *
  *  Author: hkhijhe
  *  Date: 01/10/2010
  *
  *
  */

#include <Wire.h>



void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
    int rdata = data;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.write(rdata);
    Wire.endTransmission();
}

// WARNING: address is a page address, 6-bit end will wrap around
// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes
void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddresspage >> 8)); // MSB
    Wire.write((int)(eeaddresspage & 0xFF)); // LSB
    byte c;
    for ( c = 0; c < length; c++)
        Wire.write(data[c]);
    Wire.endTransmission();
}

byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
    byte rdata = 0xFF;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress,1);
    if (Wire.available()) rdata = Wire.read();
    return rdata;
}

// maybe let's not read more than 30 or 32 bytes at a time!
void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte *buffer, int length ) {
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress,length);
    int c = 0;
    for ( c = 0; c < length; c++ )
        if (Wire.available()) buffer[c] = Wire.read();
}




void setup()
{
     Wire.begin(); // initialise the connection
     Serial.begin(9600);
    char somedata[] = "this is data from the eeprom"; // data to write "this is data from the eeprom"
    i2c_eeprom_write_page(0x54, 0, (byte *)somedata, sizeof(somedata)); // write to EEPROM

    delay(100); //add a small delay
   char somedata1[] = "Ceci est un test ecriture ep"; // data to write "this is data from the eeprom"
    i2c_eeprom_write_page(0x54, 32, (byte *)somedata1, sizeof(somedata1)); // write to EEPROM

    delay(100); //add a small delay
    Serial.println("Memory written");
}

void loop()
{
    int addr=0; //first address
    byte b = i2c_eeprom_read_byte(0x54, 0); // access the first address from the memory

    while (b!=0)
    {
        Serial.print((char)b); //print content to serial port
        addr++; //increase address
        b = i2c_eeprom_read_byte(0x54, addr); //access an address from the memory
    }
    Serial.println(" ");
    delay(2000);

      addr=32; //first address
      b = i2c_eeprom_read_byte(0x54, 0); // access the first address from the memory

    while (b!=0)
    {
        Serial.print((char)b); //print content to serial port
        addr++; //increase address
        b = i2c_eeprom_read_byte(0x54, addr); //access an address from the memory
    }
    Serial.println(" ");
    delay(2000);
}

Il marche bien, je comprends l’essentiel du sketch, mais je bute sur la compréhension de l’instruction suivante:

char somedata[] = "this is data from the eeprom";

Bon, je vois que l’on déclare un tableau de char contenant la chaine de caractères “this is data from the eeprom”;
J’ai essayé un peu plus loin le meme tableau avec un contenu différent pour l’ecrire sur l’eeprom en enregistrement no2 et là patatras, marche pas. Obligé de déclarer un deuxième
char somedata1 = “Ceci est un test ecriture ep”;

Pourriez vous m expliquer le fonctionnement et comment faire pour ecrire plusieurs enregistrement a la suite? Avec la meme variable.
Merci.

En C le nom d'un tableau est synonyme de l'adresse de son premier élément (ici le premier caractère le la chaîne). Sachant cela le tableau ne peut a la fois être l'adresse d'une chaîne et l'adresse d'une autre.

Passe par un pointeur et par strlen plutôt que sizeof.

char *somedata = "this is data from the eeprom"; // data to write "this is data from the eeprom"
i2c_eeprom_write_page(0x54, 0, (byte *)somedata, strlen(somedata)); // write to EEPROM

    delay(100); //add a small delay
   somedata = "Ceci est un test ecriture ep"; // data to write "this is data from the eeprom"
    i2c_eeprom_write_page(0x54, 32, (byte *)somedata, strlen(somedata)); // write to EEPROM

supercc: En C le nom d'un tableau est synonyme de l'adresse de son premier élément (ici le premier caractère le la chaîne). Sachant cela le tableau ne peut a la fois être l'adresse d'une chaîne et l'adresse d'une autre.

Passe par un pointeur et par strlen plutôt que sizeof.

char *somedata = "this is data from the eeprom"; // data to write "this is data from the eeprom"
i2c_eeprom_write_page(0x54, 0, (byte *)somedata, strlen(somedata)); // write to EEPROM

    delay(100); //add a small delay   somedata = "Ceci est un test ecriture ep"; // data to write "this is data from the eeprom"     i2c_eeprom_write_page(0x54, 32, (byte *)somedata, strlen(somedata)); // write to EEPROM

Merci, je vais regarder ca...