Hallo Zusammen,
ich bin bei meiner kleinen Elektronikzentrale etwas weitergekommen, aber nun glaube ich, habe ich einen Hund reinbekommen.
Es klappt alles so einigermaßen, dass die linke und rechte Seite zueinander gesperrt ist und dass man auch mit einem beliebigen Taster den Modus wieder beenden kann.
Wo ich aber leider echt nicht weiterkomme ist das Thema mit der Warnblinkanlage, ich hätte gerne, dass wenn ich einen Taster gedrückt halte und dann den anderen drücke, dass dann eine Warnblinkfunktion mit synchronisierten LED´s ist.
Hat jemand von euch eine Idee, oder Verbesserung?
Und ja, bevor Leute kommen und sagen es ist gefährlich sowas selber zu programmieren, ja ist mir auch bewusst, aber ich will es halt versuchen.
Vielen Dank vorab.
Code
const int buttonPinlinks = 2; // Pin, an dem der Taster angeschlossen ist
const int buttonPinrechts = 3;
const int ledPinlinks = 10; // Pin, an dem die LED angeschlossen ist
const int ledPinrechts = 11;
const int LichtTaster = 4;
const int Fernlicht = A1;
const int Abblendlicht = A2;
unsigned long startTimelicht = 0;
unsigned long startTimelinks = 0; // Zeitstempel für Tastendruck
unsigned long startTimerechts = 0;
unsigned long currentTimelicht =0;
unsigned long durationlicht = 0;
unsigned long currentTimelinks = 0; // Zeitstempel für Tastendruck
unsigned long currentTimerechts = 0;
unsigned long durationlinks = 0; // Gemessene Zeitdauer
unsigned long durationrechts = 0;
int currentStatelight = 0;
int currentStateTasterlinks = 0; // Der aktuelle Zustand der TasterZustandsmaschine
int currentStateTasterrechts = 0;
int currentStateTasterlicht = 0;
int currentStateBlinkerlinks = 0; // Der aktuelle Zustand der TasterZustandsmaschine
int currentStateBlinkerrechts = 0;
int currentStateLicht = 0;
int currentStateBlinkerArtlinks = 0; // Der aktuelle Zustand der TasterZustandsmaschine
int currentStateBlinkerArtrechts = 0;
unsigned long actionStartTimelinks = 0; // Zeitstempel für den Start der aktuellen Aktion
unsigned long actionStartTimerechts = 0;
unsigned long actionStartTimelicht = 0;
unsigned long blinkStartTimelinks = 0; // Zeitstempel für den Start der aktuellen Aktion
unsigned long blinkStartTimerechts = 0;
const unsigned long overtakeDuration = 3500; // Dauer des Überholblinkens (5 Sekunden)
const unsigned long turnDuration = 30000; // Dauer des Abbiegeblinkens (30 Sekunden)
const unsigned long blinkTime = 800; // Intervall des Blinkens
const unsigned long ZeitkurzerTastendruck = 300; //Zeit für kurzen Tasterdruck = wenn unterhalb der Zeit
const unsigned long ZeitlangerTastendruck = 1200;
const unsigned long ZeitkurzerTastendrucklicht = 400;
const unsigned long ZeitlangerTastendrucklicht = 1200; // Zeit ab "langerTastendruck"
void setup() {
pinMode(buttonPinlinks, INPUT_PULLUP); // Taster-Pin als Eingang mit Pull-Up-Widerstand
pinMode(buttonPinrechts, INPUT_PULLUP);
pinMode(LichtTaster, INPUT_PULLUP);
pinMode(ledPinlinks, OUTPUT); // LED-Pin als Ausgang
pinMode(ledPinrechts, OUTPUT);
pinMode(Fernlicht, OUTPUT);
pinMode(Abblendlicht, OUTPUT);
digitalWrite(Fernlicht, LOW);
digitalWrite(Abblendlicht, LOW);
digitalWrite(ledPinlinks, LOW); // LED ausschalten
digitalWrite(ledPinrechts, LOW);
Serial.begin(115200); // Serielle Kommunikation starten (zur Debugging-Zwecken)
}
void loop() {
////////////////////LICHTTASTER/////////////////////////////////
int lightButtonState = digitalRead(LichtTaster);
currentTimelicht = millis();
switch (currentStateTasterlicht) {
case 0: // Warten auf Tastendruck
if ((lightButtonState == LOW)) { // Taster wurde gedrückt
startTimelicht = currentTimelicht; // Aktuelle Zeit speichern
actionStartTimelicht = currentTimelicht;
currentStateTasterlicht = 1; // Zustand wechseln
Serial.println("Taster licht gedrückt");
}
break;
case 1: // Warten auf Loslassen des Tasters
if (lightButtonState == HIGH) { // Taster wurde losgelassen
durationlicht = currentTimelicht - startTimelicht; // Zeitdauer berechnen
currentStateTasterlicht = 0; // Zustand wechseln
Serial.print("Taster losgelassen, Zeitdauer: ");
Serial.println(durationlicht);
}
break;
}
/////////////////////////////////////////////////////////////////////LINKER KNOPF //////////////////////////////////////////////////
int buttonStatelinks = digitalRead(buttonPinlinks);
currentTimelinks = millis();
switch (currentStateTasterlinks) {
case 0: // Warten auf Tastendruck
if ((buttonStatelinks == LOW) && (currentStateBlinkerArtlinks == 0) != (currentStateBlinkerArtrechts == 3 || currentStateBlinkerArtrechts == 4 || currentStateBlinkerArtrechts == 2)) { // Taster wurde gedrückt
startTimelinks = currentTimelinks; // Aktuelle Zeit speichern
actionStartTimelinks = currentTimelinks;
currentStateTasterlinks = 1; // Zustand wechseln
Serial.println("Taster links gedrückt");
}
break;
case 1: // Warten auf Loslassen des Tasters
if (buttonStatelinks == HIGH) { // Taster wurde losgelassen
durationlinks = currentTimelinks - startTimelinks; // Zeitdauer berechnen
currentStateTasterlinks = 0; // Zustand wechseln
Serial.print("Taster losgelassen, Zeitdauer: ");
Serial.println(durationlinks);
}
break;
}
//////////////////////////////////////////////////////////////////RECHTER KNOPF////////////////////////////////////////////////////
int buttonStaterechts = digitalRead(buttonPinrechts);
currentTimerechts = millis();
switch (currentStateTasterrechts) {
case 0: // Warten auf Tastendruck
if ((buttonStaterechts == LOW) && (currentStateBlinkerArtrechts == 0) != (currentStateBlinkerArtlinks == 3 || currentStateBlinkerArtlinks == 4 || currentStateBlinkerArtlinks == 2)) { // Taster wurde gedrückt
startTimerechts = currentTimerechts; // Aktuelle Zeit speichern
actionStartTimerechts = currentTimerechts;
currentStateTasterrechts = 1; // Zustand wechseln
Serial.println("Taster rechts gedrückt");
}
break;
case 1: // Warten auf Loslassen des Tasters
if (buttonStaterechts == HIGH) { // Taster wurde losgelassen
durationrechts = currentTimerechts - startTimerechts; // Zeitdauer berechnen
currentStateTasterrechts = 0; // Zustand wechseln
Serial.print("Taster losgelassen, Zeitdauer: ");
Serial.println(durationrechts);
}
break;
}
/////////////////////////////////////////////////////////////////////BLINKER LINKS//////////////////////////////////////////////
switch (currentStateBlinkerlinks) {
case 0: // Warten auf Tastendruck
if ((buttonStatelinks == LOW) && (currentStateBlinkerArtlinks == 0) != (currentStateBlinkerArtrechts == 3 || currentStateBlinkerArtrechts == 4 || currentStateBlinkerArtrechts == 2)) { // Taster wurde gedrückt
blinkStartTimelinks = currentTimelinks; // Aktuelle Zeit speichern
digitalWrite(ledPinlinks, HIGH); // LED einschalten
currentStateBlinkerlinks = 1; // Zustand wechseln
Serial.println("Taster gedrückt, LED eingeschaltet");
}
break;
case 1: // Dauerhaftes Blinken ON
if (currentTimelinks - blinkStartTimelinks > blinkTime) {
digitalWrite(ledPinlinks, LOW); // LED einschalten
blinkStartTimelinks = currentTimelinks;
currentStateBlinkerlinks = 2; // Zustand wechseln
}
case 2: // Dauerhaftes Blinken OFF
if (currentTimelinks - blinkStartTimelinks > blinkTime) {
digitalWrite(ledPinlinks, HIGH); // LED einschalten
blinkStartTimelinks = currentTimelinks;
currentStateBlinkerlinks = 1; // Zustand wechseln
}
}
////////////////////////////////////////////////////////////////BLINKER RECHTS///////////////////////////////////////
switch (currentStateBlinkerrechts) {
case 0: // Warten auf Tastendruck
if ((buttonStaterechts == LOW) && (currentStateBlinkerArtrechts == 0) != (currentStateBlinkerArtlinks == 3 || currentStateBlinkerArtlinks == 4 || currentStateBlinkerArtlinks == 2)) { // Taster wurde gedrückt
blinkStartTimerechts = currentTimerechts; // Aktuelle Zeit speichern
digitalWrite(ledPinrechts, HIGH); // LED einschalten
currentStateBlinkerrechts = 1; // Zustand wechseln
Serial.println("Taster gedrückt, LED eingeschaltet");
}
break;
case 1: // Dauerhaftes Blinken ON
if (currentTimerechts - blinkStartTimerechts > blinkTime) {
digitalWrite(ledPinrechts, LOW); // LED einschalten
blinkStartTimerechts = currentTimerechts;
currentStateBlinkerrechts = 2; // Zustand wechseln
}
case 2: // Dauerhaftes Blinken OFF
if (currentTimerechts - blinkStartTimerechts > blinkTime) {
digitalWrite(ledPinrechts, HIGH); // LED einschalten
blinkStartTimerechts = currentTimerechts;
currentStateBlinkerrechts = 1; // Zustand wechseln
}
}
///////////////////////////////////////////////////////////////////Blinker Links ////////////////////////
switch (currentStateBlinkerArtlinks) {
case 0: // Warten auf loslassen des Tasters
if (durationlinks > 0 && durationlinks < ZeitkurzerTastendruck) {
// Aktion für Überholblinken
currentStateBlinkerArtlinks = 2; // Zustand wechseln
Serial.println("Überholblinken gestartet");
} if (durationlinks >= ZeitkurzerTastendruck && durationlinks < ZeitlangerTastendruck) {
// Aktion für Abbiegeblinken
currentStateBlinkerArtlinks = 3; // Zustand wechseln
Serial.println("Abbiegeblinken gestartet");
} if (durationlinks >= ZeitlangerTastendruck) {
// Aktion für dauerhaftes Blinken
currentStateBlinkerArtlinks = 4; // Zustand wechseln
Serial.println("Dauerhaftes Blinken gestartet");
}
break;
case 2: // Überholblinkenlinks
if (currentTimelinks - actionStartTimelinks >= overtakeDuration || buttonStaterechts == LOW || buttonStatelinks == LOW) {
linksblinkenBeenden();
Serial.println("Überholblinken beendet");
}
break;
case 3: // Abbiegeblinkenlinks
if (currentTimelinks - actionStartTimelinks >= turnDuration || buttonStaterechts == LOW || buttonStatelinks == LOW) {
// Aktion für Abbiegeblinkenlinks beenden
linksblinkenBeenden();
currentStateBlinkerArtlinks = 5;
Serial.println("Abbiegeblinken beendet");
}
break;
case 4: // Warten auf Tastendruck
if (buttonStatelinks == LOW != (currentStateBlinkerrechts == 1 && currentStateBlinkerArtrechts == 2)) { // Taster wurde gedrückt
linksblinkenBeenden();
currentStateBlinkerArtlinks = 5;
Serial.println("Dauerhaftes Blinken beendet");
}
case 5: // Warten auf Loslassen des Tasters
if (buttonStatelinks == HIGH) { // Taster wurde losgelassen
currentStateBlinkerArtlinks = 0;
Serial.println("Taster losgelassen");
}
}
//////////////////////////////////////////////////////////Blinker rechts ///////////////////////////////
switch (currentStateBlinkerArtrechts) {
case 0: // Warten auf loslassen des Tasters
if (durationrechts > 0 && durationrechts < ZeitkurzerTastendruck) {
// Aktion für Überholblinken
currentStateBlinkerArtrechts = 2; // Zustand wechseln
Serial.println("Überholblinken Rechts gestartet");
} if (durationrechts >= ZeitkurzerTastendruck && durationrechts < ZeitlangerTastendruck) {
// Aktion für Abbiegeblinken
currentStateBlinkerArtrechts = 3; // Zustand wechseln
Serial.println("Abbiegeblinken Rechts gestartet");
} if (durationrechts >= ZeitlangerTastendruck) {
// Aktion für dauerhaftes Blinken
currentStateBlinkerArtrechts = 4; // Zustand wechseln
Serial.println("Dauerhaftes Blinken rechts gestartet");
}
break;
case 2: // Überholblinkenrechts
if (buttonStatelinks == LOW && currentStateBlinkerArtrechts || buttonStaterechts == LOW && currentStateBlinkerArtrechts || currentTimerechts - actionStartTimerechts >= overtakeDuration) {
rechtsblinkenBeenden();
Serial.println("Überholblinken Rechts beendet");
}
break;
case 3: // Abbiegeblinkenrechts
if (currentTimerechts - actionStartTimerechts >= turnDuration || buttonStaterechts == LOW || buttonStatelinks == LOW) {
// Aktion für Abbiegeblinkenrechts beenden
rechtsblinkenBeenden();
currentStateBlinkerArtrechts = 5;
Serial.println("Abbiegeblinken Rechts beendet");
}
break;
case 4: // Warten auf Tastendruck
if (buttonStaterechts == LOW != (currentStateBlinkerlinks == 1 || currentStateBlinkerArtlinks == 2)) { // Taster wurde gedrückt
rechtsblinkenBeenden();
currentStateBlinkerArtrechts = 5;
Serial.println("Dauerhaftes Blinken Rechts beendet");
}
case 5: // Warten auf Loslassen des Tasters
if (buttonStaterechts == HIGH) { // Taster wurde losgelassen
currentStateBlinkerArtrechts = 0;
Serial.println("Taster losgelassen");
}
}
switch (currentStatelight) {
case 0: // Licht aus
if (lightButtonState == LOW) { // Licht-Taster wurde gedrückt
startTimelicht = currentTimelicht; // Aktuelle Zeit speichern
currentStatelight = 1; // Zustand wechseln
Serial.println("Licht-Taster gedrückt");
}
break;
case 1: // Licht ein (kurzer Tastendruck)
if (lightButtonState == HIGH) { // Licht-Taster wurde losgelassen
durationlicht = currentTimelicht - startTimelicht; // Zeitdauer berechnen
if (durationlicht < ZeitkurzerTastendrucklicht) {
if (digitalRead(Abblendlicht) == LOW) { // Abblendlicht ist aus
digitalWrite(Abblendlicht, HIGH); // Abblendlicht einschalten
Serial.println("Abblendlicht eingeschaltet");
} else if (digitalRead(Fernlicht) == LOW) { // Fernlicht ist aus
digitalWrite(Fernlicht, HIGH); // Fernlicht einschalten
Serial.println("Fernlicht eingeschaltet");
} else { // Fernlicht ist an
digitalWrite(Fernlicht, LOW); // Fernlicht ausschalten
Serial.println("Fernlicht ausgeschaltet");
}
} else if (durationlicht >= ZeitlangerTastendrucklicht) {
digitalWrite(Abblendlicht, LOW); // Abblendlicht ausschalten
digitalWrite(Fernlicht, LOW); // Fernlicht ausschalten
Serial.println("Abblendlicht und Fernlicht ausgeschaltet");
}
currentStatelight = 0; // Zustand wechseln
}
break;
}
}
void linksblinkenBeenden() {
digitalWrite(ledPinlinks, LOW); // LED ausschalten
currentStateBlinkerArtlinks = 0; // Zurück zum Anfangszustand
currentStateBlinkerlinks = 0;
durationlinks = 0;
}
void rechtsblinkenBeenden() {
digitalWrite(ledPinrechts, LOW); // LED ausschalten
currentStateBlinkerArtrechts = 0; // Zurück zum Anfangszustand
currentStateBlinkerrechts = 0;
durationrechts = 0;
}