Forum: Fahrzeugelektronik ESP32 fahrrad blinker mit warnblinker


von Noob (noobcontroller)


Lesenswert?

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);
}

von Stephan S. (uxdx)


Lesenswert?

und ... ???

von Ralf X. (ralf0815)


Lesenswert?

Stephan S. schrieb:
> und ... ???

Vielleicht wars das schon? 'gg

von Michael W. (miks)


Angehängte Dateien:

Lesenswert?

Und noch was (siehe Bild)!

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
Noch kein Account? Hier anmelden.