#include "button.hpp"
enum class State : byte {LED_ON, LED_SWITCH_OFF, LED_FUNCTION_OFF};
struct LedData {
byte startPin;
byte maxNum;
byte num {0};
byte prevNum {1};
byte direction {-1};
unsigned long timeStamp;
State programState {State::LED_FUNCTION_OFF};
LedData (byte startPin_ = 2, byte maxNum_ = 1)
: startPin {startPin_}, maxNum {maxNum_} {}
};
// Globale Konstanten
constexpr byte potiPin {A0};
constexpr byte aButtonPin {11};
constexpr byte bButtonPin {12};
// Globale Variablen/Objekte
Button aButton {aButtonPin}; // Erzeuge Buttonobjekt für Pin 11
Button bButton {bButtonPin}; // Erzeuge Buttonobjekt für Pin 12
LedData ledData {5,1}; // deklarire Led Datentyp Startpin 5 Anzahl Pins 3 (5- 7).
LedData ledData2 {7,4}; // deklarire Led Datentyp Startpin 8 Anzahl Pins 3 (8-10).
// Forward-Deklaration(en) Funktion(en)
void checkState(Button&, LedData&);
void runningLight(int, LedData&);
void ledsOff(LedData&);
void initLedPins(LedData&);
void setup() {
Serial.begin(115200);
Serial.println("Start");
aButton.begin(); // Initialisiert den Button-Pin 11: Default ist Active Low (INPUT_PULLUP)
bButton.begin(); // Initialisiert den Button-Pin 12: Default ist Active Low (INPUT_PULLUP)
initLedPins(ledData);
initLedPins(ledData2);
}
void loop() {
checkState(aButton, ledData);
checkState(bButton, ledData2);
}
void checkState(Button& button, LedData& leds) {
if (button.tic() != ButtonState::P_NONE) {
switch (leds.programState) {
case State::LED_ON: leds.programState = State::LED_SWITCH_OFF; break;
case State::LED_FUNCTION_OFF: leds.programState = State::LED_ON; break;
}
}
switch(leds.programState) {
case State::LED_ON:
runningLight(map(analogRead(potiPin), 0, 1023, 1000, 5), leds);
break;
case State::LED_SWITCH_OFF:
ledsOff(leds);
leds.programState = State::LED_FUNCTION_OFF;
break;
}
}
void initLedPins(LedData& leds) {
for ( byte pin=leds.startPin ; pin < (leds.startPin+leds.maxNum); ++pin) {
pinMode(pin,OUTPUT);
}
}
void runningLight( int speed, LedData& leds) {
if (millis() - leds.timeStamp > speed) {
leds.timeStamp = millis();
if (leds.maxNum == 1) { // Wenn Datentyp nur für eine LED initialisiert wurde
digitalWrite(leds.startPin, !digitalRead(leds.startPin) ); // Nur die eine blinken lassen, ansonsten...
} else {
digitalWrite(leds.startPin + leds.num, HIGH);
digitalWrite(leds.startPin + leds.prevNum, LOW);
leds.prevNum = leds.num;
leds.num -= leds.direction;
if ((leds.num == leds.maxNum -1) || (!leds.num)) {
leds.direction *= -1;
}
}
}
}
void ledsOff(LedData& leds) {
if (leds.programState == State::LED_SWITCH_OFF) {
Serial.println("Switch LEDs off");
for ( byte pin = leds.startPin; pin < (leds.startPin + leds.maxNum); ++pin) {
digitalWrite(pin, LOW);
}
leds.prevNum = 1;
leds.direction = -1;
}
}