/* Beispielcode für Arduino Mega – LED-Ansteuerung mit analogWrite statt digitalWrite
Hinweis: Die Bytepattern (z. B. in den Animationen classic(), sideFly(), leftRight())
bleiben
---------------------------------------------------------------------------*/
// Pins für die LEDs definieren (PWM-fähige Pins 2 bis 9)
const int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int numLeds = sizeof(ledPins) / sizeof(ledPins[0]);
// Pins für die zufällig blinkenden LEDs (analog verwendete Pins als digitale Ausgänge)
const int randomBlinkPins[] = {A2, A3, A4, A5, A6, A7};
const int numRandomBlinkPins = sizeof(randomBlinkPins) / sizeof(randomBlinkPins[0]);
void setup() {
// Alle LED-Pins initialisieren – analogWrite(VALUE) statt digitalWrite
for (int i = 0; i < numLeds; i++) {
pinMode(ledPins[i], OUTPUT);
analogWrite(ledPins[i], 0); // 0 entspricht LOW
}
// Auch die zufälligen Blink-Pins als Ausgänge initialisieren
for (int i = 0; i < numRandomBlinkPins; i++) {
pinMode(randomBlinkPins[i], OUTPUT);
analogWrite(randomBlinkPins[i], 0); // 0 entspricht LOW
}
// Zufallsgenerator initialisieren
randomSeed(analogRead(0));
}
void loop() {
// Zufälligen Funktionsaufruf zwischen classic(), blinkAll(), sideFly() und leftRight()
int functionToCall = random(0, 4);
switch (functionToCall) {
case 0:
classic();
break;
case 1:
blinkAll(5000, 200);
break;
case 2:
sideFly();
break;
case 3:
leftRight();
break;
}
delay(100); // Kurze Pause zwischen den Funktionsaufrufen
}
// Die folgenden Funktionen verwenden in ihren Animationen analogWrite statt digitalWrite.
// Dabei werden analoge Werte 0 (aus) und 255 (voll eingeschaltet) genutzt.
// Beispiel: klassische Animation
void classic() {
// Beispiel-Bytepattern (bitweise LED-Zustände)
byte patterns[] = {
B00000000, B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000,
B10000001, B10000010, B10000100, B10001000, B10010000, B10100000, B11000000, B11000001,
B11000010, B11000100, B11001000, B11010000, B11100000, B11100001, B11100010, B11100100,
B11101000, B11110000, B11110001, B11110010, B11110100, B11111000, B11111001, B11111010,
B11111100, B11111101, B11111110, B11111111
};
int numPatterns = sizeof(patterns) / sizeof(patterns[0]);
// Vorwärtsschaltung
for (int i = 0; i < numPatterns; i++) {
showPattern(patterns[i]);
delay(500);
// Falls das Pattern 0b11111111 erreicht wird, wird ein Flackereffekt aufgerufen.
if (patterns[i] == B11111111) {
flickerEffect(5000);
}
}
// Rückwärtsschaltung
for (int i = numPatterns - 1; i >= 0; i--) {
showPattern(patterns[i]);
delay(500);
}
}
// Funktion, um ein Bytepattern auf die LEDs zu schicken
void showPattern(byte pattern) {
for (int i = 0; i < numLeds; i++) {
// Prüfe, ob das i-te Bit gesetzt ist:
if (pattern & (1 << i)) {
analogWrite(ledPins[i], 255); // LED an (entspricht HIGH)
} else {
analogWrite(ledPins[i], 0); // LED aus (entspricht LOW)
}
}
}
// Funktion blinkAll: Alle LEDs schalten ein und aus
void blinkAll(unsigned long duration, unsigned int interval) {
unsigned long startTime = millis();
while (millis() - startTime < duration) {
// Alle LEDs einschalten
for (int i = 0; i < numLeds; i++) {
analogWrite(ledPins[i], 255);
}
delay(interval);
// Alle LEDs ausschalten
for (int i = 0; i < numLeds; i++) {
analogWrite(ledPins[i], 0);
}
delay(interval);
}
}
// Beispiel: seitlicher "Fly"-Effekt (sideFly)
void sideFly() {
// Beispiel-Bytepattern für einen seitlichen Effekt
byte patterns[] = {
B00000000, B10000001, B01000010, B00100100, B00011000, B10011001, B01011010, B00111100, B10111101,
B01111110, B11111111
};
int numPatterns = sizeof(patterns) / sizeof(patterns[0]);
// Vorwärtsanimation
for (int i = 0; i < numPatterns; i++) {
showPattern(patterns[i]);
delay(300);
if (patterns[i] == B11111111) {
flickerEffect(5000);
}
}
// Rückwärtsanimation
for (int i = numPatterns - 1; i >= 0; i--) {
showPattern(patterns[i]);
delay(300);
}
}
// Beispiel: links-rechts Effekt (leftRight)
void leftRight() {
// Zwei Muster, die links und rechts symbolisieren
byte patternLeft = B00111111;
byte patternRight = B11100000;
// Zehnmal abspielen (5 mal links, 5 mal rechts)
for (int i = 0; i < 5; i++) {
showPattern(patternLeft);
delay(600);
showPattern(patternRight);
delay(600);
}
// Zum Abschluss blinkt hier alle LEDs kurz gemeinsam
blinkAll(3000, 200);
}
// Flacker-Effekt: zufälliges kurzes Aus- und Einschalten einzelner LEDs
void flickerEffect(int duration) {
unsigned long startTime = millis();
while (millis() - startTime < duration) {
// Wähle zufällig zwischen 1 und 5 LEDs aus, die flackern sollen
int numBlinkingLeds = random(1, 6);
for (int k = 0; k < numBlinkingLeds; k++) {
int randomLed = random(0, numLeds);
analogWrite(ledPins[randomLed], 0); // LED aus
delay(random(20, 150));
analogWrite(ledPins[randomLed], random(120, 181)); //LED an
delay(random(50, 600));
}
}
}