Hallo Zusammen, ich habe folgenden Code mir zusammen gebastelt.
Leider komme ich da nicht weiter. das Problem ist das Zeitintervall von 2 min.
Der pin wird zwar geschaltet aber schaltet danach nicht mehr aus.
hat jemand eine Idee?
#include <Wire.h>
#include <NoiascaLiquidCrystal.h>
#include <NoiascaHW/lcd_PCF8574.h>
constexpr byte cols = 20;
constexpr byte rows = 4;
constexpr byte addr = 0x27;
LiquidCrystal_PCF8574 lcd(addr, cols, rows);
const int pin = 2; // Der Pin, den Sie steuern möchten
//#define RELAY_PIN 2
#define INTERVALL_BEGIN 8
#define INTERVALL_END 20
#define DS3231_ADDRESSE 0x68
void setup() {
Wire.begin();
lcd.init();
lcd.clear();
lcd.backlight();
Serial.begin(9600);
pinMode(pin, OUTPUT);
}
void loop() {
zeigeZeit();
schalteRelaisImIntervall();
delay(1000);
}
void zeigeZeit() {
byte sekunde, minute, stunde, wochentag, tag, monat, jahr;
leseDS3231zeit(&sekunde, &minute, &stunde, &wochentag, &tag, &monat, &jahr);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("1");
lcd.setCursor(0, 2);
if (stunde >= INTERVALL_BEGIN && stunde < INTERVALL_END) {
lcd.print("Pumpe: EIN");
digitalWrite(pin, HIGH); // Relais einschalten
} else {
lcd.print("Pumpe: AUS");
digitalWrite(pin, LOW); // Relais ausschalten
}
lcd.setCursor(0, 1);
lcd.print("Uhrzeit: ");
if (stunde < 10) {
lcd.print("0");
}
lcd.print(stunde, DEC);
lcd.print(":");
if (minute < 10) {
lcd.print("0");
}
lcd.print(minute, DEC);
lcd.print(":");
if (sekunde < 10) {
lcd.print("0");
}
lcd.print(sekunde, DEC);
}
void leseDS3231zeit(byte *sekunde, byte *minute, byte *stunde, byte *wochentag, byte *tag, byte *monat, byte *jahr) {
Wire.beginTransmission(0x68);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(0x68, 7);
*sekunde = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*stunde = bcdToDec(Wire.read() & 0x3f);
*wochentag = bcdToDec(Wire.read());
*tag = bcdToDec(Wire.read());
*monat = bcdToDec(Wire.read());
*jahr = bcdToDec(Wire.read());
}
void schalteRelaisImIntervall() {
static unsigned long previousMillis = 0;
static bool relayOn = false;
byte stunde, minute;
leseDS3231zeit(NULL, &minute, &stunde, NULL, NULL, NULL, NULL);
unsigned long currentMillis = millis();
if (stunde >= INTERVALL_BEGIN && stunde < INTERVALL_END) {
if (minute == 0) {
if (!relayOn) {
// Relais einschalten, wenn es nicht schon eingeschaltet ist
digitalWrite(pin, HIGH);
relayOn = true;
previousMillis = currentMillis;
}
if (currentMillis - previousMillis >= 120000) {
// Wenn 2 Minuten vergangen sind, schalt das Relais aus
digitalWrite(pin, LOW);
relayOn = false;
}
}
} else {
// Relais außerhalb des Intervalls ausschalten
digitalWrite(pin, LOW);
relayOn = false;
}
}
byte bcdToDec(byte val) {
return ((val / 16 * 10) + (val % 16));
}