[Gelöst] Problem mit SD-Karten (Software)

Ein schönen Tag an alle im Forum,

ich schreibe, weil ich ein Problem habe. Es geht um eine Wetterstation, die ich selbst versuche zu bauen. Sie besteht aus einer RTC (DS1307), einem BME280, einem SD-Karten-Modul, einem Logik-Wandler (da die RTC eine 5V-Logik hat und der BME280 eine 3,3V-Logik), einem Arduino UNO (Klon von AZ-Delivery), zwei LEDs und einem Schalter (dieser muss gedrückt werden, damit das Programm startet).

Einzeln funktionieren die Komponenten so, wie sie sollen. Das habe ich mit verschiedenen Testskripten überprüft (daher bin ich ziemlich sicher, dass es sich um ein Problem in meinem Skript handelt).

Nun zu meinem Problem, fast alles läuft so, wie es soll, jedoch kann mein System keine Daten auf der SD-Karte speichern bzw. die Datei nicht öffnen. Das SD-Karten-Modul und die SD-Karte funktionieren allerdings, wie ich mit einem Testprogramm überprüft habe (Die Verkabelung ist daher korrekt und funktionsfähig ist).

Ich hoffe, ihr könnt mir helfen, und bedanke mich schon einmal im Voraus bei allen. Falls ich zu wenige Details und Informationen gegeben habe, sagt mir bitte Bescheid – ich werde versuchen, sie euch schnell nachzureichen.

Nun folgt mein Sketch:

#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <SD.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


RTC_DS1307 rtc;
Adafruit_BME280 bme;
File myFile;


const int errorLedPin = 2;     // Fehler LED
const int dataLedPin = 3;     // LED zur "Messanzeige"
const int switchPin = 4;     // Schalter an Pin 6
const int chipSelect = 5;   // SD-Karte CS Pin


unsigned long startMillis;
bool switchPressed = false;


void setup() {


  pinMode(errorLedPin, OUTPUT);
  pinMode(dataLedPin, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);  // Schalter mit Pullup-Widerstand


  Serial.begin(9600);


  // -----------------------------------------  Warte auf Schalterbetätigung in der ersten Minute
  startMillis = millis();
  while (millis() - startMillis < 60000) {   // 1 Minute
    if (digitalRead(switchPin) == LOW) {    // Schalter betätigt
      switchPressed = true;
      Serial.println("Start Bestätigung + Erhalten");
      break;
    }
  }


  if (!switchPressed) {
    digitalWrite(errorLedPin, HIGH);   // Fehler LED aktivieren
    errorBlink(1);                    // Schalter Fehler (1X Blinken)
    Serial.println("Start Bestätigung - nicht Erhalten");
    while (1)
      ;  // Stoppe das Programm
  }


  // -----------------------------------------  RTC Initialisierung
  if (!rtc.begin()) {
    errorBlink(3);  // RTC Fehler (3X Blinken)
    Serial.println("RTC - Nicht Erkannt");
    while (1)
      ;
  } else {
    Serial.println("RTC + Erkannt");
    Serial.println("");
    Serial.println("RTC + Zeit");

    DateTime now = rtc.now();
    Serial.print("Uhrzeit: ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.println(now.minute(), DEC);
    Serial.println("");
  }

  // -----------------------------------------  BME280 Initialisierung
  if (!bme.begin(0x76)) {
    errorBlink(5);  // BME280 Fehler (5X Blinken)
    Serial.println("BME280 - Nicht Erkannt");
    while (1)
      ;
  } else {
    Serial.println("BME280 + Erkannt");
  }

  // -----------------------------------------  SD-Karten Initialisierung
  if (!SD.begin(chipSelect)) {
    errorBlink(7);  // SD-Karte Fehler (7X Blinken)
    Serial.println("SD-Karte - Nicht Erkannt [SD ChipSelect]");
    while (1)
      ;
  } else {
    Serial.println("SD-Karte + Erkannt [SD ChipSelect]");
  }


  // -----------------------------------------  Öffnen der CSV-Datei
  myFile = SD.open("messdaten.csv", FILE_WRITE);
  if (myFile) {
    myFile.println("Datum, Uhrzeit, Temperatur, Luftfeuchtigkeit, Luftdruck");
    myFile.close();
    Serial.println("CSV + Erkannt [SD myFile]");
  } else {
    errorBlink(9);  // SD-Karte Schreibfehler (9X Blinken)
    Serial.println("CSV - Nicht Erkannt [SD myFile]");
    while (1)
      ;
  }
}


void loop() {
  DateTime now = rtc.now();

   // Zu Testzwecken "Entfernt"
  // if ((now.minute() == 0 || now.minute() == 30)) {

  // 10 Sekunden vorher LED einschalten
  digitalWrite(dataLedPin, HIGH);
  delay(10000);


  // Daten erfassen und speichern
  logData();


  // 10 Sekunden nachher LED anlassen
  delay(10000);
  digitalWrite(dataLedPin, LOW);


  delay(50000);  // Verhindert erneutes Erfassen in derselben Minute
  //}
}


void logData() {


  DateTime now = rtc.now();
  float temperature = bme.readTemperature();
  float humidity = bme.readHumidity();
  float pressure = bme.readPressure() / 100.0F;


  // Speichern der Daten in der CSV-Datei
  myFile = SD.open("messdaten.csv", FILE_WRITE);
  if (myFile) {
    myFile.print(now.day(), DEC);
    myFile.print('/');
    myFile.print(now.month(), DEC);
    myFile.print('/');
    myFile.print(now.year(), DEC);
    myFile.print(", ");
    myFile.print(now.hour(), DEC);
    myFile.print(':');
    myFile.print(now.minute(), DEC);
    myFile.print(", ");
    myFile.print(temperature);
    myFile.print(", ");
    myFile.print(humidity);
    myFile.print(", ");
    myFile.println(pressure);
    myFile.close();
  } else {
    errorBlink(9);  // SD-Karte Schreibfehler (9X Blinken)
    Serial.println("CSV - Nicht Erkannt [SD myFile]");
  }

  // Ausgabe auf dem Seriellen Monitor
  Serial.print("Datum: ");
  Serial.print(now.day(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.println(now.year(), DEC);


  Serial.print("Uhrzeit: ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.println(now.minute(), DEC);


  Serial.print("Temp: ");
  Serial.print(temperature);
  Serial.println(" C");


  Serial.print("Luft: ");
  Serial.print(humidity);
  Serial.println(" %");


  Serial.print("Druck: ");
  Serial.print(pressure);
  Serial.println(" hPa");
}


void errorBlink(int blinks) {
  for (int i = 0; i < blinks; i++) {
    digitalWrite(errorLedPin, HIGH);
    delay(500);
    digitalWrite(errorLedPin, LOW);
    delay(500);
  }
}

Nun folgt der Schaltplan:

The SD library allows for reading from and writing to SD cards, e.g. on the Arduino Ethernet Shield. It is built on sdfatlib by William Greiman. The library supports FAT16 and FAT32 file systems on standard SD cards and SDHC cards. It uses short 8.3 names for files.

Der Name messdaten ist zu lang.
Hat ja schon @Moko geschrieben :wink:

Zeig doch mal einen Link deines BME280. Es gibt viele, die auch 5Volt an I2C vertragen. Dann kannst du dir den Levelshifter sparen.

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