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: