INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Speichern u. Lesen von Variablen von SDCard
23.08.2018, 21:55
Beitrag #1
Speichern u. Lesen von Variablen von SDCard
Hallo Aruino Gemeinde,
Ich habe ein SD -Karten Modul, das ich auslesen und beschreiben will.
Es sollen dazu alle Variablen und deren Werte am Ende meiner
void loop() abgespeichert werden, damit ich diese beim erneuten wiedereinschalten und Programmstart des Aruiono Mega 2560 wieder einlesen kann.
void setup()
Die Variablen die ich abspeichern möchte lauten;
int steps = 800; // maximal 4 Stellige (Zahl 1-9999)
long startblatt; // maximal 2 Stellige (Zahl 1 bis99)
long zielblatt; // maximal 2 Stellige (Zahl 1 bis 99)


Übungen mit ReadWrite und CardInfo gingen super
Weiß jedoch jetzt nicht so richtig weiter wie sich das mit Variablen verhält.
Beide Programmteile Lesen und Schreiben fehlen mir. Weiß nicht recht wie ich die Lese und Schreibschleife aufbauen soll. Das ist jetzt der Sketch


Code:
void setup()
{

  Serial.begin(9600);              //öffnet die serielle Datenübertragung mit 9600 bit/s
  while (!Serial)                  //wait for serial port to connect. Needed for native USB port only
    Serial.println("Zugzielanzeiger  mit 1 - 40 Blättern");
  Serial.println("Christian Richter Software Version 1.5.");
  Serial.println("---------------------------------------------");
  Serial.println("");

  // Prüfen der SD Karte zum Daten holen (die Variablen, die beim Letzten Betrieb gespeichert wurden
  Serial.print("Initializing SD card...");

  if (!SD.begin(53))
  {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // jetzt fehlt mir die Lese- Schleife mit dem ich die test.txt auslese und der o.g. Variablen,  und die Variablen Werte setzte
  
  ;
}


void loop()
{}// nachdem die Variblen in loop verarbeitet wurden, sollen sie am Ende der loop gespeichert werden  // jetzt fehlt mir auch hier eine Schreib- Schleife mit dem ich die test.txt die alten Variablen Werte überschreibe  o.g. Variablen

Über Eure Hilfe wäre ich sehr erfreut
Danke

Viele Grüße Christian
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.08.2018, 23:37
Beitrag #2
RE: Speichern u. Lesen von Variablen von SDCard
Loop wird im Normalfall viele Male pro Sekunde ausgeführt und das sollte auch nicht durch delay ausgebremst werden.
Eine Speicherstelle einer SD kann je nach Qualität zwischen 10 000 und 100 000 mal beschrieben werden. Gute Karten verteilen zwar die Schreibzugriff, bei Deinem geplanten Schrebvorgängen wird die SD aber nicht lange mitspielen.

Entweder Du nimmst ein anderes persistentes Speichermedium, z. B. FRAM oder Du überdenkst Deine Speicherstrategie.

Wie Du die Werte speicherst, da gibt es viele Möglichkeiten. Beschreibe doch mal, was es werden soll, da kann man besser helfen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.08.2018, 06:16 (Dieser Beitrag wurde zuletzt bearbeitet: 24.08.2018 07:13 von Christian_Moba-Arduino.)
Beitrag #3
RE: Speichern u. Lesen von Variablen von SDCard
(23.08.2018 23:37)Tommy56 schrieb:  Entweder Du nimmst ein anderes persistentes Speichermedium, z. B. FRAM oder Du überdenkst Deine Speicherstrategie.

Wie Du die Werte speicherst, da gibt es viele Möglichkeiten. Beschreibe doch mal, was es werden soll, da kann man besser helfen.

Gruß Tommy

Hallo Tommy,
danke für dein Hinweis, mit der eingeschränkten Lebensdauer einer Speicherzelle auf der SD Karte. Ich entscheide mich für FRAM.
Der Anschluss sollte die SPI-Schnittstelle sein. Ich werde mal im Internet nach einem Speicherbaustein schauen und auch kaufen.
Habt ihr einen Favoriten als Speicher, den ich am MEGA 2560 verwenden kann?
Muss ich noch irgendetwas beachten (klar die Speichergröße) und gibt es Probleme bei speziellen FRAM-Speicher von den ich die Finger weglassen soll ?
Habe mal im Internet geschaut die Speicher werden nur noch wenige verkauft. Sind die am "Aussterben".
Sollte ich mein Arduino Projekt besser so anlegen, dass ich eine Funktion "Arduino Runterfahren" programmiere und dann dort die Werte auf SD Card abspeicher ?
Das hätte den Vorteil das nur beim Abschalten des Arduinos Werte gespeichert werden. Schreibzyklen verringern sich.

Das mit dem "delay" hatte ich eingebracht um mir Pausen zu schaffen, damit ich sehe wann es im Programm weitergeht (s.g. Haltepunkte). Klar, die habe ich jetzt mit // Kommentar deaktiviert. Später ist das ja auch für die Kommunikation über serielle Schnittstelle zwischen PC Software und Arduiono kontra produktiv.
Das Delay, war auch noch drin damit ich im OLED Display die Texte lesen und erfassen konnte.
Nun , ohne Delay kann ich es auch noch lesen und erfassen. Also raus mit dem Delay.

Danke
Viele Grüße
Christian
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.08.2018, 07:25
Beitrag #4
RE: Speichern u. Lesen von Variablen von SDCard
Da wäre jetzt die Frage, wie oft sich der Speicherinhalt der Variablen ändert. Dann könnte man den Speichervorgang nur bei Änderung starten.
Wenn es nur Einstellungen sind, die du speichern möchtest, dann könnte auch ein EEProm dafür ausreichen. Aber das sind Dinge, die du nur entscheiden kannst.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.08.2018, 09:07 (Dieser Beitrag wurde zuletzt bearbeitet: 24.08.2018 10:12 von Christian_Moba-Arduino.)
Beitrag #5
RE: Speichern u. Lesen von Variablen von SDCard
Hallo Dieter,
ich habe mal was programmiert.
Folgendes möchte ich damit erreichen:
Mit einem Tasterdruck (auf Pin 24) Taster, heißt (ArduinoRunterfahrenPinState),
soll die Speicherroutine zum Speichern der Variable (startblatt) ablaufen. Das funktioniert auch so weit ganz gut. Aber diese Routine läuft mehrmals hintereinander in der Schleife. Wie bekomme ich es hin, dass er nur 1X Mal die Routine durchläuft und erst wieder bei erneuter Aktivierung des Taster (ArduinoRunterfahrenPinState) durch eine Hight-Flanke die Speicherroutine ausführt ?

Code:
void loop()
{
// read the state of the pushbutton value:
  ArduinoRunterfahrenPinState = digitalRead(ArduinoRunterfahrenPin);
  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (ArduinoRunterfahrenPinState == HIGH)
     {      
      Serial.print("Initializing SD card...");
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect))
  //{
    //Serial.println("Card failed, or not present");
    // don't do anything more:
    //while (1);
    //}
    //else
    Serial.println("card initialized.");
    {
    startblatt = zielblatt;    // Muss gemacht werden, ansonsten speichert er den alten startblatt, und nicht das aktuelle zielbaltt.
     String dataString = "";
    // read three sensors and append to the string:
     dataString += String(startblatt);
  
    // open the file. note that only one file can be open at a time,
    // so you have to close this one before opening another.
    File dataFile = SD.open("datalog.txt", FILE_WRITE);

    // if the file is available, write to it:
    if (dataFile)
    {
      dataFile.println(dataString);
      dataFile.close();
      // print to the serial port too:
      Serial.println(dataString);
     }
…..
}

Vielen Dank
Christian
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.08.2018, 10:28
Beitrag #6
RE: Speichern u. Lesen von Variablen von SDCard
(24.08.2018 09:07)Christian_Moba-Arduino schrieb:  .....
Folgendes möchte ich damit erreichen:
Mit einem Tasterdruck (auf Pin 24) Taster, heißt (ArduinoRunterfahrenPinState),
soll die Speicherroutine zum Speichern der Variable (startblatt) ablaufen. Das funktioniert auch so weit ganz gut. Aber diese Routine läuft mehrmals hintereinander in der Schleife. Wie bekomme ich es hin, dass er nur 1X Mal die Routine durchläuft und erst wieder bei erneuter Aktivierung des Taster (ArduinoRunterfahrenPinState) durch eine Hight-Flanke die Speicherroutine ausführt ?

Vermutlich weil der Taster prellt und du länger drückst, als die Routine braucht.
Soll heißen, Taster immer entprellen und du musst zu Anfang eine Statusvariable abfragen, die am Ende zurück gesetzt (LOW) wird. Nur wenn diese HIGH ist, durchläuft er die Routine. Dann macht er das nur einmal. Natürlich musst du diese bei Bedarf auf HIGH setzen, damit er das Speichern startet.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.08.2018, 12:43 (Dieser Beitrag wurde zuletzt bearbeitet: 24.08.2018 13:54 von Christian_Moba-Arduino.)
Beitrag #7
RE: Speichern u. Lesen von Variablen von SDCard
Hallo Dieter,
Hura, nach der Mittagspause habe ich es hinbekommen.
Der Arduino läuft in der Loop und arbeitet mit den Variablen Werten und Motor dreht zu den einzelnen Zielblättern.
Wenn ich nun die Taste drücke, speichert er das aktuelle Zielblatt in eine Datei auf der SD Karte.
Und gibt den Hinweis, dass ich den Arduino vom Stromnetz nehmen kann.

Den 1. Teil der Aufgabe ist damit gelöst. Danke
Code:
void loop()
{
// read the state of the pushbutton value:
  ArduinoRunterfahrenPinButtonStatus  = digitalRead(ArduinoRunterfahrenPin);
  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (ArduinoRunterfahrenPinButtonStatus != ArduinoRunterfahrenPinLetzterButtonStatus)
     {  
        if (ArduinoRunterfahrenPinButtonStatus == HIGH)
           {      
             Serial.print("Initializing SD card...");
                   //see if the card is present and can be initialized:
                   if (!SD.begin(chipSelect))
                      {Serial.println("Card failed, or not present");
                                                       // don't do anything more:
                      while (1);
                      }
                     else
             Serial.println("card initialized.");
             startblatt = zielblatt;
             String dataString = "";
            // read three sensors and append to the string:
             dataString += String(startblatt);
  
            // open the file. note that only one file can be open at a time,
            // so you have to close this one before opening another.
             File dataFile = SD.open("datalog.txt", FILE_WRITE);

           // if the file is available, write to it:
                if (dataFile)
                {
                 dataFile.println(dataString);
                 dataFile.close();
                // print to the serial port too:
                 Serial.println(dataString);
                 Serial.println("Zeilblatt für das nächste Mal in datalog.txt gesichert ");
                 Serial.println("Arduion kann nun augeschaltet werden.");
                 }
                ArduinoRunterfahrenPinLetzterButtonStatus = ArduinoRunterfahrenPinButtonStatus;        
             }    
         }          
….
Variabeln Verarbeitung und Motorsteuerung für den Fallblattanzeiger
Loop Ende

Nun zur 2. Aufgabe, bei der ich wieder Eure Hilfe benötige.
Statt immer dem Arduino bei Programmneustart das Startblatt mitteilen zu müssen, soll der Arduino die Zahl von seiner SD Karte holen.
Zu beachten ist dabei:
Ich lasse beim Speichern (siehe oben) der Variable (startblatt) aus der aktuellen Variable (zielblatt) , das (startbatt) untereinander scheiben. Also ein Daten loggen mit Tastendruck. Das soll auch so bleiben.
Hinweis von Tommy, das soll die Karte schonen um nicht immer in da Selbe Speicherfeld zu schreiben.

Diese Zahlen sind immer einstellig oder auch zweistellig jedoch nie dreistellig.
Wie mache ich das jetzt.

Meine Vorstellung, wenn der Arduiono wieder eingeschaltet wird, bekomme ich im Seriellen Monitor die Meldung "alten Zielwert und damit neuen Startblatt von Datei und SDKarte auslesen". Dann macht er das ohne auf meine Quittung zu warten
Nur noch Anzeige am seriellen Monitor, für mich zur Kontrolle welche Zahl er aus der SD Karte ausgelesen hat.

Wenn geschehen, soll die Aufforderung am seriellen Monitor "Bitte Zielblatt eingeben" kommen und auf meine manuelle Zielblatt Eingabe warten.


Danach läuft das Programm wieder in der Loop seine gewohnten Runden ...


So sieht die TXT Datei aus:
26
9
24

Viele Grüße Christian


Hallo,
mit dem Codeschnipsel bekomme ich zumindest schonmal an die Datei ran. Aber wie komme ich an den letzten Wert in der letzten Zeile ?
Sodass ich dann diesen als Wert in meine Variable (startblatt) vom Typ "int" bekomme.
Bitte um Hilfe? In der SdFat konnte ich nichts entsprechendes finden.
Danke
Viele Grüße
Christian

Code:
#include <SPI.h>
#include <SD.h>

File myFile;

void setup() {
  // Open serial communications 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("Initializing SD card...");

  if (!SD.begin(53)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("datalog.txt", FILE_WRITE);

// re-open the file for reading:
  myFile = SD.open("datalog.txt");
  if (myFile) {
    Serial.println("datalog.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  }}

So sieht die Anzeige im seriellen Monitor aus:
Initializing SD card...initialization done.
datalog.txt:
26
9
24
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.08.2018, 17:35
Beitrag #8
RE: Speichern u. Lesen von Variablen von SDCard
Ich habe bisher immer mit FRAM an I2C gearbeitet. Da gibt es auch einen Thread hier im Forum dazu.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop() pzYsTorM 14 801 19.03.2019 20:33
Letzter Beitrag: Hilgi
  char in Variablen aufteilen fv1895 7 528 06.01.2019 11:59
Letzter Beitrag: Tommy56
  Variablen zu einem CHAR verbinden und einbinden Frank_aus_WOB 3 605 02.01.2019 09:07
Letzter Beitrag: Tommy56
  Verkettung von Variablen flint74 5 608 30.12.2018 14:33
Letzter Beitrag: Tommy56
  Variablen über Eingabe im Setup beschreiben heini320 3 541 30.12.2018 11:37
Letzter Beitrag: Tommy56
  Zentrale Variablen für verschiedene Klassen Smirgel 3 506 29.10.2018 21:24
Letzter Beitrag: Tommy56
  Speichern von Messwerten *Anfänger* wutschler 5 1.663 24.09.2018 20:56
Letzter Beitrag: MicroBahner
  Textdatei von SDKarte mit Arduiono lesen und als Variable abspeichern Christian_Moba-Arduino 2 634 25.08.2018 17:19
Letzter Beitrag: Tommy56
  Textdatei von SDKarte mit Arduiono lesen und als Variable abspeichern Christian_Moba-Arduino 0 492 25.08.2018 11:18
Letzter Beitrag: Christian_Moba-Arduino
  Bilder bzw. Informationen von RGB LEDs speichern AC_DC_new 7 1.265 07.06.2018 15:01
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste