#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object
// LED initialisieren
uint8_t ledPin = 9;
uint8_t brightness = 0; // wie hell die LED momentan ist
uint8_t fadeAmount = 5; // wie viele Punkte die Helligkeit bei jedem Schritt ändert
// Abstand (in Dezisekunden) zwischen Wechseln für die einzelnen Elemente
uint8_t distance0 = 1;
uint8_t distance1 = 1;
uint8_t distance2 = 1;
uint8_t distance3 = 1;
void setup() {
// Initialisiere Segmentanzeigen
byte numDigits = 4; // Anzahl der Module
byte digitPins[] = {10, 11, 12, 13}; // Auswahl-Pins für die Module
byte segmentPins[] = {0, 1, 2, 3, 4, 5, 6, 7}; // Pins der einzelnen Segmente
bool resistorsOnSegments = true; // Widerstände am gemeinsamen Pin der Module (Anode)
byte hardwareConfig = COMMON_ANODE; // Gemeinsame Anode
bool disableDecPoint = false; // Dezimalpunkt nutzen (true) oder nicht (false)
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
false, false, disableDecPoint);
sevseg.setBrightness(90);
// Initialisiere Zufallsgenerator
randomSeed(analogRead(0));
// Konfiguriere den LED-Pin als Ausgang
pinMode(ledPin, OUTPUT);
}
void loop() {
// Basiszähler initialisieren (zählt Millisekunden seit dem Start)
static unsigned long timer = millis();
static int deciSeconds = 0;
// alle 100ms (Wenn aktuelle Zeit (Millisekunden) - letzte Startzeit >= 100)
if (millis() - timer >= 100) {
timer += 100; // Basiszähler (Millisekunden) erhöhen (neue Startzeit)
deciSeconds++; // Aktionszähler (Dezisekunden) erhöhen
// random(256) wählt eine der 256 möglichen Elementkombinationen (2 (an oder aus) hoch 8 (Elemente))
// Jedes Element wird dann geändert, wenn die Anzahl der aktuellen Dezisekunden
// ohne Rest durch den zuvor bestimmten Zufallswert geteilt werden kann.
// D. h. bei einem Zufallswert von x trifft das Ereignis immer nach x Dezisekunden ein.
// x = 1: Änderung nach 1,2,3,4,5,6,7,8,9,10 Dezisekunden
// x = 2: Änderung nach 2,4,6,8,10 Dezisekunden
// x = 3: Änderung nach 3,6,9 Dezisekunden
// x = 4: Änderung nach 4,8 Dezisekunden
// x = 5: Änderung nach 5,10 Dezisekunden
// Element 1
if (deciSeconds % distance0 == 0) {
sevseg.setSegmentsDigit(0, random(256));
}
// Element 2
if (deciSeconds % distance1 == 0) {
sevseg.setSegmentsDigit(1, random(256));
}
// Element 3
if (deciSeconds % distance2 == 0) {
sevseg.setSegmentsDigit(2, random(256));
}
// Element 4
if (deciSeconds % distance3 == 0) {
sevseg.setSegmentsDigit(3, random(256));
}
// nach 1s
if (deciSeconds == 10) {
// Zähler zurücksetzen
deciSeconds=0;
// Zeiten zufällig festlegen, erster Wert Minimum, zweiter Wert Maximum
// Höheres Minimum (ab 1): Seltenere Wechsel
// Höheres Maximum (bis 5): Seltenere Wechsel, bis zu 2x pro Sekunde
// Höheres Maximum (ab 6, bis 11): Seltenere Wechsel, 1x pro Sekunde, unterschiedliche Zeitpunkte
distance0 = random(1,6);
distance1 = random(2,6);
distance2 = random(3,6);
distance3 = random(3,10);
}
// grüne LED pulsieren
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
analogWrite(ledPin, brightness);
}
// Display aktualisieren
sevseg.refreshDisplay();
}