// Klasse, welche die "bin ich jetzt dran" Funktion kapselt
class TimedAction {
public:
void init(int delay) {
m_delay = delay;
m_nextActiveMillis = millis();
}
void reset() {
m_nextActiveMillis = millis();
}
bool isActive() {
if (millis() < m_nextActiveMillis)
return false; // Aktiv-Zeitpunkt noch nicht erreicht
// nächsten Zeitpunkt festlegen
m_nextActiveMillis = millis() + m_delay;
return true; // Jetzt sind wir aktiv
}
private:
unsigned long m_nextActiveMillis = 0; // Nächster Aktualisierungszeitpunkt
int m_delay = 50; // Wartezeit zwischen Anpassungen in ms
};
// Klasse, welche die Funktionalität für das Ein-/Ausblenden einer LED kapselt
class LEDFade {
public:
void init(int pin, bool direction, int value, int delay, int stepSize) {
// Membervariablen initialisieren
m_pin = pin;
m_direction = direction;
m_value = value;
m_stepSize = stepSize;
m_timer.init(delay);
pinMode(m_pin, OUTPUT); // Als Ausgabe-PIN festlegen
}
// Diese Funktion setzt einen neuen Helligkeitswert für die LED
void setValue(int value) {
if (value < 0)
value = 0;
if (value > 255)
value = 255;
m_value = value;
// Quadratische Funktion verwenden, um gleichmäßig die
// Helligkeit der LED zu erhöhen
// v(x) = x² * 255 / 255² = x²/255
analogWrite(m_pin, m_value*m_value/255);
}
void fade() {
// Fehlerbehandlung
if (m_pin == 0)
return;
if (!m_timer.isActive())
return; // sind gerade nicht aktiv
// wenn wir die Helligkeit erhöhen
if (m_direction) {
m_value += m_stepSize;
// am oberen Ende begrenzen und Richtung wechseln
if (m_value >= 255) {
m_value = 255;
m_direction = false; // ab jetzt dunkler werden
}
}
else {
// sonst, wenn wir die Helligkeit reduzieren
m_value -= m_stepSize;
// am unteren Ende begrenzen und Richtung wechseln
if (m_value <= 0) {
m_value = 0;
m_direction = true; // ab jetzt heller werden
}
}
// Neuen Helligkeitswert setzen
setValue(m_value);
}
private:
int m_pin = 0; // PIN der LED
bool m_direction = true; // true -> Helligkeit erhöhen
int m_value = 0; // Aktuelle Helligkeit
int m_stepSize = 1; // Schrittgröße
TimedAction m_timer; // Enthält die "bin ich dran" Funktionalität
};
// Variablen für die beiden LEDs
LEDFade led1;
LEDFade led2;
void setup() {
// die Klassenvariablen mit den jeweiligen Parametern initialisieren
// PIN 9: anfänglich aufblenden, Startwert 0, 250 ms Wartezeit, und
// 25er Schritte machen
led1.init(9, true, 0, 250, 25);
// PIN 10 etwas anders konfiguriert
led2.init(10, false, 255, 30, 5);
}
// die Hauptschleife ist nun sehr schön aufgeräumt und minimalistisch
void loop() {
led1.fade();
led2.fade();
}