//Benötigte Library einbinden
#include <Adafruit_NeoPixel.h>
// Pins festlegen
#define LED_PIN 6 // Pin für den NeoPixel-LED_Ring
#define BUTTON_PIN 2 // Pin für den Button
#define NUM_LEDS 16 // Anzahl der LEDs angegeben
#define POT_PIN A0 // Pin für das Potentiometer
#define LDR_PIN A1 // Pin für den Photoresistor (LDR)
// NeoPixel initialisieren
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
// Variablen für Entprellung und Schaltzustand
bool displayOn = true; // Zustand der Anzeige
long lastDebounceTime = 0; // Entprellzeit
long debounceDelay = 50; // Entprellung in Millisekunden
bool buttonPressed = false; // Signal, dass der Button gedrückt wurde
bool lastButtonState = HIGH; // Letzter Zustand des Buttons
// Variablen für die automatische Helligkeitsanpassung
int ldrValue = 0; // Wert des Lichtsensors
int maxBrightness = 255; // Maximale Helligkeit der LEDs
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), toggleDisplay, FALLING); // Interrupt
strip.begin();
strip.show(); // Alle LEDs ausschalten
}
void loop() {
// Entprellung und Anzeige-Schaltung verarbeiten
if (buttonPressed) {
long currentTime = millis();
if (currentTime - lastDebounceTime > debounceDelay) {
displayOn = !displayOn; // Anzeige umschalten
lastDebounceTime = currentTime;
buttonPressed = false; // Zurücksetzen des Flags nach der Verarbeitung
}
}
if (displayOn) {
int potValue = analogRead(POT_PIN); // Potentiometer-Wert einlesen
ldrValue = analogRead(LDR_PIN); // LDR-Wert einlesen
updateDisplay(potValue); // LED-Anzeige aktualisieren
} else {
strip.clear(); // Alle LEDs ausschalten
strip.show();
}
}
// Funktion zur Aktualisierung der LED-Anzeige basierend auf der Ruderlage
void updateDisplay(int potValue) {
strip.clear();
// Berechnung der Anzahl der LEDs, die leuchten sollen
int numLedsToLight = map(potValue, 0, 1023, 0, NUM_LEDS);
// Berechnung der Helligkeit basierend auf dem LDR-Wert
// Der LDR-Wert geht von 0 (sehr dunkel) bis 1023 (sehr hell). Wir invertieren diesen Wert,
// sodass ein niedrigerer LDR-Wert (wenig Licht) eine geringere Helligkeit ergibt.
int brightness = map(ldrValue, 1023, 0, maxBrightness / 4, maxBrightness); // Helligkeit anpassen
// LEDs je nach Ruderlage und Helligkeit ansteuern
for (int i = 0; i < numLedsToLight; i++) {
if (i < NUM_LEDS / 2) {
strip.setPixelColor(i, strip.Color(0, brightness, 0)); // Grün für Steuerbord
} else {
strip.setPixelColor(i, strip.Color(brightness, 0, 0)); // Rot für Backbord
}
}
strip.show(); // LEDs aktualisieren
}
// Interrupt-Service-Routine (ISR) zur Entprellung und Umschaltung der Anzeige
void toggleDisplay() {
// Entprellung sicherstellen, indem wir nur dann einen Tastendruck registrieren, wenn er länger als die Entprellzeit ist
if (millis() - lastDebounceTime > debounceDelay) {
buttonPressed = true; // Button wurde gedrückt
lastDebounceTime = millis(); // Entprellung starten
}
}