Daten auf SD nur einmal schreiben

Wenn die

so wie @my_xy_projekt im #11 macht wird das File nicht geöffnet

Sorry verstehe die Frage nicht.
Wen du meinst die void SDKarte()
die wird in der Haupt loop bei jedem durchlauf göffnet

void loop() {
  startMilli = millis();
  ArduinoOTA.handle();
  WiFiClient client = server.available();
  datum();
  SDKarte();
  web();
  temperatur();
  endMilli = millis();
  //Serial.println(endMilli - startMilli);

}

Es ist nur ein Testsketch, dazu kommt noch IR und Toch abfrage wenn es alles funktioniert wir der Rest geschrieben.
Schon mit der SD habe bemerkt das der ESP beschien anders arbeitet als Arduino und ESP8266

???

Bekommst du mit #11 einmal jede Minute die Meldung
"Kann esp32.txt nicht Öffnen "
?

JA, deshalb habe das höher gesetzt.
Schreibe jetzt auf anderen Rechner, sonst hätte das gezeigt wie der Zustand jetzt ist

Da hab ich ein Problem.
Der Code für das schreiben beginnt mit der Prüfung, ob die aktuelle Minute 0, 20 oder 40 ist.
Wenn das zutrifft wird geprüft ob die isWrite nicht gesetzt ist.
Wenn das zutrifft, wird versucht die Datei zu öffnen und die Variable isWrite wird gesetzt.
isWrite wird erst wieder gelöscht, wenn die Minute nicht 0, 20 oder 40 ist.
Zumindest wenn ich die Codefaltung aktiviere ist das

  else
  { isWrite = false; }

richtig positioniert.
Wenn Du jede Minute die Meldung bekommst, dann würde das bedeuten, das in der selben Minute die Bedingung oben stimmt und einmal nicht....
BIs auf die Bedingung isWrite ist doch nichts weiter an dem Code verändert worden.
Du siehst mich ratlos. :face_with_monocle:

Also hier die Ausgabe : ups Sermon geschossen, wird nachgeholt, auf jeden Fall es tut was tun soll
Jetziger Zustand

void SDKarte()
{
  static bool isWrite = false;
  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() == 58) || (now.minute() == 59 && now.second() == 58))
    
  {
    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];
        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");
        */
        myFile.close();  // close the file:
      }
      else
      {
        Serial.println("Kann  esp32.txt nicht Öffnen ");
      }
    }
  }
  else
  {
    isWrite = false;
  }
}

war zu Faul das Aufräumen, ist ja nur Test wir so wie so alles umgebaut

Hier das erste 'Schreiben'

18:57:44.935 -> ets Jul 29 2019 12:21:46
18:57:44.935 -> 
18:57:44.935 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
18:57:44.988 -> configsip: 0, SPIWP:0xee
18:57:44.988 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
18:57:44.988 -> mode:DIO, clock div:1
18:57:44.988 -> load:0x3fff0030,len:1344
18:57:44.988 -> load:0x40078000,len:13516
18:57:44.988 -> load:0x40080400,len:3604
18:57:44.988 -> entry 0x400805f0
18:57:45.889 -> initialization done.
19:00:01.729 -> Schreibe in esp32.txt...
19:00:01.729 -> Uhrzeit geschrieben  

Hab ja noch alles auf der SD, als Beweis ist kein Problem die Geheimnisse hier zeigen :wink:

10.01.2023 17:40:58  BMP Temp. 19.8
10.01.2023 17:59:58  BMP Temp. 20.0
10.01.2023 18:20:59  BMP Temp. 20.4
10.01.2023 18:40:58  BMP Temp. 20.7
10.01.2023 18:59:58  BMP Temp. 20.9
10.01.2023 19:20:59  BMP Temp. 21.1
10.01.2023 19:40:58  BMP Temp. 21.4
10.01.2023 19:59:58  BMP Temp. 21.5
10.01.2023 20:20:59  BMP Temp. 21.5
10.01.2023 20:40:58  BMP Temp. 21.4
10.01.2023 20:59:58  BMP Temp. 21.5
10.01.2023 21:20:59  BMP Temp. 21.5
10.01.2023 21:40:58  BMP Temp. 21.3
10.01.2023 21:59:58  BMP Temp. 21.4
11.01.2023 17:40:58  BMP Temp. 19.2
11.01.2023 17:59:58  BMP Temp. 19.8
11.01.2023 18:20:59  BMP Temp. 20.0
11.01.2023 18:40:58  BMP Temp. 20.4
11.01.2023 18:59:58  BMP Temp. 20.6

Also schön alle 20 Min geschrieben

Und genau hier hat mir rausgehaut

also habe das so gemacht wie jetzt ist.
die
myFile = SD.open("esp32.txt", File_Write);
wird ja erst geöffnet wen die zeit True ist und danach wider geschlossen und bleibt geschlossen bis wider die zeit abgelaufen ist .

????
Du machst das File immer (wieder) auf, solange die Zeit aktiv ist.

Zwischenfrage: Warum prüfst Du auf Sekunde 58?

Aber Du machst die Datei nur einmal zu, weil das SD.close() nur ausgeführt wird, wenn isWrite false ist.

Das wäre meine Variante, um sicher zu gehen, das ein geöffnetes File immer geschlossen wird.

void SDKarte()
{
  static bool isWrite = false;
  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() == 58) || (now.minute() == 59 && now.second() == 58))
  {
    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];
        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");
        */
      }
      else
      {
        Serial.println("Kann  esp32.txt nicht Öffnen ");
      }
    }
    myFile.close();  // close the file:
  }
  else
  {
    isWrite = false;
  }
}

Kontrolle mit Codefaltung.

Werde später mall testen, aderseits man muss schon Pech haben um genau bei schreiben die SD rausholen. Aber dafür ist ja Win oder Lin da um die SD reparieren .

Ist ja Test :wink:
So wie gelesen wen zwei SPI man nutzt kann schon passieren dar der ESP32 resetet, was aber auch nicht schlimm währe

Zwischen Meldung, der ESP resettet alle 20sek :thinking:
Mus mall schauen ob der Wachhund ist nicht hungrig,

Danke nochmal :wink:
Waren doch die Hunde :wink:
Habe die Task verteilt und schon ruhe in der Bude

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