Verständnissfrage zum speichern von Daten

Hallo,

ich habe schon einige MIDI-Controller gebaut. Zum testen/entwickeln nehme ich einen Arduino Uno und natürlich die Arduino IDE. Nun habe ich ein neues Projekt, dass sich etwas von meinen anderen unterscheidet.
Es soll ein Display verbaut sein, was auch schon funktioniert und eine Laden/Speichern Funktion haben. Entweder denke ich zu kompliziert oder ich verstehe es nicht.
Ich möchte gerne die Einstellungen/Konfiguration, für verschiedene Musiksoftware, des MIDI Controllers abspeichern können (am besten mit Namen). Diese sollen dann über das Display dargestellt und geladen werden können.
z.B.
Config1
Config2
.
.
etc.
Ich habe 3 Arrays a 32Byte gross nun möchte ich diese drei Arrays auf einen externen EEprom oder SD Karte speichern ABER wie mach ich das mit den Namen bzw. wie finde ich die verschiedenen Dateien wieder?
Ich denke das speicher und einlesen der Daten über die eeprom bzw. sd Library sollte kein Problem sein aber wie unterscheide ich die verschiedenen Config Dateien.

Ausserdem kommt noch hinzu das der ganze MIDI Controller Modular aufgebaut wird, deshalb auch versiedene Konfigurationen.

Ich hoffe ihr versteht was ich meine. Falls nicht kann ich das auch noch expliziter Darstellen.

Schon mal vielen Dank.

Grüße
Stefan

Ich habe 3 Arrays a 32Byte gross nun möchte ich diese drei Arrays auf einen externen EEprom .... speichern

Dabei könnte ich dir helfen!

ABER wie mach ich das mit den Namen

In dem du einen Namen vergibst!

bzw. wie finde ich die verschiedenen Dateien wieder?

Die Daten im EEPROM findest du über ihre Adresse.
Und die Adresse über den Namen.

#include <Streaming.h>
#include <EEPROM.h>


// die Zelle an Position imEEPROM[1][24] wird
// bei jedem Reset hochgezählt.


using InnerArray = byte[32];
using OuterArray = InnerArray[3];
OuterArray imEEPROM EEMEM;


void setup() 
{
  Serial.begin(9600);
  Serial << "Start: "<< __FILE__ << endl;

  InnerArray datensatz; // zwischenspeicher im Ram
  EEPROM.get((int)imEEPROM[1],datensatz); // einen von 3 Datensaetzen lesen
  Serial << "data: "<< datensatz[24] << endl;
  datensatz[24]++;
  EEPROM.put((int)imEEPROM[1],datensatz); // schreiben
  
}

void loop() 
{

}

Danke für deine Antwort.

Heißt das, daß ich quasi den Namen schreibe und danach das Array?
also z.b:
Name gefolgt von 32 Datenbytes
Name2 gefolgt von32 Datenbytes
usw.

Wobei man den Namen über das Display eingeben können soll.

Wobei man den Namen über das Display eingeben können soll

Dahinter stecken vermutlich mehrere Verständnis-Probleme.

Ein Text auf einem Display hat erstmal nichts mit einem Variablennamen zu tun, außer du programmierst das so.
Wie man auf einem Display einen "Namen eingibt", verstehe ich wiederum nicht.

Combie möchte, dass du die Syntax und Bedeutung von using lernst (und möglichst noch den Vorteil verstehst :slight_smile: )

using InnerArray = byte[32];
InnerArray datensatz;

ist erstmal dasselbe wie

byte datensatz[32];

Der Datentyp OuterArray ist ein Array aus 3 InnerArray Elementen.
Zusätzlich ist bei der Verwendung als Funktionsparameter klar, dass datensatz kein byte* ist, sondern ein Array mit bekannter Größe.

Die mir besonders verquere Reihenfolge der Indizes von imEEPROM[1][24] muss man trotzdem kennen.

Der erforderliche cast auf (int) ist in der EEPROM Library sehr verwirrend, finde ich. Eigentlich wird da eine Adresse (Zeiger) übergeben.

michael_x:
Wie man auf einem Display einen "Namen eingibt", verstehe ich wiederum nicht.

Ich glaube der Threadersteller, hat das bei anderen Midi Controllern abgeschaut.
Da ist es meistens so, dass man eine Menüfunktion hat -> Edit Name, Save Preset etc.
und dann geht man Buchstabe für Buchstabe mit einem Drehgeber durch,
bei dem man dann auf dem Display sieht, welchen Buchstabe durch den Drehgeber
jetzt gerade ausgewählt wurde und schreibt so Buchstabe für Buchstabe den Presetnamen.

wenn man fertig ist, bestätigt man den Namen mit einem Tastendruck.

so in etwa.

so in etwa.

Da sollte man den Namen auch im EEPROM speichern, zur Vereinfachung eine feste Anzahl Buchstaben vorsehen und überhaupt nicht an eine Verbindung mit Variablennamen denken.

EEPROM und SD wären aber so unterschiedliche Ansätze, dass man sich auf eins von beiden festlegen sollte. Bei SD könnten Dateien und der Dateiname Sinn machen, bei EEPROM eher nicht.
Einen Teil des EEPROM für eine Pseudo-Dateiverwaltung zu reservieren und diese realisieren, halte ich für witzig,
aber eigentlich soll es ja was mit MIDI werden

Der erforderliche cast auf (int) ist in der EEPROM Library sehr verwirrend, finde ich. Eigentlich wird da eine Adresse (Zeiger) übergeben.

Das habe ich privat schon geändert.
Das macht die Sache zudem deutlich Typesicherer.

Allerdings würde eine Übertragung in den Arduino Core eine Erweiterung der Doku und der Beispiele nach sich ziehen.


Combie möchte, dass du die Syntax und Bedeutung von using lernst (und möglichst noch den Vorteil verstehst :slight_smile: )

Ja... kann man so sagen.

Eigentlich liegt der Fokus nicht so sehr auf using, sondern auf Datentypen im allgemeinen.
C++ bietet und vielfältige Datentypen und Möglichkeiten zur Manipulation dieser.

Ganz oben auf der Prioritätenliste steht bei mir:
Stabile Programme durch Typesicherheit.

Je geschickter man das angeht, desto weniger Chance hat man Bockmist zu bauen.

Und ins Besondere, das gibts kostenlos dabei.
Nur evtl. etwas mehr Schreibarbeit, aber dafür viel weniger debuggen.


Zusätzlich ist bei der Verwendung als Funktionsparameter klar, dass datensatz kein byte* ist, sondern ein Array mit bekannter Größe.

Referenzen tragen die Größe des Elementes in ihrem Datentype mit sich.
Hier u.A. die Arraygröße.
Sobald der Array Bezeichner zu einem Pointer auf Bytes zerfällt, geht die Array Größe verloren.
Das eröffnet einer Vielzahl von Fehlerquellen Tür und Tor.

michael_x:
Combie möchte, dass du die Syntax und Bedeutung von using lernst (und möglichst noch den Vorteil verstehst :slight_smile: )

using InnerArray = byte[32];

InnerArray datensatz;



ist erstmal dasselbe wie


byte datensatz[32];



Der Datentyp OuterArray ist ein Array aus 3 InnerArray Elementen.

@michael_x: Denke das habe ich verstanden. Mit using kann ich mehrere Arrays zu einem zusammefassen also InnerArray besteht aus 32 bytes und OuterArray ist 3 mal InnerArray.

@masterheavy: Richtig, genau so.

Ich denke ich geh auf ne SD-Karte zum speichern der Daten.
Am liebsten wäre es mir (falls möglich) die ganzen Werte in einer .txt Datei zu speichern.

Werde mal noch etwas lesen.

Grüsse

Stefan

mannitb303:
Am liebsten wäre es mir (falls möglich) die ganzen Werte in einer .txt Datei zu speichern.

Wie wäre es mit csv?

SdFat bringt da ein paar Beispiele mit.

mannitb303:
Ich denke ich geh auf ne SD-Karte zum speichern der Daten.
Grüsse

Stefan

SD Karte klingt total gut, solltest Du dann mehrere dieser Midi Controller bauen, können Die Leute ihre Presets untereinander auch austauschen...

Hi,

@agmue: Werde darüber nachdenken. Macht es eigentlich einen unterschied ob txt oder csv?

@masterheavy: Ja war auch mein Gedanke.

Ich warte jetzt erst mal auf mein SD-Slot Board.
Werde jetzt mal ein kleines Menü einbauen und sobald das SD-Board da ist das lesen und schreiben von Dateien testen.

Grüße
Stefan

mannitb303:
@agmue: Werde darüber nachdenken. Macht es eigentlich einen unterschied ob txt oder csv?

Bei txt kannst Du Dir ein eigenes Format ausdenken, während csv auch von Tabellenkalkulationsprogrammen verstanden wird. Wenn Du Daten austauschen möchtest, könnte das ein Vorteil sein.

Hallo alle zusammen,

habe jetzt mein SD-Board und SD-Karte. Allerdings habe ich festgestellt, daß die I/O Pins von meinem Arduino UNO nicht ausreichen und bin auf ein Mable Mini (Clone) Board umgestiegen. Es geht bis jetzt alles, meine gemuxten Encoder, LCD Display meine gemuxten Potis etc., allerdings bekomme ich die SD-Karte nicht zum laufen.
Ich habe natürlich den 32STMDuino Core installiert und habe, wie in anderen bzw. auch in diesem, daß SD Beispiel benutzt. Ich kapiere aber nicht wo bzw. wie ich den SPI wechsle.
Es gibt etliche Beispiele im Netz einige schreiben das man SPI.setMOSI(Pin) nehmen soll dann mit SPIx.begin() usw.
Ich finde aber in dem SD Beispiel nirgends ein SPI.begin().....
Egal welchen SPI Port das ich nutze es geht nicht, denke es liegt an dem CS-Pin. Ich hab natürlich versucht ihn zu mappen, habs aber nicht hinbekommen.
Hat jemand Tipps für mich?

Danke.
Stefan

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.