/*
Forum: https://forum.arduino.cc/t/hilfe-gesucht-problem-mit-dem-code-kein-fehler-aber-keine-funktion/1403916
Wokwi: https://wokwi.com/projects/440180756537835521
2025/08/24
ec2021
Wenn alle Texte mit dem F()-Makro in den Flash-Speicher verschoben werden, können bis zu 106 Leds angesteuert werden.
Ab der 107. Led führen Speicherprobleme zu einem Reset.
*/
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
#include <Adafruit_SSD1306.h>
#ifdef __AVR__
#include <Wire.h>
#endif
const int LED_PIN = 6;
const int NUM_LEDS = 106;
const int POWER_BUTTON_PIN = 2;
const int COLOR_BUTTON_PIN = 3;
const int BRIGHTNESS_BUTTON_PIN_PLUS = 7; // Helligkeit rauf - Taster
const int BRIGHTNESS_BUTTON_PIN_MINUS = 8; // Helligkeit runter - Taster
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
int brightness = 128;
int maxBrightness = 255;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
bool powerOn = false;
bool lauflichtAktiv = false;
int lauflichtPosition = 0;
unsigned long letzteAktion = 0;
unsigned long letzteFarbAktion = 0;
unsigned long letzteHelligkeitsAktion = 0;
int farbe = 0;
void changeBrightness(int delta) {
brightness += delta;
if (brightness > 128) {
brightness = 128;
} else if (brightness < 5) {
brightness = 5;
}
strip.setBrightness(brightness);
strip.show();
}
void setup() {
Serial.begin(9600);
Serial.println(F("Setup läuft"));
strip.begin();
strip.show();
strip.setBrightness(brightness);
pinMode(POWER_BUTTON_PIN, INPUT_PULLUP);
pinMode(COLOR_BUTTON_PIN, INPUT_PULLUP);
pinMode(BRIGHTNESS_BUTTON_PIN_PLUS, INPUT_PULLUP);
pinMode(BRIGHTNESS_BUTTON_PIN_MINUS, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Serial.println(F("Display initialisiert"));
display.display();
Serial.println(F("Display display aufgerufen"));
delay(100);
display.clearDisplay();
delay(100);
Serial.println(F("Display clearDisplay aufgerufen"));
delay(100);
Serial.println(F("Display wird konfiguriert..."));
display.setTextSize(1);
delay(100);
Serial.println(F("Textgröße gesetzt"));
display.setTextColor(SSD1306_WHITE);
Serial.println(F("Textfarbe gesetzt"));
// bis hier läuft der Code mit Debug Ausgabe, dann kommt nichts mehr.
// Die Delays habe ich nachträglich eingebaut, da beim Debuggen mitten
// in der Ausgabe abgebrochen wurde - bei "Display clearDisplay aufgerufen"
// kam nur mehr "Disp". Nach den Delays kam das programm bis "Textgröße gesetzt".
// Weiter kam ich nicht, auch mit mehr Delay nicht.
delay(100);
display.setCursor(5, 12);
delay(100);
display.println(F("Status: HALLO LUKAS!"));
delay(100);
Serial.println(F("Text auf Display geschrieben"));
display.display();
Serial.println(F("Display display erneut aufgerufen"));
}
void loop() {
Serial.println(F("Loop läuft"));
if (digitalRead(POWER_BUTTON_PIN) == LOW && millis() - letzteAktion > 200) {
letzteAktion = millis();
powerOn = !powerOn;
if (powerOn) {
lauflichtAktiv = true;
lauflichtPosition = 0;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("Status: EIN"));
display.display();
} else {
lauflichtAktiv = false;
strip.clear();
strip.show();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("Status: AUS"));
display.display();
}
}
if (digitalRead(COLOR_BUTTON_PIN) == LOW && millis() - letzteFarbAktion > 200 && !lauflichtAktiv) {
letzteFarbAktion = millis();
farbe = (farbe + 1) % 6;
lauflichtAktiv = true;
lauflichtPosition = 0;
}
if (digitalRead(BRIGHTNESS_BUTTON_PIN_PLUS) == LOW && millis() - letzteHelligkeitsAktion > 200) {
Serial.println(F("Helligkeitsbutton + gedrückt"));
letzteHelligkeitsAktion = millis();
brightness += 20;
if (brightness > 100) {
brightness = 100;
}
strip.setBrightness(map(brightness, 0, 100, 0, 255));
}
if (digitalRead(BRIGHTNESS_BUTTON_PIN_MINUS) == LOW && millis() - letzteHelligkeitsAktion > 200) {
letzteHelligkeitsAktion = millis();
brightness -= 20;
if (brightness < 5) {
brightness = 5;
}
strip.setBrightness(map(brightness, 0, 100, 0, 255));
}
if (powerOn && lauflichtAktiv) {
switch (farbe) {
case 0:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 0, 0)); // Rot
break;
case 1:
strip.setPixelColor(lauflichtPosition, strip.Color(0, 255, 0)); // Grün
break;
case 2:
strip.setPixelColor(lauflichtPosition, strip.Color(0, 255, 255)); // Cyan
break;
case 3:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 0, 255)); // Magenta
break;
case 4:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 255, 0)); // Gelb
break;
case 5:
strip.setPixelColor(lauflichtPosition, strip.Color(255, 255, 255)); // Weiß
break;
}
strip.show();
lauflichtPosition++;
if (lauflichtPosition >= NUM_LEDS) {
lauflichtAktiv = false;
}
delay(50);
}
}