Hallo,
Nachdem ich seit einiger Zeit als stiller Mitleser bei euch reingeschnuppert habe und dabei sehr viel gelernt habe, bin ich nun an einem Punkt wo ich eure Hilfe brauche.
Zuerst der Code:
const byte VAaus = 2; //Relais VA aus
const byte VAueberbrueckt = 3; //Relais VA überbrückung Überwchungsschalter
const byte led4wd = 4; //LED Taster 4/2WD Low
const byte taster4wd = 6; //Taster 4/2WD Low
unsigned long aktMillis, altMillis, blinkMillis;
unsigned int tastverz = 3000; //Verzögerungszeit taster gedrückt bis VA abgeschalten
unsigned int blinkverz = 200; //für LED Blinken bei ein und Ausschalten
bool zustand2wd = false; //4wdzustand = true -> 2WD, 4wdzustand = false -> 4WD
bool change4wd; //Variable ändern 2/4WD
bool blinkvalue = LOW;
void setup() {
pinMode(led4wd, OUTPUT); //Muss Masse schalten (Transistor)
pinMode(taster4wd, INPUT); //Pullup, Schaltet Masse
pinMode(VAueberbrueckt, OUTPUT); //Schaltet Relais zum Antrieb VA abschalten (trennen)
pinMode(VAaus, OUTPUT); //Überbrückt Überwachung VA aus (Fahrzeug "sieht" VA ein obwohl diese aus ist)
digitalWrite(led4wd, LOW ); // set initial state
digitalWrite(VAaus, LOW); // set initial state
digitalWrite(VAueberbrueckt, LOW); // set initial state
}
void loop()
{
aktMillis = millis(); //millis zurücksetzen
//blinkMillis = millis();
//Taster gedrückt, LED blinkt bis Relais ein
if ((digitalRead(taster4wd) == LOW) && (zustand2wd == false))
if ((aktMillis) - blinkMillis > blinkverz)
{
blinkMillis = millis(); // Blinkmillis zurücksetzen
blinkvalue = !blinkvalue; // LED zustand2wd wecheln.
digitalWrite(led4wd, blinkvalue); // Wert auf den LED Ausgang schreiben
// Beim Blinken und loslassen vom Taster immer mit LED aus stoppen, damit kurzes antippen von Taster nicht den falschen Zustand LED EIN hinterlassen kann
if ((digitalRead(taster4wd) == LOW) && (blinkvalue == true)) //Prüfen Taster nicht gedrückt, während status Blinken aktiv
{
delay(blinkverz); //damit blinken nicht abgewürgt wird
digitalWrite(led4wd, !blinkvalue); //LED ende Blinkintervall ausschalten
}
}
//Taster gedrückt, LED blinkt bis Relais aus
if ((digitalRead(taster4wd) == LOW) && (zustand2wd == true))
if ((aktMillis) - blinkMillis > blinkverz)
{
blinkMillis = millis(); // Blinkmillis zurücksetzen
blinkvalue = !blinkvalue; // LED zustand2wd wecheln.
digitalWrite(led4wd, blinkvalue); // Wert auf den LED Ausgang schreiben
// Beim Blinken und loslassen vom Taster immer mit LED aus stoppen, damit kurzes antippen von Taster nicht den falschen Zustand LED EIN hinterlassen kann
if ((digitalRead(taster4wd) == LOW) && (blinkvalue == true)) //Prüfen Taster nicht gedrückt, während status Blinken aktiv
{
delay(blinkverz); //damit blinken nicht abgewürgt wird
digitalWrite(!led4wd, !blinkvalue); //LED ende Blinkintervall ausschalten
}
}
//Taster schltet mit verzögerung rel 1, dann 2 ein
if (digitalRead(taster4wd) == LOW)
{
if ((aktMillis - altMillis >= tastverz) && change4wd)
{
change4wd = false; //4wdchange = false;
zustand2wd = !zustand2wd; //ausschalten = !ausschalten;
digitalWrite(VAaus, zustand2wd);
delay(1000);
digitalWrite(VAueberbrueckt, zustand2wd);
digitalWrite(led4wd, !change4wd);
}
}
else
{
((change4wd = true) && (digitalRead(taster4wd) == HIGH));
altMillis = aktMillis;
}
}
Konkret geht es um folgendes:
Wird ein Taster für länger als 3 Sekunden gedrückt soll Relais 1 eingeschalten werden und nach einer kurzen Zeit Relais 2 Eingeschalten werden. Danach soll nichts weiter geschehen bis der Taster losgelassen und erneut gedrückt wird. Bei erneutem drücken vom Taster, länger als 3 Sekunden soll zuerst wieder Relais 1 ausgeschalten und nach einer Pause Relais 2 ausgeschalten werden. Soweit funktioniert es (auch wenn es vermutlich viel optimierungspotential in meinem Code geben wird, ist mein erstes richtiges Projekt, also bitte nicht schlagen )
Die LED soll nun während der 3 Sekunden bevor die Relais ein und ausschalten blinken (auch das funktioniert) und wenn beide Relais ein sind den Zustand durch eine dauerhaft Leuchtende LED und wenn beide Relais aus sind mit einer dunklen LED angezeigt werden. Das funktioniert nicht so zuverlässig. Es wird der Status beibehalten der beim Blinken gerade aktiv war wenn ich die Taste loslasse. Und wenn ich die Taste kurz drücke fängt sie (korrekterweise) an zu blinken und bleibt dann in dem Zustand wo ich sie loslasse, sprich die Relais können eingeschalten sein, die LED aber aus und umgekehrt was dann keinerlei Aussagekraft mehr über den Schaltzustand der Relais hat.
Habt ihr eine Idee wie ich das umsetzen könnte.
Vielen Dank