Hallo in die Runde,
baue gerade ein altes Projekt um wo mehrere Daten werden gespeichert auf SD.
Alt --> Mega, LCD2004, SD und so weiter.
Neu ESP32, SPI TFT...
Gespeichert wurde ganzer Satz daten jede 20 Minuten, was auch funktionierte 1A.
Jetzt habe ich das Problem das die daten werden nicht einmal nur 45 mall geschrieben.
Mit dellay (1000) funktioniert, aber ist nicht Sinn der Sache, irgend wie drehe mich im Kreis.
void SDKarte()
{
DateTime now = rtc.now();
bmp280.getMeasurements(temperature, pressure, altitude);
//float ret = AHT.getSensor(&humi, &temp);
// if ((now.minute() == 20 && now.second() == 59 ) || (now.minute() == 40
// && now.second() == 59) || (now.minute() == 59 && now.second() == 59))
if ( now.second() == 59)
{
myFile = SD.open("esp32.txt", File_Write); // if the file opened okay, write to it:
if (myFile) {
Serial.println("Schreibe in esp32.txt...");
char buf2[40];
sprintf(buf2, "%.2d.%.2d.%d %.2d:%.2d:%.2d ",
now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second());
String dataString = (buf2);
myFile.print(dataString);
myFile.print(" BMP Temp. ");
myFile.println(temperature - 0.8, 1);
Serial.println("Uhrzeit geschrieben ");
// Serial.println(i);
/* myFile.print(" °C AHT Temp. ");
myFile.print(temp - 1.1, 1);
myFile.print(" °C DS18B20 Temp. ");
ds.selectNext();
myFile.print(ds.getTempC() - 0.7, 1);
myFile.println(" °C");
*/
//delay(1000);
myFile.close(); // close the file:
} else Serial.println("Kann esp32.txt nicht Öffnen ");
}
}
Das if ( now.second() == 59) wurde eingebaut um nicht 20 min warten
Mal sehen ob ich das richtig "aussortiert" habe...:
Du schreibst so lange immer wieder auf die Karte wie ( now.second() == 59) wahr ist. Der Esp ist schnell genug, dass er den ganzen Sketch in einer Minute 45 mal abarbeitet.
Spiel den Sketch auf einen noch schnelleren MC und er schreibt noch häufiger.
Ich setze das schreiben auf SD oder Display immer in eine eigene Funtion, das finde ich übersichtlicher. Das Anspringen der Funktion erfolgt über eine Millis Abfrage.
so wie Auskommenteit ein mall alle 20min, also 3mall in der Stunde nur ein Satz mit mehreren Daten , werde Nachmittag dein Vorschlag testen.
Muss zugeben das mir die Möglichkeit mit Status habe vergessen, na ja was solls
Muss jetzt dringend weg.
@my_xy_projekt
Sicher ? Halbierst Du damit die Anzahl der Schreibvorgänge nicht nur ?
Ablauf:
Sprung in die Funktion
isWrite ist false, also schreiben und iswrite auf true setzen
Funktion verlassen
Sprung in die Funktion
isWrite ist true, nicht schreiben und iswrite auf false setzen
Funktion verlassen
dann beginnt das wieder von vorne
Oder habe ich was übersehen ? (Muss jetzt aber auch erst mal los...)
... ist Mist, wenn du erreichen willst, dass etwas nur 1 Mal passiert.
Warum machst du es nicht wie das bewährte BlinkWithoutDelay und merkst dir, wann du das letzte Mal geschrieben hast? Frühestens x Sekunden später UND zur Synchronisierzeit gehts wieder los...
Die 59 ist ja nur damit ich nicht 20 min warten muss, nicht nur vorletzten Beitrag lesen
und ja so schlau war ich auch habe die zeit auf 100milisek. gesetzt hat nur statt 45, 10 mall geschrieben. Die loop dauert zu zeit ~8 milli, wen Modbus komme vielleicht auf 20 wegen Serial.
Die Lib für TFT ist sau schnell 10 mall schneller als die vom Oli Kraus, bei der dauert die loop 220 milli , bei Mega dauert es fast 0,7 sek ein durchlauf mit LCD als anzeige.
Dadurch wurde immer nur ein mall auf die SD geschrieben
if (now.minute() == 0 ||
now.minute() == 20 ||
now.minute() == 40)
{
if (!isWrite)
{
isWrite = true;
myFile = SD.open("esp32.txt", File_Write); // if the file opened okay, write to it:
if (myFile)
{
Serial.println("Schreibe in esp32.txt...");
char buf2[40];
in
if (now.minute() == 0 ||
now.minute() == 20 ||
now.minute() == 40)
{
myFile = SD.open("esp32.txt", File_Write); // if the file opened okay, write to it:
if (!isWrite)
{
isWrite = true;
if (myFile)
{
Serial.println("Schreibe in esp32.txt...");
char buf2[40];
type or paste code here
Die Datei muss offen sein vor der status Abfrage, sonst kann die nicht geöffnet werden.
Nur für die Änderung braucht nicht ganzen Tag
Hatte erst mall das Problem die SD zum laufen bringen, hat sich nicht vertragen mit Display auf dem gleichem SPI Port(VSPI), bin ausgeweicht auf zweiten SPI (HSPI).
Komischer weise mit der TFT Lib vom Oli hat es funktioniert auf dem gleichem Port, ist egal es 'Läuft'.
Danke!!!
PS. Bevor jemand fragt, die CS Pins wahren und sind andere
und nicht jede Minute.
Also wenn funktioniert ohne das der ESP32 rummotzt ist doch OK oder?
Und wen du das myFile.close() in #11 nicht siechst kann ich nix da für
Alle 20 Minuten versuchst du unendlich oft die Datei zu öffnen, bis die jeweilige Minute (in #16) rum ist.
Das gelingt dir zwar nicht, ist aber unschön, finde ich.