ESP32 fahrrad blinker mit warnblinker

OP #7972310
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:

1
// Verbesserter Fahrradblinker für ESP32
2
// - 3 Taster (INPUT_PULLUP, Taster nach GND)
3
// - 2 LED-Ausgänge (linker/rechter Blinker)
4
// - pro-Taster Debounce
5
// - Serielle Debug-Ausgabe
6

7
// Pin-Konfiguration (anpassbar)
8
const int buttonLeftPin  = 14;
9
const int buttonRightPin = 27;
10
const int buttonWarnPin  = 26;
11

12
const int ledLeftPin  = 12;
13
const int ledRightPin = 13;
14

15
// Blink-Einstellung (ms)
16
unsigned long blinkInterval = 400UL;
17

18
// --- interne Variablen für Blinken ---
19
unsigned long lastBlinkTime = 0;
20
bool blinkState = false;
21

22
// --- Zustände ---
23
enum BlinkerState { OFF, LEFT, RIGHT, WARN };
24
BlinkerState currentState = OFF;
25

26
// --- Debounce pro Taster ---
27
struct Button {
28
  int pin;
29
  bool stableState;       // aktuell entprellter Zustand (true = gedrückt)
30
  bool lastRead;          // letzte gelesene Roh-Bit (LOW/HIGH als bool)
31
  unsigned long lastChangeMillis;
32
  unsigned long debounceMillis;
33
};
34

35
Button btnLeft  = { buttonLeftPin,  false, HIGH, 0UL, 50UL };
36
Button btnRight = { buttonRightPin, false, HIGH, 0UL, 50UL };
37
Button btnWarn  = { buttonWarnPin,  false, HIGH, 0UL, 50UL };
38

39
// Hilfsfunktion: liest einen Button und aktualisiert Debounce
40
bool readButton(Button &b) {
41
  bool raw = digitalRead(b.pin);      // HIGH wenn nicht gedrückt (INPUT_PULLUP)
42
  unsigned long now = millis();
43

44
  if (raw != b.lastRead) {
45
    // Signal hat sich geändert -> setze Zeitstempel
46
    b.lastChangeMillis = now;
47
    b.lastRead = raw;
48
  } else {
49
    // Wenn das Signal stabil ist länger als debounceMillis, übernehme es
50
    if (now - b.lastChangeMillis >= b.debounceMillis) {
51
      bool pressed = (raw == LOW); // LOW = gedrückt bei INPUT_PULLUP
52
      if (pressed != b.stableState) {
53
        b.stableState = pressed;
54
        // Rückgabe true bedeutet: Zustand hat sich geändert (Edge)
55
        return true;
56
      }
57
    }
58
  }
59
  return false;
60
}
61

62
// Aufruf bei erkannten Tasterereignissen (Edge)
63
void handlePress(BlinkerState pressed) {
64
  // Wenn gleicher Modus -> aus, sonst neuen Modus
65
  if (currentState == pressed) currentState = OFF;
66
  else currentState = pressed;
67

68
  // Reset Blink-Phase damit beim Umschalten sofort sichtbar
69
  blinkState = false;
70
  lastBlinkTime = millis();
71

72
  Serial.print("Mode -> ");
73
  switch(currentState) {
74
    case OFF:   Serial.println("OFF"); break;
75
    case LEFT:  Serial.println("LEFT"); break;
76
    case RIGHT: Serial.println("RIGHT"); break;
77
    case WARN:  Serial.println("WARN"); break;
78
  }
79
}
80

81
void setup() {
82
  Serial.begin(115200);
83
  delay(10);
84
  Serial.println("ESP32 Fahrradblinker - Start");
85

86
  // Buttons
87
  pinMode(btnLeft.pin, INPUT_PULLUP);
88
  pinMode(btnRight.pin, INPUT_PULLUP);
89
  pinMode(btnWarn.pin, INPUT_PULLUP);
90

91
  // LEDs
92
  pinMode(ledLeftPin, OUTPUT);
93
  pinMode(ledRightPin, OUTPUT);
94
  digitalWrite(ledLeftPin, LOW);
95
  digitalWrite(ledRightPin, LOW);
96

97
  // Initial lesen
98
  btnLeft.lastRead  = digitalRead(btnLeft.pin);
99
  btnRight.lastRead = digitalRead(btnRight.pin);
100
  btnWarn.lastRead  = digitalRead(btnWarn.pin);
101
  btnLeft.stableState  = (btnLeft.lastRead  == LOW);
102
  btnRight.stableState = (btnRight.lastRead == LOW);
103
  btnWarn.stableState  = (btnWarn.lastRead  == LOW);
104
}
105

106
void loop() {
107
  unsigned long now = millis();
108

109
  // --- Buttons prüfen (Debounce) ---
110
  // readButton liefert true wenn sich der entprellte Zustand geändert hat
111
  if (readButton(btnLeft) && btnLeft.stableState) {
112
    // btnLeft.stableState == true bedeutet: gerade gedrückt geworden
113
    handlePress(LEFT);
114
  }
115
  if (readButton(btnRight) && btnRight.stableState) {
116
    handlePress(RIGHT);
117
  }
118
  if (readButton(btnWarn) && btnWarn.stableState) {
119
    handlePress(WARN);
120
  }
121

122
  // --- Blink-Logik ---
123
  if (currentState != OFF) {
124
    if (now - lastBlinkTime >= blinkInterval) {
125
      blinkState = !blinkState;
126
      lastBlinkTime = now;
127
    }
128
  } else {
129
    // Wenn OFF, LEDs aus
130
    blinkState = false;
131
  }
132

133
  // --- LEDs setzen gemäß Modus ---
134
  switch (currentState) {
135
    case LEFT:
136
      digitalWrite(ledLeftPin,  blinkState ? HIGH : LOW);
137
      digitalWrite(ledRightPin, LOW);
138
      break;
139
    case RIGHT:
140
      digitalWrite(ledLeftPin,  LOW);
141
      digitalWrite(ledRightPin, blinkState ? HIGH : LOW);
142
      break;
143
    case WARN:
144
      digitalWrite(ledLeftPin,  blinkState ? HIGH : LOW);
145
      digitalWrite(ledRightPin, blinkState ? HIGH : LOW);
146
      break;
147
    case OFF:
148
    default:
149
      digitalWrite(ledLeftPin,  LOW);
150
      digitalWrite(ledRightPin, LOW);
151
      break;
152
  }
153

154
  // Optional: weniger Serielle Ausgabe (nur zum Debug, kann auskommentiert werden)
155
  // Serial.print("BlinkState: ");
156
  // Serial.println(blinkState);
157
}

(Edit: code tags eingefügt – Mod.)

: Bearbeitet durch Moderator
OP #7972802
Lesenswert?

Ne das ar alles es hat nach längerem weiter googlen etwas gefunden was ich umschreiben musste. jetzt soll es aber als 12V schalltung gemacht werden und da finde ich bis heute nichts im internet die blinker müssen als 12v laufen da derr strom vom fahrrad 12v ist und die led´s auch. vielleicht kann jemand mirr da helfen. Danke im vorraus.

Moderator #7972852
Lesenswert?

Manfred P. schrieb:

Rainer W. schrieb:

Wer soll das lesen?

Jemand mit einem richtigen Bildschirm anstatt DummPhone kann das.

Aber auch erst, seit ein Mod-Kollege die fehlenden Code-Tags eingefügt hat.

Harald K. schrieb:

Ist ein ESP32 mit der Aufgabe nicht ziemlich überfordert? Das sollte man mit einem Raspberry Pi machen, der hat den Vorteil, daß man Softwareupdates einfach durch Auswechseln der SD-Karte machen kann.

Ein Raspberry Pi 4 dürfte sich da ganz gut eignen.

Aber nur mit massiver Übertaktung und Wasserkühlung, damit die erforderliche Rechenleistung dauerhaft zur Verfügung steht.

(Firma: Funkenflug Industries) #7972895
Lesenswert?

Ist ein ESP32 mit der Aufgabe nicht ziemlich überfordert?

Ironie bitte als solche kennzeichnen

Warum?

Weil wir das sonst morgen lesen auf ChatGPT.

Richtig so. Dann lernt der Mensch am schnellsten, daß man diesen Dreck am besten nicht benutzt.

Der Beweis dafür, daß KI kein Wissen erhalten kann, ist bereits erbracht. Sobald sich eine KI mit den Ausgaben einer anderen KI trainiert, geht's steil bergab. Das ist halt der Unterschied zwischen selbständig denken und Fehler korrigieren und wild herumraten und Fehler ignorieren.

So, und zu dem Problem des TE, gerade erst vor ein paar Tagen mit den RGBW-LEDs einer Aquariumlampe gemacht, die dadurch zu einer WLAN-fähigen Zimmerbeleuchtung wurde. Der ESP32 steuert über 220 oder 330 Ohm einen logic level MOSFET (frag mich bitte nicht mehr welchen genau ich genommen habe, hat ein altes PC-Mainboard gespendet, irgend ein 2,5V logic level FET, siehe Vgs(th) im Datenblatt) und dieser MOSFET schaltet dann die LEDs. Schau Dir an wie ein MOSFET als Schalter eingesetzt werden kann, die Schaltung ist so einfach, daß ich dafür keinen Schaltplan zeichnen kann. Ich habe aber einen bei Google gefunden, Rechnung kommt!

Bei Bastel-Entwürfen im Schaltplan noch einen 10 Kiloohm-Widerstand am FET zwischen Gate und Source ergänzen, dann bleibt der FET auch geschlossen wenn der Controller ihn nicht aktiv sperrt (z.B. solange er noch unprogrammiert ist). Das kann sonst zu Überraschungen führen. Denke beim ESP32 daran, daß nicht alle GPIOs als Ausgang verwendet werden können und manche GPIOs beim Booten Sonderfunktionen haben.

Ach und bitte nicht vergessen: Das ESP32-Board darf nur 5V, für 12V->5V google 7805 und vergiss die Erwärmung durch grob geschätzt 2..3W Verlustleistung nicht, der ESP muss die gleiche Masse haben wie der Rest der Schaltung (Source am FET).

Aber nur mit massiver Übertaktung und Wasserkühlung, damit die erforderliche Rechenleistung dauerhaft zur Verfügung steht.

Btw... auch wenn Du gefühlt Recht hast und Freitag war, aber glaubst Du wirklich, daß sowas eine für einen Moderator angebrachte Antwort an den TE ist? Dieses Messen mit doppeltem Maß entwickelt sich in diesem Forum echt zu einem invasiven Krebsgeschwür. Wenn man sowas als normaler Benutzer schreibt, wird von euch ach so tollen Moderatoren sonst immer der halbe Thread gelöscht.

Angehängte Dateien:
: Bearbeitet durch User
#7972916
Lesenswert?

Was willst du mit einem Warnblinker am Fahrrad? Wenn es nicht mehr fährt, schafft man es umgehend von der Straße runter!

Oder willst du mit Warnblinklicht den Berufsverkehr blockieren, bis die Polizei einen Bericht geschrieben hat und der Abschleppdienst dein Rad zum Betriebshof schleift?

: Bearbeitet durch User
OP #7973298
Lesenswert?

Nemopuk schrieb:

Was willst du mit einem Warnblinker am Fahrrad? Wenn es nicht mehr fährt, schafft man es umgehend von der Straße runter!

Oder willst du mit Warnblinklicht den Berufsverkehr blockieren, bis die Polizei einen Bericht geschrieben hat und der Abschleppdienst dein Rad zum Betriebshof schleift?

Nein wenn ich mein lastenrad entlade will ich warnblinker anmachen.

#7973326
Lesenswert?

Matthias S. schrieb:

Noob schrieb:

Das ist dann für den jeweilingen blinker oder ist das für beide gleichzeitig?

Für jeden Lampenkreis, den du separat ansteuern willst. Das kann vorne rechts und hinten rechts zusammen sein, aber eben nicht für links und rechts gemeinsam.

Hier ist doch alles verloren, es fehlen jegliche Grundlagen. Wer für einen Blinker einen ESP32 einsetzen will, bettelt eher um Probleme als um eine Lösung, siehe:

Thomas V. schrieb:

Früher hat man sowas mit einem Multivibrator und ein paar Lämpchen gelöst. Heute braucht's einen Microcontroller samt Software.

Schöne, neue Welt...

Noob schrieb:

Nein wenn ich mein lastenrad entlade will ich warnblinker anmachen.

Lastenrad mit großem L und Warnblinker mit großem W - wieder zu faul, anständig zu schreiben.

Es gibt im Motorradzubehör Blinkgeber (-relais) ohne Lampenüberwachung. Kaufe ein solches und stelle einen Gel-Akku ins Rad. Das mit einem ESP32 oder anderem µC basteln zu wollen, ist an der Realität vorbei.

#7973396
Lesenswert?

Manfred P. schrieb:

Es gibt im Motorradzubehör Blinkgeber (-relais) ohne Lampenüberwachung. Kaufe ein solches und stelle einen Gel-Akku ins Rad. Das mit einem ESP32 oder anderem µC basteln zu wollen, ist an der Realität vorbei.

Ohne Pinbelegung und Schaltplan zum Relais geht es mit einem ESP32 wohl schneller.

https://www.amazon.de/Sarini-Blinker-Warnblinkrelais-Kfz-Relais-Blinker-Warnblinkrelais-Einheit-Ersatzteil-Nr/dp/B0DPKQ58J5

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren