#include "led.hpp"
//
// Konstanten
//
constexpr byte potiPin {A0};
//
// Globale Variablen
//
Led led1; // On Board LED (kein Lauflicht)
Led led2(12); // Led an Pin 12 (kein Lauflicht)
Led led3(2); // Lauflicht 1. LED Pin 2
Led led4(4); // Lauflicht 2. LED Pin 4
Led led5(6); // Lauflicht 3. LED Pin 6
Led led6(8); // Lauflicht 4. LED Pin 8
// Achtung ! Pointer auf die Objekte. Spart Speicherplatz !
Led *ledArray[] {&led3, &led4, &led5, &led6}; // LEDs für Lauflich in Array zusammenfassen
constexpr byte LED_COUNT {sizeof(ledArray)/sizeof(Led*)}; // Größe des Arrays speichern
byte ledIndex {0}; // Indexvariable für Array
byte step {1}; // Schrittvariable für Vor- und Rücklauf des Lauflichtes
//
// Main Programm
//
void setup() {
Serial.begin(115200);
//Serial.println(sizeof(ledArray));
// Einzelne LEDs für Blinken initialisieren
led1.begin(BlinkStatus::ON); // LED1 leuchtet sofort nach dem Programmstart
// Default Blinkstatus für den Start ist BlinkStatus::OFF und muss nicht angegeben werden.
led2.begin(); // LED2 leuchtet erst nach 2,5 Sekunden zum Ersten mal
// Lauflicht-LEDs aus Array initialisieren
// BlinkStatus::WAIT für die Loslaufsynchronisierung
for (auto leds : ledArray) {
leds->begin(BlinkStatus::WAIT);
}
}
void loop() {
led1(2000); // Onboard LED alle zwei Sekunden blinken lassen
led2(2500); // LED 2 an Pin 12 alle 2,5 Sekunden blinken lassen
runningLight(); // Lauflicht steuern.
}
void runningLight() {
unsigned int speed = map(analogRead(potiPin), 0, 1023, 1000, 50);
switch((*ledArray[ledIndex])(speed)) {
case BlinkStatus::WAIT:
ledArray[ledIndex]->setStatus(BlinkStatus::ON);
break;
case BlinkStatus::OFF:
ledIndex += step;
if (ledIndex > (LED_COUNT-1)) { // Achtung step = 0-1 wird zu 255 was aber > LED_COUNT - 1 ist
step = step * (-1); // Also passt das, Laufrichtung umkehren.
ledIndex +=step;
}
break;
default:
break;
}
}