Hallo knifezange
Hier kommt eine Sketch für deinen Cafe Racer.
Ich habe eine Ausflug in die OOP unternommen und die Aufgabenstellung klassenlos in Objekte und Methoden überführt. Jedes ARRAY und STRUCT bildet ein Objekt, das jeweils durch eine Methode zum Bearbeiten der Button und Blinker abgefakelt wird.
Die Aktionen für Hupe, Blinker und Fernlicht sind in User Functions programmiert, die über FunctionPointer aus dem Buttonhandler angesprungen werden. So kannst du einfach die benötigten Funktionen annpassen ohne das weitere Änderungen im Code notwendig sind.
Viel Spass beim Ausprobieren und Spielen.
// https://forum.arduino.cc/t/hupe-blinker-fernlicht-steuern-fur-cafe-racer/913534
enum {Hupe, BlinkerLinks, BlinkerRechts, Fernlicht, BlinkerKontrolle, FernlichtKontrolle};
constexpr byte InputPins[] {A0, A1, A2, A3};
constexpr byte OutputPins[] {2, 3, 4, 5, 6, 7};
constexpr byte ButtonStates {2};
constexpr unsigned long DebounceTime {20};
enum {LinksBlink, RechtsBlink, KontrollBlink};
constexpr unsigned long BlinkTime {666};
unsigned long currentTime;
struct TIMER {
unsigned long stamp;
unsigned long duration;
};
struct BUTTON {
byte name_;
byte pin;
bool statusQuo;
TIMER time_;
} buttons[] {
{Hupe, InputPins[Hupe], false, 0, DebounceTime,},
{BlinkerLinks, InputPins[BlinkerLinks], false, 0, DebounceTime},
{BlinkerRechts, InputPins[BlinkerRechts], false, 0, DebounceTime},
{Fernlicht, InputPins[Fernlicht], false, 0, DebounceTime},
};
struct BLINK {
byte pin;
bool control_;
TIMER time_;
} blinker[] {
{OutputPins[BlinkerLinks], false, 0, BlinkTime},
{OutputPins[BlinkerRechts], false, 0, BlinkTime},
{OutputPins[BlinkerKontrolle], false, 0, BlinkTime},
};
void start_(int name_) {
blinker[name_].time_.stamp = currentTime;
blinker[name_].control_ = true;
digitalWrite(blinker[name_].pin, HIGH);
}
void stopp_(int name_) {
blinker[name_].control_ = false;
digitalWrite(blinker[name_].pin, LOW);
}
void (*userFunctions[sizeof(InputPins)][ButtonStates])() {
{hupeReleased, hupePressed},
{blinkerLinksReleased, blinkerLinksPressed},
{blinkerRechtsReleased, blinkerRechtsPressed},
{fernlichtReleased, fernlichtPressed},
};
//
// ------------------- USER FUNCTIONS -------------------
//
void hupePressed() {
digitalWrite(OutputPins[Hupe], HIGH);
}
void hupeReleased() {
digitalWrite(OutputPins[Hupe], LOW);
}
void blinkerLinksPressed() {
start_(LinksBlink);
start_(KontrollBlink);
}
void blinkerLinksReleased() {
stopp_(LinksBlink);
stopp_(KontrollBlink);
}
void blinkerRechtsPressed() {
start_(RechtsBlink);
start_(KontrollBlink);
}
void blinkerRechtsReleased() {
stopp_(RechtsBlink);
stopp_(KontrollBlink);
}
void fernlichtPressed() {
digitalWrite(OutputPins[Fernlicht], !digitalRead(OutputPins[Fernlicht]));
digitalWrite(OutputPins[FernlichtKontrolle], !digitalRead(OutputPins[FernlichtKontrolle]));
}
void fernlichtReleased() {
}
//
// -------------------------------------------------------
//
void setup() {
Serial.begin(9600);
Serial.println(F("Begin"));
for (auto InputPin : InputPins) pinMode(InputPin, INPUT_PULLUP);
for (auto OutputPin : OutputPins) pinMode(OutputPin, OUTPUT);
// LED test
for (auto OutputPin : OutputPins) digitalWrite(OutputPin, HIGH), delay(100);
for (auto OutputPin : OutputPins) digitalWrite(OutputPin, LOW), delay(100);
}
void loop() {
currentTime = millis();
digitalWrite(LED_BUILTIN,(millis()/500)%2);
for (auto &button_ : buttons) {
if (currentTime - button_.time_.stamp >= button_.time_.duration) {
button_.time_.stamp = currentTime;
bool stateNew = !digitalRead(button_.pin);
if (button_.statusQuo != stateNew) {
button_.statusQuo = stateNew;
userFunctions[button_.name_][stateNew]();
}
}
}
for (auto &blink_ : blinker) {
if ((currentTime - blink_.time_.stamp >= blink_.time_.duration) && blink_.control_) {
blink_.time_.stamp = currentTime;
digitalWrite(blink_.pin, !digitalRead(blink_.pin));
}
}
}
Ich wünsche ein geschmeidiges Wochenende und viel Spass beim Programmieren in C++.