Guten Tag zusammen ich habe ein esp32 und will eine steuerung damit machen für ein blinker mit 3 taster und led´s Es soll mit einer 12v leitung versehen werden. Habe nur gelesen das man dies mit mosfet lösen kann. Folgenden code habe ich: // Verbesserter Fahrradblinker für ESP32 // - 3 Taster (INPUT_PULLUP, Taster nach GND) // - 2 LED-Ausgänge (linker/rechter Blinker) // - pro-Taster Debounce // - Serielle Debug-Ausgabe // Pin-Konfiguration (anpassbar) const int buttonLeftPin = 14; const int buttonRightPin = 27; const int buttonWarnPin = 26; const int ledLeftPin = 12; const int ledRightPin = 13; // Blink-Einstellung (ms) unsigned long blinkInterval = 400UL; // --- interne Variablen für Blinken --- unsigned long lastBlinkTime = 0; bool blinkState = false; // --- Zustände --- enum BlinkerState { OFF, LEFT, RIGHT, WARN }; BlinkerState currentState = OFF; // --- Debounce pro Taster --- struct Button { int pin; bool stableState; // aktuell entprellter Zustand (true = gedrückt) bool lastRead; // letzte gelesene Roh-Bit (LOW/HIGH als bool) unsigned long lastChangeMillis; unsigned long debounceMillis; }; Button btnLeft = { buttonLeftPin, false, HIGH, 0UL, 50UL }; Button btnRight = { buttonRightPin, false, HIGH, 0UL, 50UL }; Button btnWarn = { buttonWarnPin, false, HIGH, 0UL, 50UL }; // Hilfsfunktion: liest einen Button und aktualisiert Debounce bool readButton(Button &b) { bool raw = digitalRead(b.pin); // HIGH wenn nicht gedrückt (INPUT_PULLUP) unsigned long now = millis(); if (raw != b.lastRead) { // Signal hat sich geändert -> setze Zeitstempel b.lastChangeMillis = now; b.lastRead = raw; } else { // Wenn das Signal stabil ist länger als debounceMillis, übernehme es if (now - b.lastChangeMillis >= b.debounceMillis) { bool pressed = (raw == LOW); // LOW = gedrückt bei INPUT_PULLUP if (pressed != b.stableState) { b.stableState = pressed; // Rückgabe true bedeutet: Zustand hat sich geändert (Edge) return true; } } } return false; } // Aufruf bei erkannten Tasterereignissen (Edge) void handlePress(BlinkerState pressed) { // Wenn gleicher Modus -> aus, sonst neuen Modus if (currentState == pressed) currentState = OFF; else currentState = pressed; // Reset Blink-Phase damit beim Umschalten sofort sichtbar blinkState = false; lastBlinkTime = millis(); Serial.print("Mode -> "); switch(currentState) { case OFF: Serial.println("OFF"); break; case LEFT: Serial.println("LEFT"); break; case RIGHT: Serial.println("RIGHT"); break; case WARN: Serial.println("WARN"); break; } } void setup() { Serial.begin(115200); delay(10); Serial.println("ESP32 Fahrradblinker - Start"); // Buttons pinMode(btnLeft.pin, INPUT_PULLUP); pinMode(btnRight.pin, INPUT_PULLUP); pinMode(btnWarn.pin, INPUT_PULLUP); // LEDs pinMode(ledLeftPin, OUTPUT); pinMode(ledRightPin, OUTPUT); digitalWrite(ledLeftPin, LOW); digitalWrite(ledRightPin, LOW); // Initial lesen btnLeft.lastRead = digitalRead(btnLeft.pin); btnRight.lastRead = digitalRead(btnRight.pin); btnWarn.lastRead = digitalRead(btnWarn.pin); btnLeft.stableState = (btnLeft.lastRead == LOW); btnRight.stableState = (btnRight.lastRead == LOW); btnWarn.stableState = (btnWarn.lastRead == LOW); } void loop() { unsigned long now = millis(); // --- Buttons prüfen (Debounce) --- // readButton liefert true wenn sich der entprellte Zustand geändert hat if (readButton(btnLeft) && btnLeft.stableState) { // btnLeft.stableState == true bedeutet: gerade gedrückt geworden handlePress(LEFT); } if (readButton(btnRight) && btnRight.stableState) { handlePress(RIGHT); } if (readButton(btnWarn) && btnWarn.stableState) { handlePress(WARN); } // --- Blink-Logik --- if (currentState != OFF) { if (now - lastBlinkTime >= blinkInterval) { blinkState = !blinkState; lastBlinkTime = now; } } else { // Wenn OFF, LEDs aus blinkState = false; } // --- LEDs setzen gemäß Modus --- switch (currentState) { case LEFT: digitalWrite(ledLeftPin, blinkState ? HIGH : LOW); digitalWrite(ledRightPin, LOW); break; case RIGHT: digitalWrite(ledLeftPin, LOW); digitalWrite(ledRightPin, blinkState ? HIGH : LOW); break; case WARN: digitalWrite(ledLeftPin, blinkState ? HIGH : LOW); digitalWrite(ledRightPin, blinkState ? HIGH : LOW); break; case OFF: default: digitalWrite(ledLeftPin, LOW); digitalWrite(ledRightPin, LOW); break; } // Optional: weniger Serielle Ausgabe (nur zum Debug, kann auskommentiert werden) // Serial.print("BlinkState: "); // Serial.println(blinkState); }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
