ESP32 Datenloggen ohne WiFi

Hallo zusammen,

ich befinde mich gerade in Ausbildung und arbeite an folgendem Projekt:

Ein ESP32 soll als Rechteckgenerator dienen und auf verschiedene Leitungstreiber Gebersignale simulieren. Wir möchten nämlich die Treiber bei verschiedenen Frequenzen und verschiedenen Leitungslängen testen. Dafür kommen noch TMP100 Temperatursensoren zum Einsatz, die die Erwärmung der Treiber messen sollen. Dafür habe ich das Programm soweit fertig und das funktioniert auch wunderbar. Die Rechtecksignale gebe ich mit der LEDC Funktion aus und die TMP100 Temperatursensoren sind über I²C angeschlossen. Das Auslesen klappt auch ohne Probleme.

Nun zu meiner Frage: Um das Ganze selbstständig laufen zu lassen und auch über eine längere Zeit zu testen, würde ich gerne die Daten mit einem Zeitstempel loggen, um das hinterher auszuwerten und mit einem Graphen zu veranschaulichen. Ich habe schon einige Vorschläge im Internet gefunden und ausprobiert, leider aber ohne Erfolg. Eine MySQL Datenbank habe ich schon mit XAMPP erstellt, bekomme die Verbindung mit dem ESP32 aber nicht hin. Das liegt vermutlich an dem Internet hier im Betrieb. Bei einem anderen Projekt konnte ich auch keinen Access Point aufsetzen, da das WLAN für so etwas gesperrt ist.
Mit SPIFFS habe ich ebenfalls versucht, die Temperaturwerte zu speichern, jedoch bekomme ich aber vorallem den Zeitstempel da nicht rein. Die Uhrzeit würde ich dann von einem NTP Server holen. Das klappt auf jeden Fall mit dem WLAN hier.

Entweder bin ich das mit SPIFFS falsch angegangen oder es funktioniert einfach nicht. Hat jemand von Euch noch eine andere Idee wie ich die Daten speichern kann ohne WLAN oder SD-Karte? Vielen Dank schon mal. :slight_smile:

Viele Grüße

SPIFFS ist am ESP32 deprecated.
Bau um auf LittleFS.
mach einen ganz kleinen Testsketch der einen Satz mit einem Zeitstempel speichern soll und zeige den Sketch um zu sehen woran es scheitert.

1 Like

Hallo noiasca,
vielen Dank für deine superschnelle Antwort! :slight_smile:
Dann werde ich mal nach LittleFS recherchieren und das ganze ausprobieren.

Besser :wink: sind die Preferences geeignet Einstellungen zu speichern. Aber auch dafür benötigst du LittleFS im ESP32.

Preferences sind gut für Systemeinstellungen.

da stell ich mir aber einen File mit vielen hinzukommenden Daten pro Zeile vor.
Oft wird hinzugefügt.
Einmal wird abgefragt.
Eventuell wird mal gelöscht.

1 Like

Ja stimmt.
Das muss ich übersehen haben, dass es sich "nur" um Daten handelt.

Das es für Einstellungen gedacht war, hatte ich schon beigeschrieben.

1 Like

Hi zusammen,

ich hab gerade eben mal LittleFS ausprobieren wollen, aber leider kommt immer folgender Fehler:

--- Terminal on COM23 | 9600 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at Redirecting...
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
./components/esp_littlefs/src/littlefs/lfs.c:1229:error: Corrupted dir pair at {0x0, 0x1}
E (12) esp_littlefs: mount failed, (-84)
E (18) esp_littlefs: Failed to initialize LittleFS
[ 77][E][LittleFS.cpp:95] begin(): Mounting LittleFS failed! Error: -1
An Error has occurred while mounting LittleFS

Was hat das zu bedeuten? :frowning:

Mein Code:

#include <LittleFS.h>
#include <Arduino.h>

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

  if(!LittleFS.begin()){
    Serial.println("An Error has occurred while mounting LittleFS");
    return;
  }

  File file = LittleFS.open("/test.txt", FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file for writing");
    return;
  }
  if(file.println("Original Line")){
    Serial.println("File was written");
  } else {
    Serial.println("File write failed");
  }
  file.close();
}

void loop(){
  
}

Hallo,
bitte hier nochmal nachlesen, wie LittleFS eingerichtet wird.

1 Like

Hallo,
warum nicht ? in eine Zeile kannst Du doch schreiben was immer du willst.
Datum-Zeit, Messwert1, Messwet2

bei mir sieht das z.B so aus.

01.09.2023 01:58:50; 14,61; 79,68; 1016,04; 4,12
01.09.2023 03:58:48; 14,12; 89,07; 1015,33; 4,13
01.09.2023 05:58:47; 14,11; 95,71; 1015,02; 4,13
01.09.2023 07:58:50; 14,39; 98,49; 1015,27; 4,11
01.09.2023 09:58:50; 14,73; 100,00; 1015,54; 4,11

als Trennzeichen nutzt Du ein Semikolon dann kannst Du das recht einfach in Excell einlesen und grafisch anzeigen. Komma ist schlecht als Trennzeichen das wir für Zahlen benutzt, dann muss man die Einträge in " " setzen.

1 Like

Juhu jetzt funktionierts. Ich danke dir vielmals! :slight_smile:

Nächste Frage: Wie kann ich mehrere Variablen in derselben Zeile speichern? Sodass ich die Temperatur mit der Uhrzeit habe? Weil "file.println(Stunde,Minute,testwert)" funktioniert nicht.

#include <LittleFS.h>
#include <Arduino.h>
#include <time.h>
#include <WiFi.h>

//WLAN und NTP Server für die Uhrzeit
const char* ssid                = "****";
const char* password            = "****";

const char* ntpServer           = "pool.ntp.org";
const long  gmtOffset_sec       = 3600;
const int   daylightOffset_sec  = 3600;

//Testvariable für Temperatur
float testwert = 38.5;

//Variablen für die Uhrzeit
int Stunde;
int Minute;

//Gibt die Uhrzeit aus
void printLocalTime(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }
  Stunde = timeinfo.tm_hour;
  Minute = timeinfo.tm_min;
  Serial.println(&timeinfo, "%d,%b,%y  %H:%M");
}

void setup() {
  Serial.begin(9600);
  
  //Verbinden mit WLAN
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");

  //Uhrzeit vom NTP Server holen
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();

  //WLAN trennen
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
  
  
  if(!LittleFS.begin()){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }
  
  File file = LittleFS.open("/test.txt");
  if(!file){
    Serial.println("Failed to open file for reading");
    return;
  }
  
  Serial.println("File Content:");
  while(file.available()){
    Serial.write(file.read());
  }
  file.close();

  file = LittleFS.open("/test.txt", FILE_APPEND);

  if(!file){
    Serial.println("There was an error opeing the file for append");
    return;
  }
  if(file.println(testwert)){
    Serial.println("File content was appended");
  } else {
    Serial.println("File append failed");
  }
  
  file.close();
}
 
void loop() {
  printLocalTime();
  delay(10000);
}

Um den Zeilenvorschub zu verhindern, musst du "file.print()" verwenden und jeweils einen Wert übergeben. Der letzte Wert der Zeile bekommt wieder "file.println".

1 Like

Hallo,
du könntest sowas machen

String buf, buf1;
  buf += temp;
  buf += "; ";
  buf += hum;
  buf += "; ";
  buf += pres;
  buf += "; ";
  buf += VCC;
  buf.replace(".", ",");

  buf1 = DatumZeit;
  buf1 += "; ";
  buf1 += buf;
  buf1 += ("\r\n");

oder schau Dir mal sprintf() an um die Ausgabe zu formatieren

1 Like

Die Idee hatte ich auch, nur vermeide ich meist Stringverkettung.
Was auch nur funktioniert, wenn alles Strings sind.

Jawoll, das funktioniert, danke dir. :slight_smile:
Dann kann ich das jetzt so in mein Programm integrieren und die Tests nächste Woche laufen lassen.

@Rentner Auch dir vielen Dank für dein Vorschlag, gerne probiere ich das auch mal aus. Hab schließlich auch noch einiges zu lernen.

In diesem Sinne nochmals vielen Dank für eure Hilfe und ein schönes Wochenende!

Alles klar, gerne.

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