Event Schreiben

Hallo,

Ich versuch einen event nach einen Text file zu schreiben aber das event kommt nicht in mein Text file.

SD-karte und die Datei sind deklariert.

# define SCK_PIN  13
# define MISO_PIN  12
# define MOSI_PIN  11
# define CS_PIN  4
File datei;

Diesen teil funktioniert gut

  if (!SD.begin(CS_PIN)) {
  Serial.println("Initialisierung fehlgeschlagen!");
  }
  else
  {
  Serial.println("SD Karte initialisiert.");
  }
  Serial.println ("Programm lauft");

Dass Event

void clickEvent() {
  Serial.println("Alarm Reset");
  datei = SD.open("logfile.txt", FILE_WRITE);
  if (datei) {
  Serial.println("Schreibe Daten...");
  datei.println("Alarm Reset");
  // Datei wieder schliessen:
  datei.close();
  digitalWrite(sysalarm, LOW);
}}

Output Serieller Monitor

SD Karte initialisiert.
Programm lauft
Pumpe An
Hochwasser Alarm
Alarm Reset

Aber was ist jetzt nicht richtig, habe viele Beispielen angesehen und die stimmen über ein mit was ich hier oben habe.

Bitte um Hilfe.

Serial.println("Schreibe Daten...");

scheint schonmal nicht dranzukommen.

Wenn "Alarm Reset" nur in clickEvent() vorkommt, kann es ja nur noch hier hängen

  datei = SD.open("logfile.txt", FILE_WRITE);
  if (datei) {
     datei.println("Alarm Reset");
     // Datei wieder schliessen:
     datei.close();
     digitalWrite(sysalarm, LOW);
  } else {
    Serial.println("logfile.txt kann nicht geöffnet werden"); //  scheint hier hinzukommen ?
  }

?

Danke michael_x für dass mit denken

void clickEvent() {
  Serial.println("Alarm Reset");
  datei = SD.open("logfile.txt", FILE_WRITE);
  if (datei) {
  datei.println("Alarm Reset");
  datei.close();
    digitalWrite(sysalarm, LOW);
    } else {
    Serial.println("logfile.txt kann nicht geöffnet werden"); //  scheint hier hinzukommen ?
  }
   // readlogfile();
}

Und bekomme dann:

SD Karte initialisiert.
logfile inhalt lesen nur für test:
Hab diesen text im logfile geschrieben zum testen ob etwas in der logfile drin ist
Programm lauft
Pumpe An
Hochwasser Alarm
Alarm Reset
logfile.txt kann nicht geöffnet werden

Oke es funktioniert habe 2e mal einen "Hochwasser" alarm gemacht und die werden jetzt auch in der logfile.txt geschrieben.

SD Karte initialisiert.
logfile inhalt lesen nur für test:
Programm lauft
Pumpe An
Hochwasser Alarm
Alarm Reset
SD Karte initialisiert.
logfile inhalt lesen nur für test:
Alarm Reset
Programm lauft
Pumpe An
Hochwasser Alarm
Alarm Reset
SD Karte initialisiert.
logfile inhalt lesen nur für test:
Alarm Reset
Alarm Reset
Programm lauft

Aber wen ich direkt "readlogfile" void stehen lasse dann bekomme ich gleig "Kann logfile.txt nicht öffnen" und keine Eintragung in logfile.

Was kann dass jetzt wieder sein.

void clickEvent() {
  Serial.println("Alarm Reset");
  datei = SD.open("logfile.txt", FILE_WRITE);
  if (datei) {
  datei.println("Alarm Reset");
  datei.close();
    digitalWrite(sysalarm, LOW);
    } else {
    Serial.println("logfile.txt kann nicht geöffnet werden"); //  scheint hier hinzukommen ?
  }
    readlogfile();
}
void readlogfile ()//lesen von logfile
{
datei = SD.open("logfile.txt");
  if (datei) {
    Serial.println("logfile inhalt lesen nur für test:");
    while (datei.available()) {
    Serial.write(datei.read());
    }
    datei.close();
  } else {
    Serial.println("Kann logfile.txt nicht öffnen");
  }}

Ich würde ja gerne weiter mitdenken, aber das verstehe ich nicht:

Aber wen ich direkt "readlogfile" void stehen lasse

Hinweis: voidist sowas wie ein Datentyp, und heisst "nichts".

michael_x:
Ich würde ja gerne weiter mitdenken, aber das verstehe ich nicht:
Hinweis: void ist sowas wie ein Datentyp, und heisst "nichts".

Bitte um Entschuldigung für die undeutlichheit.

Ganz unten in der Void ClickEvent steht

void clickEvent() {
  Serial.println("Alarm Reset");
  datei = SD.open("logfile.txt", FILE_WRITE);
  if (datei) {
  datei.println("Alarm Reset");
  datei.close();
    digitalWrite(sysalarm, LOW);
    } else {
    Serial.println("logfile.txt kann nicht geöffnet werden"); //  scheint hier hinzukommen ?
  }
    readlogfile();
}

readlogfile ();

Hiermit starte ich die Void readlogfile ()

void readlogfile ()//lesen von logfile
{
datei = SD.open("logfile.txt");
  if (datei) {
    Serial.println("logfile inhalt lesen nur für test:");
    while (datei.available()) {
    Serial.write(datei.read());
    }
    datei.close();
  } else {
    Serial.println("Kann logfile.txt nicht öffnen");
  }}

Wenn ich diese zeile stehen lasse dann bekomme ich "Kann logfile.txt nicht öffnen" und keine Eintragung in logfile.

Wenn ich diesen umstelle in

//readlogfile ();

Dann lauft alles wie einen eins

Für mich sieht das so aus, als ob datei.close() nicht ausreicht, die Datei wirklich zu schließen.

Danke DrDiettrich,

In die Richtung hatte ich noch nicht gedacht, ich kenne nur diesen Befehl .close () um die Datei zu schließen.

Gibt es dann noch eine andere Methode um einen Datei zu schließen??

Ich Lese Grade über flush() muss mich mal schlau machen.

Danke fürs mit denken.

Habe mal einen "delay" eingebaut aber dass ist auch nicht die Lösung, dachte dass vielleicht Datei schließen und öffnen zu schnell ginge.

void readlogfile ()//lesen von logfile
{
  delay(2000);
  datei = SD.open("logfile.txt");
  if (datei) {
    Serial.println("logfile inhalt lesen nur für test:");
    while (datei.available()) {
    Serial.write(datei.read());
    }
    datei.close();
  } else {
    Serial.println("Kann logfile.txt nicht öffenen");
  }}

Dann lauft alles wie einen eins

heisst eigentlich, dass die Funktion readlogfile nicht funktioniert. Bzw dort nicht aufgerufen werden kann.

Oder dass etwas ganz woanders krumm ist.

Dass man eine Datei zum Schreiben aufmacht, schreibt, schliesst, die gleiche Datei wieder zum Lesen öffnet und dann das Geschriebene dort wiederfindet, sollte eigentlich (auch ohne delay) funktionieren.
(Gibt genug demos, die das machen.)

Ich frag mich, wann und wie clickEvent() aufgerufen wird ?
Ist evtl. grade der RAM / Stack am Ende ?

Mit deinen vielen Serial.print ohne F() hast du noch viel Puffer...

Aus anderen Implementierungen (ganz andere Baustelle) kenne ich ein Verhalten, daß eine Datei erst mit dem Zerstören des Datei-Objekts geschlossen wird. Ob das hier (C++) bei Verlassen des Unterprogramms funktioniert, kann ich nicht sagen.

Was sagen denn die Beispiele zur Bibliothek, arbeiten die mit lokalen oder globalen Datei-Objekten?

@ michael_x

Mit dass lesen dein Beitrag ist mir klar geworden dass ich die meiste serials.print nicht brauche es ist für mich wichtig in meine testfase auch die "readlogfile" brauch ich nur in die testfase.

Ich frag mich, wann und wie clickEvent() aufgerufen wird ?

Ich hab einen Multibutton gebaut (geklaut) womit ich 4 verschiedene Events aufrufen kann.

Mann kann es sich selbst auch schwieriger machen dann nötig ist.

Mein google "multibutton arduino" zeigt was von adafruit als erstes, was aber den verdächtigen "Event" Begriff nicht verwendet. Also hab ich immer noch keine Ahnung "wann und wie clickEvent() aufgerufen wird" :wink:

michael_x:
Mein google "multibutton arduino" zeigt was von adafruit als erstes, was aber den verdächtigen "Event" Begriff nicht verwendet. Also hab ich immer noch keine Ahnung "wann und wie clickEvent() aufgerufen wird" :wink:

Das ist halt das Problem, wenn man nur Sketch-Fragmente bekommt.

Man darf immer nachfragen. :wink:

Also bitte den kompletten Sketch posten.

Man darf immer Fragen.

Also hier ist mein Sketch, Ich bitte um Verständnis dass ich noch ein Anfänger bin.

https://drive.google.com/open?id=0B6AVYf7yp04PS0l5WlBlcUl4Szg

Ungefähr 80% von die Serial.prints werden raus geholt.

Diesen Sketch ist auch noch nicht fertig es wird noch:
Einen Wlan eingebaut die ESP8266
Einen Datei muss bei neu Start von SD-karte mit neue Einstellungen eingelesen werden (timers)
Und ein teil soll über eine Webseite bedienbar sein.

Ist für mich noch eine menge Arbeit aber ich habe auch einen menge zeit.

Also sei mir nicht böse wenn es nicht immer nach der regeln ist was ich gemacht (geklaut) habe.

Da sehr viele User ungern etwas von fremden Seiten downloaden, bitte den Sketch hier posten.

Und die Code-Tags (Schaltfläche </>) dazu verwenden. Diese ist oben links.

HotSystems:
Da sehr viele User ungern etwas von fremden Seiten downloaden, bitte den Sketch hier posten.

Und die Code-Tags (Schaltfläche </>) dazu verwenden. Diese ist oben links.

Dass möchte ich auch gerne aber der Sketch ist zu groß.

Bekomme diesen Meldung.

Arduino Forum.ino (9.84 KB)

Habe für die Liebhabers hier einen Link nach der original Sketch für einen Multibutton