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
Bester Weg um Sensordaten zu speichern und auszuwerten
05.01.2021, 12:01
Beitrag #25
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
Hi zusammen,

ich hab mir jetzt mal einen Sketch zum Testen mit binären Daten zusammengebastelt. Schreiben und Lesen funktioniert grundsätzlich, aber ich bekomme nur Kauderwelsch als Ausgabe.
Klar: Wahrscheinlich muss ich nach dem Einlesen bei Serial.Println(val, format) noch einen korrekten Wert für "format" einsetzen, nur ist die Frage, welchen...?

Hier mal mein Sketch:

Code:
#include <SdFat.h>
#include <SPI.h>
#include <Wire.h>
using namespace sdfat;
const byte CS_pin = 15;

const char* FILE_NAME= "messungen.bin";
SdFat SD;
File messungenFile;

struct data {
    int jahr;
    int monat;
    int tag;
    int stunde;
    int minute;
    int sekunde;
    int liter;
};


void deleteFile(const char* filename) {
  if(SD.exists(filename)) {
    if(!SD.remove (filename)) {
      Serial.println(F("Datei konnte nicht gelöscht werden"));
      for(;;); // Warten auf Aktion
    }
  }
}

void setup() {
  Serial.begin(9600);

  Serial.println(F("Initialisierung der SD-Karte"));
  if (!SD.begin(CS_pin)){
    Serial.println(F("SD-Karte konnte nicht initialisiert werden..."));
    Serial.println(F("SD-Karte prüfen/korrekt einsetzen und RESET drücken"));
    for(;;); // Warten auf Aktion
  }

  Serial.println(F("Datei öffnen"));
  deleteFile(FILE_NAME);
  messungenFile = SD.open(FILE_NAME, O_WRITE | O_CREAT);
  if(!messungenFile){
    Serial.println(F("Datei konnte nicht geöffnet werden"));
    Serial.println(F("SD-Karte prüfen und Reset drücken"));
    for(;;); // Warten auf Aktion
  }

}

void loop() {
  messung_speichern();
  delay(2000);
  messung_lesen();
}

void messung_speichern(){
  struct data Messung;
  Messung.jahr = 2021;
  Messung.monat = random(1,12);
  Messung.tag = random(1,31);
  Messung.stunde = random(0,23);
  Messung.minute = random(0,59);
  Messung.sekunde = random(0,59);
  Messung.liter = random(200);
  messungenFile.write((uint8_t *)&Messung, sizeof(Messung));
  Serial.println("--------------------------------------------------------");
  Serial.println("Geschrieben:");
  Serial.println(Messung.jahr);
  Serial.println(Messung.monat);
  Serial.println(Messung.tag);
  Serial.println(Messung.stunde);
  Serial.println(Messung.minute);
  Serial.println(Messung.sekunde);
  Serial.println(Messung.liter);
  messungenFile.close();
}

void messung_lesen(){
  struct data Messung;
  messungenFile.read((uint8_t *)&Messung, sizeof(Messung));
  Serial.println("--------------------------------------------------------");
  Serial.println("Gelesen:");
  Serial.println(Messung.jahr);
  Serial.println(Messung.monat);
  Serial.println(Messung.tag);
  Serial.println(Messung.stunde);
  Serial.println(Messung.minute);
  Serial.println(Messung.sekunde);
  Serial.println(Messung.liter);
  messungenFile.close();
}

Die Frage ist nun, wie bekomme ich wieder eine lesbare Ausgabe.
Im Moment bekomme ich z.B. das hier:

Code:
--------------------------------------------------------
Geschrieben:
2021
11
29
4
48
10
145
--------------------------------------------------------
Gelesen:
1073732304
1073670312
2000
1075856132
1075857821
2000
1073670048

Was mich hier spontan schon mal wundert:
Warum wurde die Zeile 10 zu "2000" und die 29 auch zur "2000".
Selbst wenn es sich bei 2000 um die binäre "Verschlüsselung" handelt, müsste doch bei zwei unterschiedlichen Ursprungswerten auch eine unterschiedlich Verschlüsselung rauskommen, oder?

Ich bin wieder mal auf eure Hilfe angewiesen ;-)

LG Daniel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.01.2021, 12:26 (Dieser Beitrag wurde zuletzt bearbeitet: 05.01.2021 12:28 von Tommy56.)
Beitrag #26
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
Du solltest im Lesen vorher das File zum Lesen öffnen.
Ob das Löschen nach Neustart sinnvoll ist? Wenn mal kurz der Strom weg ist, sind alle Messwerte weg - ist das gewollt?

Der Ablauf ist unlogisch, da Du im Setup das File öffnest, es aber beim Schreiben schließt.

Schreiben: Öffnen zum Anhängen -> Schreiben -> Schließen
Lesen: Öffnen zum Lesen -> Lesen -> Schließen

Serial.println hat kein Format, höchstens eine Darstellungsform (DEC,HEX,BIN) - Grundlagen anschauen.

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
05.01.2021, 12:42
Beitrag #27
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
Jetzt hab ichs:

Code:
#include <SdFat.h>
#include <SPI.h>
#include <Wire.h>
using namespace sdfat;
const byte CS_pin = 15;

/* Nom du fichier csv */
const char* FILE_NAME= "messungen.bin";
SdFat SD;
File messungenFile;


struct data {
    uint16_t jahr;
    uint16_t monat;
    uint16_t tag;
    uint16_t stunde;
    uint16_t minute;
    uint16_t sekunde;
    uint16_t liter;
};

/**  Delete file if exists */
void deleteFile(const char* filename) {
  if(SD.exists(filename)) {
    if(!SD.remove (filename)) {
      Serial.println(F("Datei konnte nicht gelöscht werden"));
      for(;;); // Warten auf Aktion
    }
  }
}

void setup() {
  Serial.begin(9600);
  
  Serial.println(F("Initialisierung der SD-Karte"));
  if (!SD.begin(CS_pin)){
    Serial.println(F("SD-Karte konnte nicht initialisiert werden..."));
    Serial.println(F("SD-Karte prüfen/korrekt einsetzen und RESET drücken"));
    for(;;); // Warten auf Aktion
  }

  Serial.println(F("Datei öffnen"));
  deleteFile(FILE_NAME);
  messungenFile = SD.open(FILE_NAME, O_WRITE | O_CREAT);
  if(!messungenFile){
    Serial.println(F("Datei konnte nicht geöffnet werden"));
    Serial.println(F("SD-Karte prüfen und Reset drücken"));
    for(;;); // Warten auf Aktion
  }

}

void loop() {
  messung_speichern();
  delay(2000);
  messung_lesen();
}

void messung_speichern(){
  struct data Messung;
  Messung.jahr = 2021;
  Messung.monat = random(1,12);
  Messung.tag = random(1,31);
  Messung.stunde = random(0,23);
  Messung.minute = random(0,59);
  Messung.sekunde = random(0,59);
  Messung.liter = random(200);
  Serial.println("--------------------------------------------------------");
  Serial.println("Erzeugt:");
  Serial.println(Messung.jahr);
  Serial.println(Messung.monat);
  Serial.println(Messung.tag);
  Serial.println(Messung.stunde);
  Serial.println(Messung.minute);
  Serial.println(Messung.sekunde);
  Serial.println(Messung.liter);
  
  messungenFile = SD.open(FILE_NAME, FILE_WRITE);
  messungenFile.write((uint8_t *)&Messung, sizeof(Messung));
  Serial.println("--------------------------------------------------------");
  Serial.println("Geschrieben:");
  Serial.println(Messung.jahr, BIN);
  Serial.println(Messung.monat, BIN);
  Serial.println(Messung.tag, BIN);
  Serial.println(Messung.stunde, BIN);
  Serial.println(Messung.minute, BIN);
  Serial.println(Messung.sekunde, BIN);
  Serial.println(Messung.liter, BIN);
  messungenFile.close();
}

void messung_lesen(){
  struct data Messung;
  messungenFile = SD.open(FILE_NAME, FILE_READ);
  messungenFile.read((uint8_t *)&Messung, sizeof(Messung));
  Serial.println("--------------------------------------------------------");
  Serial.println("Gelesen:");
  Serial.println(Messung.jahr);
  Serial.println(Messung.monat);
  Serial.println(Messung.tag);
  Serial.println(Messung.stunde);
  Serial.println(Messung.minute);
  Serial.println(Messung.sekunde);
  Serial.println(Messung.liter);
  messungenFile.close();
}

Das Löschen der Datei kommt natürlich wieder raus.
Das hab ich nur zum Testen eingebaut, damit ich immer nur einen Satz speichere und nicht gleich den Überblick verliere.

Danke abermals für deine Hilfe.
Ich meld mich bestimmt nochmal heute oder die Tage ;-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.01.2021, 12:48
Beitrag #28
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
(05.01.2021 12:42)basementmedia schrieb:  Jetzt hab ichs:
Nö, noch nicht ganz.
Wenn Du auf das Öffnen im setup nicht verzichten willst, muss ans Ende vom setup ein messungenFile.close();

Du testest im setup mit O_WRITE | O_CREAT. Warum nutzt Du das nicht auch beim Schreiben?

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
05.01.2021, 12:53
Beitrag #29
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
(05.01.2021 12:48)Tommy56 schrieb:  
(05.01.2021 12:42)basementmedia schrieb:  Jetzt hab ichs:
Nö, noch nicht ganz.
Wenn Du auf das Öffnen im setup nicht verzichten willst, muss ans Ende vom setup ein messungenFile.close();

Du testest im setup mit O_WRITE | O_CREAT. Warum nutzt Du das nicht auch beim Schreiben?

Gruß Tommy

Du hast wie immer Recht. Im Test funktioniert hats zwar trotzdem aber war auf jeden Fall nicht sauber. Jetzt passts ;-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.01.2021, 20:30
Beitrag #30
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
Sorry Tommy/Leute,

ich blicks einfach nicht.
Bitte helft mir bevor ich jetzt dann gegen die Wand renne ;-(

Das hier ist mein Code:

Code:
#include <SdFat.h>
#include <SPI.h>
#include <Wire.h>
using namespace sdfat;
const byte CS_pin = 15;

const char* FILE_NAME= "messungen.bin";
SdFat SD;
File messungenFile;


struct data {
    uint8_t jahr;
    uint8_t monat;
    uint8_t tag;
    uint8_t stunde;
    uint8_t minute;
    uint8_t sekunde;
    uint8_t liter;
};

void setup() {
  Serial.begin(9600);
  
  Serial.println(F("Initialisierung der SD-Karte"));
  if (!SD.begin(CS_pin)){
    Serial.println(F("SD-Karte konnte nicht initialisiert werden..."));
    Serial.println(F("SD-Karte prüfen/korrekt einsetzen und RESET drücken"));
    for(;;); // Warten auf Aktion
  }
}

void loop() {
  messung_speichern();
  messung_lesen();
  delay(2);
}

void messung_speichern(){
  struct data Messung;
  Messung.jahr = 2021;
  Messung.monat = random(1,12);
  Messung.tag = random(1,31);
  Messung.stunde = random(0,23);
  Messung.minute = random(0,59);
  Messung.sekunde = random(0,59);
  Messung.liter = random(200);
  messungenFile = SD.open(FILE_NAME, O_WRITE | O_CREAT);
  messungenFile.write((uint8_t *)&Messung, sizeof(Messung));
  messungenFile.close();
}

void messung_lesen(){
  struct data Messung;
  messungenFile = SD.open(FILE_NAME, FILE_READ);
  while (messungenFile.available()) {
    messungenFile.read((uint8_t *)&Messung, sizeof(Messung));
    Serial.println("--------------------------------------------------------");
    Serial.println("Gelesen:");
    Serial.println(Messung.jahr);
    Serial.println(Messung.monat);
    Serial.println(Messung.tag);
    Serial.println(Messung.stunde);
    Serial.println(Messung.minute);
    Serial.println(Messung.sekunde);
    Serial.println(Messung.liter);
  }
  messungenFile.close();
}

Was er machen soll:
Bei jedem Durchlauf der Funktion "messung_speichern();" eine neue Zeile in der Datei messungen.bin erzeugen und beim Durchlauf der Funktion "messung_lesen()" dann ALLE bisher gespeicherten Messungen ausgeben.

Im Moment wird mir aber immer nur eine Zeile ausgegeben.
Entweder er überschreibt die vorherige Messung immer wieder oder er liest nur die letzte Zeile aus...

@Tommy: Du hattest ja geschrieben, dass ich für das Schreiben immer folgendermaßen vorgehen muss:
1. Öffnen zum Anhängen
2. Schreiben
3. Schließen

Aber mach ich das denn hier nicht:

Code:
messungenFile = SD.open(FILE_NAME, O_WRITE | O_CREAT);
messungenFile.write((uint8_t *)&Messung, sizeof(Messung));
messungenFile.close();

Ich bin vielleicht einfach zu doof oder zu blind...Hilfe!!

LG und sorry wegen dem ständigen Generve.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.01.2021, 20:37
Beitrag #31
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
Sorry, da habe ich auch nicht richtig aufgepasst.
Das muss heißen
Code:
O_WRITE | O_CREAT | O_APPEND
Sonst legt er immer ein neues File an.

Quelle

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
05.01.2021, 21:10
Beitrag #32
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
(05.01.2021 20:37)Tommy56 schrieb:  Sorry, da habe ich auch nicht richtig aufgepasst.
Das muss heißen
Code:
O_WRITE | O_CREAT | O_APPEND
Sonst legt er immer ein neues File an.

Quelle

Gruß Tommy

OK, jetzt gehts.

(05.01.2021 20:37)Tommy56 schrieb:  Sorry, da habe ich auch nicht richtig aufgepasst.

Und entschuldigen musst du dich schon mal gar nicht.
1000 Dank wieder mal... ich wurstel dann mal weiter.

Mein nächster Step wird sein, die ausgelesenen Daten in ein JSON-Objekt zu konvertieren und dann als Rückgabe an die ajax-funktion schicken, die dann eine Tabelle daraus bastelt...ist das schlau oder doof?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings ultralex 14 1.264 15.12.2020 14:00
Letzter Beitrag: Tommy56
  Struct im Spiffs speichern Sh0rn 10 2.802 13.05.2020 06:42
Letzter Beitrag: Fips
  Sensordaten werden nicht richtig berechnet laserdoktor 3 1.328 05.03.2020 23:03
Letzter Beitrag: laserdoktor
  Daten vom Sensor in einer Text-Datei auf meinem Web-Host speichern. Manny 45 11.891 27.04.2019 07:24
Letzter Beitrag: Fips
  SPIFFS Messwerte speichern uk1408 8 6.389 16.03.2019 13:14
Letzter Beitrag: uk1408

Gehe zu:


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