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, 21:24 (Dieser Beitrag wurde zuletzt bearbeitet: 05.01.2021 21:24 von Fips.)
Beitrag #33
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
(05.01.2021 21:10)basementmedia schrieb:  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?

Die Fetch Api ist viel besser für Json, als das olle XMLHttpRequest.

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.01.2021, 21:59
Beitrag #34
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
Da hat Fips mich auch davon überzeugt Wink Und nimm für die JSON-Erstellung keine Lib, das kann man problemlos händisch machen.

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, 22:21 (Dieser Beitrag wurde zuletzt bearbeitet: 05.01.2021 22:22 von basementmedia.)
Beitrag #35
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
(05.01.2021 21:59)Tommy56 schrieb:  Da hat Fips mich auch davon überzeugt Wink

OK, ich werd mir die Fetch API library anschauen

(05.01.2021 21:59)Tommy56 schrieb:  Und nimm für die JSON-Erstellung keine Lib, das kann man problemlos händisch machen.

Gruß Tommy

Zu spät ;-)


Code:
messungenFile = SD.open(FILE_NAME, FILE_READ);

  JSONVar messung_arr;
  int i=0;
  while (messungenFile.available()) {
    messungenFile.read((uint8_t *)&Messung, sizeof(Messung));
    messung_arr[i]["jahr"] = Messung.jahr;
    messung_arr[i]["monat"] = Messung.monat;
    messung_arr[i]["tag"] = Messung.tag;
    messung_arr[i]["stunde"] = Messung.stunde;
    messung_arr[i]["minute"] = Messung.minute;
    messung_arr[i]["sekunde"] = Messung.sekunde;
    messung_arr[i]["liter"] = Messung.liter;
    i++;
  }
  
  messungenFile.close();
  String jsonString = JSON.stringify(messung_arr);
  server.send(200, "application/json", jsonString);


Funktioniert prima.
Gibts ein Argument, trotzdem keine Library zu verwenden?
Was wäre die händische Lösung?

Mein erster Ansatz war der hier (aber da hats mir irgendwelche komischen Zeichen dazugepackt:

Code:
int buflen=messungenFile.size();
char buffer[buflen+2];
strcat( buffer, "[" );

while (messungenFile.available()) {
    messungenFile.read((uint8_t *)&Messung, sizeof(Messung));
    char json_part[22];
    sprintf(json_part, "{\"datum\":\"%d-%02d-%02d %02d:%02d:%02d\",\"liter\":%d},", Messung.jahr, Messung.monat, Messung.tag, Messung.stunde, Messung.minute, Messung.sekunde, Messung.liter);
    strcat( buffer, json_part);
  }
  strcat( buffer, "]" );
  Serial.println(buffer);

Lag ich mit der Variante schon an deiner Lösung Tommy?

Edit: Wobei ich gerade sehe, dass der buffer-char übergelaufen wäre...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.01.2021, 10:19
Beitrag #36
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
(05.01.2021 22:21)basementmedia schrieb:  Gibts ein Argument, trotzdem keine Library zu verwenden?
Was wäre die händische Lösung?

Speicherplatz!

Zum parsen von tief verschachtelten Json aus Objekten von Objekten mit Arrays würde ich zur Lib greifen.

Ein Json, ist zusammengeschraubt auch nur ein ASCII String. Für einen String mit ein paar Klammern braucht man keine Lib.
Da ersetzt eine For Schleife schnell eine umfangreiche Lib.

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.01.2021, 10:55
Beitrag #37
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
[quote='basementmedia' pid='80452' dateline='1609881660']
Lag ich mit der Variante schon an deiner Lösung Tommy?
[quote]
Nein.
Immer 1 Satz ins Struct lesen, verarbeiten, nächsten Satz ins Struct lesen. Für ein Array aus allen Sätzen hast Du wahrscheinlich eim Endeffekt keinen Platz.
Evtl. musst Du auch das erzeugte JSON splitten.

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
06.01.2021, 21:09
Beitrag #38
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
Das mit der Fetch Api und der manuellen JSON-Lösung werd ich auf jeden Fall als nächstes angehen.

Aber ich hab noch ein anderes "Problem":

Bei dem Code hier:

Code:
messungenFile = SD.open(FILE_NAME, FILE_READ);

  if (messungenFile) {
    Serial.println("Datei messungen.bin wurde geöffnet!");
    JSONVar messung_arr;
    int i=0;
    while (messungenFile.available()) {
      messungenFile.read((uint8_t *)&Messung, sizeof(Messung));
      Serial.println("Datei messungen.bin wurde geöffnet!");
      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.wert);
      messung_arr[i]["jahr"] = Messung.jahr;
      messung_arr[i]["monat"] = Messung.monat;
      messung_arr[i]["tag"] = Messung.tag;
      messung_arr[i]["stunde"] = Messung.stunde;
      messung_arr[i]["minute"] = Messung.minute;
      messung_arr[i]["sekunde"] = Messung.sekunde;
      messung_arr[i]["wert"] = Messung.wert;
      i++;
    }
    
    messungenFile.close();
    String jsonString = JSON.stringify(messung_arr);
    server.send(200, "application/json", jsonString);

Bricht er mir nach ca. 35 Zeilen der While-Schleife ab mit einem Fehler:

Code:
--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffbe0 end: 3fffffc0 offset: 01a0
3ffffd80:  3ffe8e7e 00000000 0a000a0d 40213df9  
3ffffd90:  3ffe8dce 00000000 47002d2d 40213df9  
3ffffda0:  3ffe8dcd 0000000e 0000000e 3ffe8d71  
3ffffdb0:  4020fac8 3fff4284 3ffe8e7c 3ffe8d71  
3ffffdc0:  4020fac8 3fff4284 3ffe8d96 4020fad4  
3ffffdd0:  4020fac8 3fff4284 3ffe8d96 4020fdf5  

usw.

D.h. ich komm aus der While-Schleife gar nicht mehr heile raus.
Wahrscheinlich liegts daran, dass der Loop zu lange dauert, oder?

Ich hab schon versucht, nach jedem Durchlauf des while-loops ein yield(); einzubauen...und delay(0); Beides hat nicht zum Erfolg geführt.

Habt ihr ne Idee?
Muss ich da irgendeine Scheduler-Library nutzen?

Im Prinzip will ich eben den gesamten Inhalt der messungen.bin Datei (zur Not auch scheibchenweise, wie Tommy meinte) in einer HTML Tabelle darstellen.

Grüßle
Daniel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.01.2021, 21:27
Beitrag #39
RE: Bester Weg um Sensordaten zu speichern und auszuwerten
Also bei yield() nach i++ sollte er nicht abbrechen.
Du bleibst also bei der Array-Variante?

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
06.01.2021, 21:53
Beitrag #40
Lightbulb RE: Bester Weg um Sensordaten zu speichern und auszuwerten
(06.01.2021 21:27)Tommy56 schrieb:  Also bei yield() nach i++ sollte er nicht abbrechen.
Du bleibst also bei der Array-Variante?

Gruß Tommy

Ein yield() allein reicht nicht, hab ich probiert.
Aber ich hab jetzt rausgefunden, dass der While-Loop problemlos durchläuft, wenn ich das Erzeugen des Arrays weglasse.

D.h. das hier funktioniert:

Code:
void update_auswertung() {
  struct data Messung;
  messungenFile = SD.open(FILE_NAME, FILE_READ);

  if (messungenFile) {
    Serial.println("Datei messungen.bin wurde geöffnet!");
    int i=0;
    while (messungenFile.available()) {
      messungenFile.read((uint8_t *)&Messung, sizeof(Messung));
      Serial.println("Datei messungen.bin wurde geöffnet!");
      Serial.print("--------------------------------------------------------");
      Serial.println(i);
      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.wert);

      /* messung_arr[i]["jahr"] = Messung.jahr;
      messung_arr[i]["monat"] = Messung.monat;
      messung_arr[i]["tag"] = Messung.tag;
      messung_arr[i]["stunde"] = Messung.stunde;
      messung_arr[i]["minute"] = Messung.minute;
      messung_arr[i]["sekunde"] = Messung.sekunde;
      messung_arr[i]["wert"] = Messung.wert; */

      i++;
      yield();
    }

    messungenFile.close();
  
  } else {
    Serial.println("Die Datei mit den Messungen konnte nicht geöffnet werden...");
  }
}


Aber sobald ich den Array in der Schleife aufbaue, bricht er ab...
D.h. du meinst, wenn ich den JSON-String manuell (also ohne die Library) zusammenbau, wirds besser laufen?

Aber am Ende muss ich doch da auch einen Mega-Char-Array aufbauen, der dann per server.send an die Server-Datei geschickt wird, oder?
Zeilenweise verschicken funktioniert ja nicht, weil meine Javascript Ajax-Funktion ja "dicht" macht, sobald sie den Return (= erste Zeile) erhalten hat.

Oder lieg ich da falsch?

Du hattest ja geschrieben:
"Immer 1 Satz ins Struct lesen, verarbeiten, nächsten Satz ins Struct lesen. Für ein Array aus allen Sätzen hast Du wahrscheinlich eim Endeffekt keinen Platz.
Evtl. musst Du auch das erzeugte JSON splitten."

Aber was genau meinst du mir "verarbeiten"?

Du hast nicht zufälligerweise ein Beispiel-Sketch, wie man eine Binäre-Datei zeilenweise ausliest und händisch einen JSON-String erzeugt?

Grüßle
Daniel
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 785 15.12.2020 14:00
Letzter Beitrag: Tommy56
  Struct im Spiffs speichern Sh0rn 10 2.195 13.05.2020 06:42
Letzter Beitrag: Fips
  Sensordaten werden nicht richtig berechnet laserdoktor 3 1.138 05.03.2020 23:03
Letzter Beitrag: laserdoktor
  Daten vom Sensor in einer Text-Datei auf meinem Web-Host speichern. Manny 45 10.550 27.04.2019 07:24
Letzter Beitrag: Fips
  SPIFFS Messwerte speichern uk1408 8 5.627 16.03.2019 13:14
Letzter Beitrag: uk1408

Gehe zu:


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