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.
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.
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.
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?
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(){
}
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.
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".