#include <Adafruit_NeoPixel.h>
#include <TimerOne.h>
#define TASTERPIN 3 // Interrupt-fähiger Pin für den Taster
#define RINGPIN 2
#define SENSORPIN A0
#define POTIPIN A1
Adafruit_NeoPixel LEDRing(16, RINGPIN, NEO_GRB + NEO_KHZ800);
volatile bool tasterGedrueckt = false; // Flag für Tasterdruck
volatile bool debounceAktiv = false; // Entprellstatus
volatile bool tasterZustand = HIGH; // Aktueller Zustand des Tasters
void ISR_Taster() {
if (!debounceAktiv) { // Nur ausführen, wenn nicht entprellt wird
bool aktuellerZustand = digitalRead(TASTERPIN); // Aktuellen Zustand lesen
if (aktuellerZustand == LOW && tasterZustand == HIGH) { // Nur bei Übergang HIGH -> LOW
debounceAktiv = true; // Entprellung aktivieren
tasterGedrueckt = true; // Tasterdruck registrieren
Timer1.start(); // Timer starten, um Entprellzeit zu beginnen
}
tasterZustand = aktuellerZustand; // Zustand aktualisieren
}
}
void resetDebounceFlag() {
debounceAktiv = false; // Entprellung beenden
Timer1.stop(); // Timer stoppen
}
void brightnessLEDRing(int a) {
int brightness = map(a, 0, 1023, 255, 0); // Luxwerte invertiert auf Helligkeit mappen
LEDRing.setBrightness(brightness);
LEDRing.show();
}
void rudderIndicator(int b) {
if (b >= 12 && b < 28) {
int numLEDs = map(b, 28, 12, 0, 8); // Map to 0-8 LEDs
for (int i = 0; i < 8; i++) {
if (i < numLEDs) {
LEDRing.setPixelColor(8 + i, 0, 255, 0); // Green LEDs on the right side
} else {
LEDRing.setPixelColor(8 + i, 0, 0, 0); // Turn off remaining LEDs on the right side
}
}
for (int i = 0; i < 8; i++) {
LEDRing.setPixelColor(7 - i, 0, 0, 0); // Turn off all LEDs on the left side
}
} else if (b > 28 && b <= 44) {
int numLEDs = map(b, 28, 44, 0, 8); // Map to 0-8 LEDs
for (int i = 0; i < 8; i++) {
if (i < numLEDs) {
LEDRing.setPixelColor(7 - i, 255, 0, 0); // Red LEDs on the left side
} else {
LEDRing.setPixelColor(7 - i, 0, 0, 0); // Turn off remaining LEDs on the left side
}
}
for (int i = 0; i < 8; i++) {
LEDRing.setPixelColor(8 + i, 0, 0, 0); // Turn off all LEDs on the right side
}
}
LEDRing.show();
}
void setup() {
pinMode(TASTERPIN, INPUT_PULLUP); // Taster mit Pullup-Widerstand
attachInterrupt(digitalPinToInterrupt(TASTERPIN), ISR_Taster, CHANGE); // Interrupt bei Änderung des Signals
Timer1.initialize(50000); // Timer auf 50 ms für Entprellzeit setzen
Timer1.attachInterrupt(resetDebounceFlag); // Callback für Timer
Timer1.stop(); // Timer zunächst stoppen
Serial.begin(9600);
LEDRing.begin();
for (int i = 0; i < 16; i++) {
LEDRing.setPixelColor(i, 0, 0, 0); // Clear LED ring
}
LEDRing.show();
}
void loop() {
static int zaehlwert = 0;
if (tasterGedrueckt) {
tasterGedrueckt = false; // Taster-Flag zurücksetzen
zaehlwert++;
Serial.println(zaehlwert);
}
if (zaehlwert % 2 == 1) {
int luxWert = map(analogRead(SENSORPIN), 0, 1023, 1023, 0);
brightnessLEDRing(luxWert);
int potiWert = analogRead(POTIPIN);
int voltWert = 44 - (potiWert * (44 - 12) / 1023.0);
rudderIndicator(voltWert);
} else {
for (int c = 0; c < 16; c++) {
LEDRing.setPixelColor(c, 0, 0, 0);
}
LEDRing.show();
}
}