Vom Setup auf loop überspringen bei Problemen mit SD Karte

Hallo,
ich möchte das wenn SD Karte defekt, nicht vorhanden ist void setup überspringen.

fony:
Hallo,
ich möchte das wenn SD Karte defekt, nicht vorhanden ist void setup überspringen.

Ja, wo ist das Problem, oder besser wie ist deine Frage ?

Du nimmst den Beispiel Sketch und entfernst die evtl. vorhandenen Schleifen, die dich daran hindern.
Oder nimmst den else-Zweig zum weiter gehen.

ok,nur wie mach ich das mit goto ? oder wie?
Grüße
Bernhard

fony:
ok,nur wie mach ich das mit goto ? oder wie?
Grüße
Bernhard

Wieso goto ?

Zeig einfach deinen Sketch, damit wir helfen können.

#include <Wire.h >
#include <LiquidCrystal_I2C.h> //LCD
LiquidCrystal_I2C LCD(0x3f, 16, 2);
#include <SD.h>
#include <SPI.h>
const int chipSelect = 4;//alt4

void setup()
{
  LCD.init(); //20x4
  LCD.backlight();
  // Open serial communications and wait for port to open:
  // Serial.begin(9600);
  // while (!Serial) {
  ; // wait for serial port to connect. Needed for native USB port only
  // }

  //  Serial.print("Initializing SD card...");
  LCD.setCursor (0 , 0);
  LCD.print ("Starte SD Karte...");
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    //  Serial.println("Card failed, or not present");
    LCD.setCursor (0, 1);
    LCD.print (" SD Karte defekt...");
    // don't do anything more:
    while (1);
  }
  // Serial.println("card initialized.");
  LCD.setCursor (0, 1);
  LCD.print (" SD Karte OK ...");
  delay(5000);
}


void loop() {
  // make a string for assembling the data to log:
  String dataString = "";

  // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 5; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor) += String("  ") += String( "Hallo");
    if (analogPin < 2) {
      dataString += "; ";


    }
  }

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  File dataFile1 = SD.open("log.txt", FILE_WRITE);
  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    // Serial.println(dataString);
    LCD.setCursor (0 , 0);
    LCD.print (dataString);
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");

  }
  if (dataFile1) {
    dataFile1.println("nix da_oder doch");
    dataFile1.close();
    // print to the serial port too:
    // Serial.println(dataString);
    LCD.setCursor (0 , 1);
    LCD.print ("dataString");
  }
  // if the file isn't open, pop up an error:
  else {
    //  Serial.println("error opening log.txt");
    LCD.setCursor (0 , 1);
    LCD.print(" Error log.txt");

  }
  delay(1000);
}

Entferne das "while(1)" aus der if-Abfrage.

Da muss noch mehr gemacht werden.
Einfach weglassen, führt zur falschen Meldung!

ok,nur wie mach ich das

Natülich könnte man Goto zur Hilfe nehmen.
Aber unmittelbaren Sinn macht das nicht.

Ich rate dir, die Sprache, welche du verwendest, zu lernen.
Dabei könnte dir eins der schönen, dicken und modernen C++ Bücher behilflich sein.

ich schreibe zwei logs auf die SD und das funktioniert.
Sol im größerem Projekt eingebunden werden.
Nur wen Setup blockt Dan steche ich im setup ;(

fony:
Nur wen Setup blockt Dan steche ich im setup ;(

Gibts das auch in verständlich?

Wenn die SD-Funktion für Dein Programm wichtig ist, solltest Du nicht einfach weitergehen.

Ansonsten merke Dir in einer Statusvariablen, ob Du eine SD gefunden hast (die wertest Du dann bei den SD-Zugriffen aus und unterbindest diese), nimmst das while(1) raus und packst den Rest vom setup ins else.

Gruß Tommy

fony:
ich schreibe zwei logs auf die SD und das funktioniert.
Sol im größerem Projekt eingebunden werden.
Nur wen Setup blockt Dan steche ich im setup ;(

Ok, mein Vorschlag soll auch nur eine Notlösung sein.
Du solltest da einfach einen Timer einsetzen, der nach kurzer Zeit weiter geht, um nicht zu blockieren.

Hi

Wenn auf der SD-Karte was gespeichert werden soll - dann ist's doch 'toll', wenn Diese auch vorhanden und in Funktion ist, oder?

Ich verstehe das Anliegen noch nicht so wirklich.

Man könnte, wenn die SD-Karte fehlt, in der Zwischenzeit die Daten in einem FRam/EEprom speichern und wenn die SD-Karte wieder eingelegt wird (+ Taster drücken, Karte erkennen, File öffnen) die Daten umkopieren.
Nach weiterem Tastendruck ist die SD-Karte wieder frei zur Entnahme - irgendwer möchte wohl diese Daten haben, Die der Arduino so fein säuberlich aufgelistet hat.

MfG

fony:

  if (!SD.begin(chipSelect)) {

//[..]
   while (1);
 }

In der SD.h findest Du, was SD.begin() macht.

Hinter dem obigen if versteckt sich die Rückgabe eines boolschen Wertes.
Das ! kürzt das auf ein Minimum.
if (SD.begin(chipSelect)==false) wäre die Langform.
Und wenn die Bedingung erfüllt ist, dann rufe while(1). Und da diese Bedingung immer erfüllt ist, bleibts da stehen...

Du könntest jetzt x.-mal prüfen, ob die Karte doch noch aktiviert werden kann. Dann jedoch in jedem Fall weiter machen.
Den Status merken (Karte inaktiv) und alle xxx (sekunden/minuten/millisekunden) prüfen, ob die doch noch aktiviert werden kann und dann Status auf aktiv setzen um die Prüfung nicht mehr durchzuführen.
[/code]

postmaster-ino:
Man könnte, wenn die SD-Karte fehlt, in der Zwischenzeit die Daten in einem FRam/EEprom speichern und wenn die SD-Karte wieder eingelegt wird (+ Taster drücken, Karte erkennen, File öffnen) die Daten umkopieren.
Nach weiterem Tastendruck ist die SD-Karte wieder frei zur Entnahme - irgendwer möchte wohl diese Daten haben, Die der Arduino so fein säuberlich aufgelistet hat.

Ich glaube der OP möchte den Zustand der SD-Card beim Start feststellen.
Wenn "vergessen" wurde die Karte einzustecken, bevor die Hardware in die Scheune eingebaut wurde und somit die SD-Card fehlt schon im Setup, bzw. das Modul steckt nicht sauber drauf, es nicht zum Totalstillstand der Hardware führt.

Es ist auch möglich, SD.begin innerhalb von loop aufzurufen und nur dann Daten zu schreiben, wenn eine SD-Karte erkannt wird, also SD.begin erfolgreich war.

[quote
author=agmue link=msg=4620071 date=1590652359]
Es ist auch möglich, SD.begin innerhalb von loop aufzurufen und nur dann Daten zu schreiben, wenn eine SD-Karte erkannt wird, also SD.begin erfolgreich war.

[/quote]

Hallo !!!
juhu das is das, ich Dummkopf bin da drauf nicht gekommen.

Danke an Alle

Bernhard

fony:
Hallo !!!
juhu das is das, ich Dummkopf bin da drauf nicht gekommen.

Da hättest du dein Problem einfach mal besser oder anders beschreiben sollen.

fony:
juhu das is das, ich Dummkopf bin da drauf nicht gekommen.

Freut mich und Danke für die Rückmeldung!

HotSystems:
Da hättest du dein Problem einfach mal besser oder anders beschreiben sollen.

Eine Frage kann man erst dann gut formulieren, wenn man die Antwort kennt ;D

agmue:
Eine Frage kann man erst dann gut formulieren, wenn man die Antwort kennt ;D

Genau deswegen habe ich auch nicht "Frage" geschrieben. :wink:

HotSystems:
Genau deswegen habe ich auch nicht "Frage" geschrieben. :wink:

Potz Blitz, diese Feinheit hatte ich übersehen :slight_smile: