Lo spunto per salvare su EEPROM l’ho preso da questo sketch, che mi funziona regolarmente.
/****************** Funziona! *****************************
* test_R/W_interi in 2byte
* SDA (A4), SCL (A5)
* 12 gennaio 2026
* Scrive e legge un intero in 2 celle consecutive della 24LC256
***************************************************************/
#include <Wire.h>
int indirizzo = 0;
int ciclo = 0;
int dato1 = 456;
int dato2 = 789;
int dato1W = 0;
int dato2W = 0;
int dato1R = 0;
int dato2R = 0;
byte uno = 0;
byte due = 0;
void setup(){
Serial.begin(9600);
Wire.begin();
delay(1000);
}
void loop(){
/*********************************** scrittura **************************************************/
Serial.println(" ");
Serial.println("Inizio Scrittura");
//Serial.println(" ");
//-------------------- Primo dato scritto -------------------------------------
uno = ((dato1 >> 8) & 0xFF);
due = (dato1 & 0xFF);
//invio il control byte specificando
//una richiesta di scrittura del primo byte nella cella 0
Wire.beginTransmission(0x50);
//invio due byte contenenti l'indirizzo della
//locazione di memoria che voglio scrivere un byte
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
//scrivo il primo byte nella locazione di memoria
//precedentemente selezionata
Wire.write(byte(uno));
//fine trasmissione
Wire.endTransmission();
//incrementa il valore dell'indirizzo
indirizzo++;
//attendi 5ms per poter terminare le operazioni di
//scrittura sulla memoria
delay(5);
//invio il control byte specificando
//una richiesta di scrittura del secondo byte nella cella 1
Wire.beginTransmission(0x50);
//invio due byte contenenti l'indirizzo della
//locazione di memoria che voglio scrivere un byte
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
//scrivo il secondo byte nella locazione di memoria
//precedentemente selezionata
Wire.write(byte(due));
//fine trasmissione
Wire.endTransmission();
//incrementa il valore dell'indirizzo
indirizzo++;
//attendi 5ms per poter terminare le operazioni di
//scrittura sulla memoria
delay(5);
Serial.print("uno ");
Serial.print(uno);
Serial.print(" due ");
Serial.print(due);
dato1W = ((due << 0) & 0xFF) + ((uno << 8) & 0xFFFF);
Serial.print("\t dato1 scritto ");
Serial.print(dato1W);
Serial.print(" nuova cella ");
Serial.println(indirizzo);
//-------------------- Secondo dato scritto -------------------------------------
uno = ((dato2 >> 8) & 0xFF);
due = (dato2 & 0xFF);
//invio il control byte specificando
//una richiesta di scrittura del primo byte nella cella 2
Wire.beginTransmission(0x50);
//invio due byte contenenti l'indirizzo della
//locazione di memoria che voglio scrivere un byte
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
//scrivo il primo byte nella locazione di memoria
//precedentemente selezionata
Wire.write(byte(uno));
//fine trasmissione
Wire.endTransmission();
//incrementa il valore dell'indirizzo
indirizzo++;
//attendi 5ms per poter terminare le operazioni di
//scrittura sulla memoria
delay(5);
//invio il control byte specificando
//una richiesta di scrittura del secondo byte nella cella 3
Wire.beginTransmission(0x50);
//invio due byte contenenti l'indirizzo della
//locazione di memoria che voglio scrivere un byte
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
//scrivo il secondo byte nella locazione di memoria
//precedentemente selezionata
Wire.write(byte(due));
//fine trasmissione
Wire.endTransmission();
//incrementa il valore dell'indirizzo
indirizzo++;
//attendi 5ms per poter terminare le operazioni di
//scrittura sulla memoria
delay(5);
Serial.print("uno ");
Serial.print(uno);
Serial.print(" due ");
Serial.print(due);
dato2W = ((due << 0) & 0xFF) + ((uno << 8) & 0xFFFF);
Serial.print("\t dato2 scritto ");
Serial.print(dato2W);
Serial.print(" nuova cella ");
Serial.println(indirizzo);
delay(1000);
/*********************************** Lettura **************************************************/
//------------------- primo dato letto -------------------
Serial.println(" ");
Serial.println("Inizio lettura");
//Serial.println(" ");
indirizzo = 0;
dato1 = 0;
dato2 = 0;
//invio il control byte specificando
//una richiesta di scrittura
Wire.beginTransmission(0x50);
//invio due byte per selezionare la locazione
//di memoria da leggere
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
Wire.endTransmission();
//incremento la variabile indirizzo
indirizzo++;
//richiedo un byte al 24LC256
Wire.requestFrom(0x50, 1);
//attendo la disponibilità di dati sul bus i2c
while (Wire.available())
{
//leggo dal bus il dato relativo alla
//locazione di memoria precedentemente specificata
uno = Wire.read();
}
//invio il control byte specificando
//una richiesta di scrittura
Wire.beginTransmission(0x50);
//invio due byte per selezionare la locazione
//di memoria da leggere
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
Wire.endTransmission();
//incremento la variabile indirizzo
indirizzo++;
//richiedo un byte al 24LC256
Wire.requestFrom(0x50, 1);
//attendo la disponibilità di dati sul bus i2c
while (Wire.available())
{
//leggo dal bus il dato relativo alla
//locazione di memoria precedentemente specificata
due = Wire.read();
//invio il dato al serial monitor
Serial.print("uno ");
Serial.print(uno);
Serial.print(" due ");
Serial.print(due);
dato1R = ((due << 0) & 0xFF) + ((uno << 8) & 0xFFFF);
Serial.print("\t dato1 letto ");
Serial.print(dato1R);
Serial.print(" nuova cella ");
Serial.println(indirizzo);
}
//-------------------- secondo dato letto ---------------------------
//invio il control byte specificando
//una richiesta di scrittura
Wire.beginTransmission(0x50);
//invio due byte per selezionare la locazione
//di memoria da leggere
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
Wire.endTransmission();
//incremento la variabile indirizzo
indirizzo++;
//richiedo un byte al 24LC256
Wire.requestFrom(0x50, 1);
//attendo la disponibilità di dati sul bus i2c
while (Wire.available())
{
//leggo dal bus il dato relativo alla
//locazione di memoria precedentemente specificata
uno = Wire.read();
}
//invio il control byte specificando
//una richiesta di scrittura
Wire.beginTransmission(0x50);
//invio due byte per selezionare la locazione
//di memoria da leggere
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
Wire.endTransmission();
//incremento la variabile indirizzo
indirizzo++;
//richiedo un byte al 24LC256
Wire.requestFrom(0x50, 1);
//attendo la disponibilità di dati sul bus i2c
while (Wire.available())
{
//leggo dal bus il dato relativo alla
//locazione di memoria precedentemente specificata
due = Wire.read();
//invio il dato al serial monitor
Serial.print("uno ");
Serial.print(uno);
Serial.print(" due ");
Serial.print(due);
dato2R = ((due << 0) & 0xFF) + ((uno << 8) & 0xFFFF);
Serial.print("\t dato2 letto ");
Serial.print(dato2R);
Serial.print(" nuova cella ");
Serial.println(indirizzo);
}
while(1);
}
Non ho fatto altro che copiare la parte del salvataggio dei dati.