Ich möchte werte von Sensoren in eine Datei schreiben und die Überschrift zunächst im “Setup” schreiben.
#include <RTClib.h>
/* für den Kartenleser */
#include <SD.h>
const int chipSelect = 10;
// File für SD Karte
File dataFile;
// DS3231 RTC Modul
RTC_DS3231 rtc;
String timestamp;
void setup() {
Serial.begin(9600);
// SD-Karte initialisieren
if (!SD.begin(chipSelect)) {
Serial.println("SD Karte konnte nicht initialisiert werden.");
return;
}
Serial.println("SD Karte bereit.");
// Neue Datei erstellen oder bestehende öffnen
dataFile = SD.open("daten.csv", FILE_WRITE);
if (dataFile) {
dataFile.println("Datei erstellen im Setupteil des Sketches");
// dataFile.println(millis()); // Zeile kann entfallen war zum Test da Programm immer neu startete
dataFile.print("Datum,Uhrzeit,"), // Überschrift der Tabelle
dataFile.print("Temp innen(C),Luftfeuchtigkeit (%),Taupunkt (C),Luftdruck (hPa),");
dataFile.print("Temp außen(C),Luftfeuchtigkeit (%),Taupunkt (C),");
dataFile.println("Lüfter ein,Lüfter aus,Lüfterzeit");
dataFile.close();
Serial.println("Erstellen der Datei");
} else {
Serial.println("Fehler beim Erstellen der Datei.");
}
// DS3231 initialisieren
if (!rtc.begin()) {
Serial.println("Fehler beim Initialisieren des DS3231 RTC Moduls!");
while (1)
;
}
}
void loop() {
stempel(); // Zeitstempel erstellen
Karte_schreiben(); // Daten auf SD Karte schreiben
Serial.println(timestamp);
delay(1000);
}
void stempel() {
// Datum und Uhrzeit vom RTC Modul abrufen
DateTime now = rtc.now();
// Datum und Uhrzeit formatieren (z.B. "2025-09-15 14:30:01")
timestamp = String(now.day()) + "-" + String(now.month()) + "-" + String(now.year()) + " " + String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second());
}
void Karte_schreiben() {
// Neue Datei erstellen oder bestehende öffnen
dataFile = SD.open("daten.csv", FILE_WRITE);
if (dataFile) {
dataFile.println(timestamp);
dataFile.close();
} else {
Serial.println("Fehler beim Öffnen der Datei.");
}
}
das geht
die zeilen des Setup in ein zweites Program geht nicht ???
in ein laufendes Programm kopiert geht nicht ???
```cpp
// Dieser Code benötigt zwingend die folgenden Libraries:
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <avr/wdt.h>
#include <RTClib.h>
/* für den Kartenleser */
#include <SD.h>
const int chipSelect = 10;
// File für SD Karte
File dataFile;
// DS3231 RTC Modul
RTC_DS3231 rtc;
String timestamp;
#define RELAIPIN 4 // Anschluss des Lüfter-Relais
#define DHTPIN_1 5 // Datenleitung für den DHT-Sensor 1 (innen)
#define DHTPIN_2 6 // Datenleitung für den DHT-Sensor 2 (außen)
#define RELAIS_EIN LOW
#define RELAIS_AUS HIGH
bool rel;
#define DHTTYPE_1 DHT11 // DHT 22 geändert DHT11
#define DHTTYPE_2 DHT11 // DHT 22 geändert DHT11
// ******* Korrekturwerte der einzelnen Sensorwerte *******
#define Korrektur_t_1 0 // Korrekturwert Innensensor Temperatur
#define Korrektur_t_2 0 // Korrekturwert Außensensor Temperatur
#define Korrektur_h_1 0 // Korrekturwert Innensensor Luftfeuchtigkeit
#define Korrektur_h_2 0 // Korrekturwert Außensensor Luftfeuchtigkeit
//***********************************************************
#define SCHALTmin 5.0 // minimaler Taupunktunterschied, bei dem das Relais schaltet
#define HYSTERESE 1.0 // Abstand von Ein- und Ausschaltpunkt
#define TEMP1_min 10.0 // Minimale Innentemperatur, bei der die Lüftung aktiviert wird
#define TEMP2_min -10.0 // Minimale Außentemperatur, bei der die Lüftung aktiviert wird
DHT dht1(DHTPIN_1, DHTTYPE_1); //Der Innensensor wird ab jetzt mit dht1 angesprochen
DHT dht2(DHTPIN_2, DHTTYPE_2); //Der Außensensor wird ab jetzt mit dht2 angesprochen
LiquidCrystal_I2C lcd(0x27, 20, 4); // LCD: I2C-Addresse und Displaygröße setzen
bool fehler = true;
void setup() {
wdt_enable(WDTO_8S); // Watchdog timer auf 8 Sekunden stellen
pinMode(RELAIPIN, OUTPUT); // Relaispin als Output definieren
digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten
Serial.begin(9600); // Serielle Ausgabe, falls noch kein LCD angeschlossen ist
Serial.println(F("Teste Sensoren.."));
lcd.init();
lcd.backlight();
lcd.setCursor(2, 0);
lcd.print(F("Teste Sensoren.."));
byte Grad[8] = { B00111, B00101, B00111, B0000, B00000, B00000, B00000, B00000 }; // Sonderzeichen ° definieren
lcd.createChar(0, Grad);
byte Strich[8] = { B00100, B00100, B00100, B00100, B00100, B00100, B00100, B00100 }; // Sonderzeichen senkrechter Strich definieren
lcd.createChar(1, Strich);
dht1.begin(); // Sensoren starten
dht2.begin();
// SD-Karte initialisieren
if (!SD.begin(chipSelect)) {
Serial.println("SD Karte konnte nicht initialisiert werden.");
return;
}
Serial.println("SD Karte bereit.");
// Neue Datei erstellen oder bestehende öffnen
dataFile = SD.open("daten.csv", FILE_WRITE);
if (dataFile) {
dataFile.println("Datei erstellen im Setupteil des Sketches");
dataFile.println(millis()); // Zeile kann entfallen war zum Test da Programm immer neu startete
dataFile.print("Datum,Uhrzeit,"), // Überschrift der Tabelle
dataFile.print("Temp innen(C),Luftfeuchtigkeit (%),Taupunkt (C),Luftdruck (hPa),");
dataFile.print("Temp außen(C),Luftfeuchtigkeit (%),Taupunkt (C),");
dataFile.println("Lüfter ein,Lüfter aus,Lüfterzeit");
dataFile.close();
Serial.println("Erstellen der Datei");
} else {
Serial.println("Fehler beim Erstellen der Datei.");
}
// DS3231 initialisieren
if (!rtc.begin()) {
Serial.println("Fehler beim Initialisieren des DS3231 RTC Moduls!");
while (1)
;
}
}
void loop() {
float h1 = dht1.readHumidity() + Korrektur_h_1; // Innenluftfeuchtigkeit auslesen und unter „h1“ speichern
float t1 = dht1.readTemperature() + Korrektur_t_1; // Innentemperatur auslesen und unter „t1“ speichern
float h2 = dht1.readHumidity() + Korrektur_h_2; // Außenluftfeuchtigkeit auslesen und unter „h2“ speichern
float t2 = dht1.readTemperature() + Korrektur_t_2; // Außentemperatur auslesen und unter „t2“ speichern
if (fehler == true) // Prüfen, ob gültige Werte von den Sensoren kommen
{
fehler = false;
if (isnan(h1) || isnan(t1) || h1 > 100 || h1 < 1 || t1 < -40 || t1 > 80) {
Serial.println(F("Fehler beim Auslesen vom 1. Sensor!"));
lcd.setCursor(0, 1);
lcd.print(F("Fehler Sensor 1"));
fehler = true;
} else {
lcd.setCursor(0, 1);
lcd.print(F("Sensor 1 in Ordnung"));
}
delay(2000); // Zeit um das Display zu lesen
if (isnan(h2) || isnan(t2) || h2 > 100 || h2 < 1 || t2 < -40 || t2 > 80) {
Serial.println(F("Fehler beim Auslesen vom 2. Sensor!"));
Serial.println(h2);
Serial.println(t2);
Serial.println(h1);
Serial.println(t1);
lcd.setCursor(0, 2);
lcd.print(F("Fehler Sensor 2"));
fehler = true;
} else {
lcd.setCursor(0, 2);
lcd.print(F("Sensor 2 in Ordnung"));
}
delay(2000); // Zeit um das Display zu lesen
}
if (isnan(h1) || isnan(t1) || isnan(h2) || isnan(t2)) fehler = true;
if (fehler == true) {
digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten
lcd.setCursor(0, 3);
lcd.print(F("CPU Neustart....."));
while (1)
; // Endlosschleife um das Display zu lesen und die CPU durch den Watchdog neu zu starten
}
wdt_reset(); // Watchdog zurücksetzen
//**** Taupunkte errechnen********
float Taupunkt_1 = taupunkt(t1, h1);
float Taupunkt_2 = taupunkt(t2, h2);
// Werteausgabe auf Serial Monitor
Serial.print(F("Sensor-1: "));
Serial.print(F("Luftfeuchtigkeit: "));
Serial.print(h1);
Serial.print(F("% Temperatur: "));
Serial.print(t1);
Serial.print(F("°C "));
Serial.print(F(" Taupunkt: "));
Serial.print(Taupunkt_1);
Serial.println(F("°C "));
Serial.print("Sensor-2: ");
Serial.print(F("Luftfeuchtigkeit: "));
Serial.print(h2);
Serial.print(F("% Temperatur: "));
Serial.print(t2);
Serial.print(F("°C "));
Serial.print(F(" Taupunkt: "));
Serial.print(Taupunkt_2);
Serial.println(F("°C "));
Serial.println();
// Werteausgabe auf dem I2C-Display
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("S1: "));
lcd.print(t1);
lcd.write((uint8_t)0); // Sonderzeichen °C
lcd.write(('C'));
lcd.write((uint8_t)1); // Sonderzeichen |
lcd.print(h1);
lcd.print(F(" %"));
lcd.setCursor(0, 1);
lcd.print(F("S2: "));
lcd.print(t2);
lcd.write((uint8_t)0); // Sonderzeichen °C
lcd.write(('C'));
lcd.write((uint8_t)1); // Sonderzeichen |
lcd.print(h2);
lcd.print(F(" %"));
lcd.setCursor(0, 2);
lcd.print(F("Taupunkt 1: "));
lcd.print(Taupunkt_1);
lcd.write((uint8_t)0); // Sonderzeichen °C
lcd.write(('C'));
lcd.setCursor(0, 3);
lcd.print(F("Taupunkt 2: "));
lcd.print(Taupunkt_2);
lcd.write((uint8_t)0); // Sonderzeichen °C
lcd.write(('C'));
delay(6000); // Zeit um das Display zu lesen
wdt_reset(); // Watchdog zurücksetzen
lcd.clear();
lcd.setCursor(0, 0);
float DeltaTP = Taupunkt_1 - Taupunkt_2;
if (DeltaTP > (SCHALTmin + HYSTERESE)) rel = true;
if (DeltaTP < (SCHALTmin)) rel = false;
if (t1 < TEMP1_min) rel = false;
if (t2 < TEMP2_min) rel = false;
if (rel == true) {
digitalWrite(RELAIPIN, RELAIS_EIN); // Relais einschalten
lcd.print(F("Lueftung AN"));
} else {
digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten
lcd.print(F("Lueftung AUS"));
}
lcd.setCursor(0, 1);
lcd.print("Delta TP: ");
lcd.print(DeltaTP);
lcd.write((uint8_t)0); // Sonderzeichen °C
lcd.write('C');
delay(4000); // Wartezeit zwischen zwei Messungen
wdt_reset(); // Watchdog zurücksetzen
}
float taupunkt(float t, float r) {
float a, b;
if (t >= 0) {
a = 7.5;
b = 237.3;
} else if (t < 0) {
a = 7.6;
b = 240.7;
}
// Sättigungsdampfdruck in hPa
float sdd = 6.1078 * pow(10, (a * t) / (b + t));
// Dampfdruck in hPa
float dd = sdd * (r / 100);
// v-Parameter
float v = log10(dd / 6.1078);
// Taupunkttemperatur (°C)
float tt = (b * v) / (a - v);
return { tt };
}
void software_Reset() // Startet das Programm neu, nicht aber die Sensoren oder das LCD
{
asm volatile(" jmp 0");
}
```