Einstellungen sichern oder kopieren

Hallo User,
gestern bin ich über einen Beitrag gestolpert, dort ging es darum einfach mal einen anderen Fork zu testen.
Neben anderen Inhalten der Ordner Advert und mp3, muss man auch den EEPROM des Arduino löschen, da andere Forks wahrscheinlich auch andere Speicherplätze belegen.

Erstmal zum Hintergrund:
Fürs Laihen- Verständnis hat der Arduino 3 Speicher:
Den Programmspeicher, in dem ist der Ablauf festgeschrieben, was er in welcher Reihenfolge tun soll. Das Programm wird von uns aufgespielt, und dann nicht vom Arduino verändert werden.
Vorgegeben ist dieses Programm hier am TonUINO Beispiel von @Thorsten . Er hat das Programm geschrieben, das wir uns alle in unsere Arduinos laden, damit die wissen was zu tun ist.

Der zweite Speicher ist der Ram. Ein Notizzettel, der jedesmal vernichtet wird, wenn man den Arduino ausschaltet.
Hier wird bspw. gespeichert wann das letzte Lied beendet wurde (um im Standby auszuschalten) oder welche Modifier Karten aufgelegt wurden.
Der Arduino merkt es sich, um damit zu arbeiten. Schaltet man ihn aber ab, ist diese Info verloren.

Und der dritte Speicher ist der EEPROM.
Ein weiterer Notizzettel des Arduinos, dieser wird allerdings nicht vernichtet wenn der Arduino ausgeschalten wird.
Hier kann der Arduino selbstständig (also wenn es im Programm verlangt ist) Werte notieren und auch wieder lesen.
Die Größe des EEPROM ist im Vergleich zum RAM gering, deshalb nutzt man ihn nur für Werte die über den Stromausfall hinweg gespeichert werden müssen.
Ein weiterer Nachteil ist, dass man den EEPROM nicht unendlich oft beschrieben werden kann, dies ist aber nur für die Programm-Schreiber von Bedeutung.
Auf unserem TonUINO liegen hier bspw. die Start-Lautstärke, der PIN fürs AdminMenü oder die Zeit für den Standby Timer.

Jetzt zu meinem einleitenden Problem.
Wenn man nun mal schnell einen Fork testen möchte, muss man den EEPROM zurücksetzen, was zur Folge hat, dass sämtliche Einstellungen vergessen werden.

Nun bin ich bei github aus einen einfachen Sketch gestoßen, der den EEPROM ausliest und auch wieder beschreibt.

Um nun die Einstellungen für unseren TonUINO zu sichern oder zu kopieren, müssen wir nun das Programm ändern, um den Notizzettel zu lesen. Auf dem neuen Arduino kommt dann ein weiteres Programm, dass den Notizzettel vorbeitet, bevor dann die TonUINO Software aufgespielt wird.

Ihr habt alle schon die Software vom TonUINO per IDE hochgeladen. Genau so machen wir es nun wieder, nur dass wir nicht das Programm des TonUINO laden, sondern dieses hier, angelehnt an das Programm von thom1337:

#include <EEPROM.h>

// start reading from the first byte (address 0) of the EEPROM
int address = 0;
byte value;

void setup() {
  // initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.print("const byte eeprom_data[] = {");
}

void loop() {

  value = EEPROM.read(address);
  Serial.print(value, DEC);

  if (address < (EEPROM.length()-1) ) {
    Serial.print(",");
  }

  address = address + 1;
  if (address == EEPROM.length()) {
    // We are done
    Serial.print("};");
    delay(5000);
    exit(0);
  }

  delay(10);
}

Schaltet ihr den Seriellen Monitor mit 9600 Baud ein, erhaltet ihr eine Zeile die mit
const byte eeprom_data[] = {2,255,255,255,255,255,25… beginnt und gefühlt unendlich nach hinten reicht.
Dies ist der Inhalt eures EEPROM, diese müsst ihr euch in irgendeiner Textdatei auf dem Rechner speichern. Schreibt euch dazu für welchen Fork die Datei ist.

Nun nehmt ihr euch den neuen Arduino und steckt ihn an den Rechner.
Für ihn ist dieses Programm gedacht:

#include <EEPROM.h>

const byte eeprom_dat.....

void setup() { 
  
  // initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Starting...");
}

void loop() {


  for (int i = 0; i < sizeof(eeprom_data); i++) {
    Serial.print("Writing to address ");
    Serial.print(i);
    Serial.print(" with value ");
    Serial.print(eeprom_data[i]);
    Serial.println();

    EEPROM.update(i, eeprom_data[i]);

    delay(100);
  }

  Serial.print("Notizzettel fertiggestellt.");
  delay(5000);
  exit(0);

}

Weit oben im Code ist „const byte eeprom_dat…“ angedeutet, dort kopiert ihr die gesamte Textzeile hin, also beginnend mit „const“ endend mit „,255};“ und sehr vielen Zahlen dazwischen.

Über den Seriellen Monitor könnt ihr dem Schreibvorgang dann zuschauen. Ist der Notizzettel dann auf dem Arduino hinterlegt, könnt ihr das TonUINO Programm hochladen und habt euren TonUINO erfolgreich kopiert.

Ja,das ist zwar machbar aber ich glaube das der Aufwand doch im Verhältnis zur neukonfiguration sehr hoch ist. Wenn wir uns überlegen, welche Werte denn eigentlich im eeprom von Interesse sind kommen wir auf den Standby-Timer, das invertieren oder nicht invertieren der vol Tasten, den Schutz des Adminmenüs und die shortcuts auf den Tasten. Ggf noch die Fortschritte der Hörbücher. Letzteres erachte ich als einziges wichtiges Kriterium. Aber es steht ja jedem frei, ob und was er eventuell sichern will.