//Initialisierung Lauflicht von oben int tspeed = 7; //Geschwindigkeit int tbarmin = 2; //Anzahl Bars min int tbarmax = 8; //Anzahl Bars max int tspacemin = 25; //Anzahl keine LED zwischen Bars min int tspacemax = 200; //Anzahl keine LED zwischen Bars max int tledmin = 2; //LED pro Bar min int tledmax = 7; //LED pro Bar max int tled = 0; //LED pro Bar int tgapmin = 0; //Gap zwischen Bar min int tgapmax = 4; //Gap zwischen Bar max int tgap = 0; //Gap zwischen Bar int tgapm = 2; //Multiplikator Länge Gap int tt = 0; //Timer bis nächstes Event int tbari = 0; //BARs übrig bool ton = false; //Ausgabe LED unsigned long top = 0; //Ausgabe //Initialisierung Lauflicht von unten int bspeed = 11; //Geschwindigkeit int bbarmin = 2; //Anzahl Bars min int bbarmax = 8; //Anzahl Bars max int bspacemin = 50; //Anzahl keine LED zwischen Bars min int bspacemax = 400; //Anzahl keine LED zwischen Bars max int bledmin = 2; //LED pro Bar min int bledmax = 5; //LED pro Bar max int bled = 0; //LED pro Bar int bgapmin = 2; //Gap zwischen Bar min int bgapmax = 4; //Gap zwischen Bar max int bgap = 0; //Gap zwischen Bar int bgapm = 2; //Multiplikator Länge Gap int bt = 0; //Timer bis nächstes Event int bbari = 0; //BARs übrig bool bon = false; //Ausgabe LED unsigned long bottom = 0; //Ausgabe //Initialisierung Lauflicht von mitte int mspeed = 17; //Geschwindigkeit int mbarmin = 8; //Anzahl Bars min int mbarmax = 16; //Anzahl Bars max int mspacemin = 40; //Anzahl keine LED zwischen Bars min int mspacemax = 300; //Anzahl keine LED zwischen Bars max int mled = 1; //LED pro Bar int mgap = 0; //Gap zwischen Bar int mt = 0; //Timer bis nächstes Event int mbari = 0; //BARs übrig bool mon = false; //Ausgabe LED unsigned long middle1 = 0; //Ausgabe unsigned long middle2 = 0; //Ausgabe //initialisierung Output unsigned long Display = 0; //Display unsigned long Display_1 = 0; //Display alt //Pin verbinden mit SER int dataPin = 8; //Pin verbinden mit SRCLK int clockPin = 10; //Pin verbinden mit RCLK int latchPin = 9; void setup() { //Pins als Output setzen pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { //Lauflicht von oben if (tt == 0) //wenn Timer abgelaufen { if (tbari == 0) //wenn keine Bars übrig { tt = tspeed * random(tspacemin,tspacemax); //setze Timer auf Wert zwischen Bars tbari = random(tbarmin,tbarmax); //setze Bars übrig auf neuen Wert tled = random(tledmin,tledmax); //setze Anzahl LEDs tgap = random(tgapmin,tgapmax)*tgapm; //setze Anzahl Gaps ton = false; //stoppe Ausgabe LEDs } else //wenn Bars übrig { if ((ton == true) && (tgap!=0)) //wenn LEDs ausgegeben werden und Gap ungleich null { tt = tspeed * tgap; //setze Timer auf Wert Gap ton = false; //stoppe Ausgabe LEDs } else //ansonsten { tt = tspeed * tled; //setze Timer auf Wert LED tbari--; //verringere übrige Bars ton = true; //starte Ausgabe LEDs } } } if (tt%tspeed == 0) //berechne Takt aus Timer und Geschwindigkeit { top=top*2; //verschiebe LEDs um 1 Stelle if (ton == true) //wenn LEDs ausgegeben werden sollen { top = top + 1; //setze erste LED } } //Lauflicht von unten if (bt == 0) //wenn Timer abgelaufen { if (bbari == 0) //wenn keine Bars übrig { bt = bspeed * random(bspacemin,bspacemax); //setze Timer auf Wert zwischen Bars bbari = random(bbarmin,bbarmax); //setze Bars übrig auf neuen Wert bled = random(bledmin,bledmax); //setze Anzahl LEDs bgap = random(bgapmin,bgapmax)*bgapm; //setze Anzahl Gaps bon = false; //stoppe Ausgabe LEDs } else //wenn Bars übrig { if ((bon == true) && (bgap!=0)) //wenn LEDs ausgegeben werden und Gap ungleich null { bt = bspeed * bgap; //setze Timer auf Wert Gap bon = false; //stoppe Ausgabe LEDs } else //ansonsten { bt = bspeed * bled; //setze Timer auf Wert LED bbari--; //verringere übrige Bars bon = true; //starte Ausgabe LEDs } } } if (bt%bspeed == 0) //berechne Takt aus Timer und Geschwindigkeit { bottom=bottom/2; //verschiebe LEDs um 1 Stelle if (bon == true) //wenn LEDs ausgegeben werden sollen { bottom = bottom + 2147483648; //setze erste LED } } //Lauflicht von mitte if (mt == 0) //wenn Timer abgelaufen { if (mbari == 0) //wenn keine Bars übrig { mt = mspeed * random(mspacemin,mspacemax); //setze Timer auf Wert zwischen Bars mbari = random(mbarmin,mbarmax); //setze Bars übrig auf neuen Wert mon = false; //stoppe Ausgabe LEDs } else //wenn Bars übrig { if ((mon == true) && (mgap!=0)) //wenn LEDs ausgegeben werden und Gap ungleich null { mt = mspeed * mgap; //setze Timer auf Wert Gap mon = false; //stoppe Ausgabe LEDs } else //ansonsten { mt = mspeed * mled; //setze Timer auf Wert LED mbari--; //verringere übrige Bars mon = true; //starte Ausgabe LEDs } } } if (mt%mspeed == 0) //berechne Takt aus Timer und Geschwindigkeit { middle1=middle1*2; //verschiebe LEDs um 1 Stelle middle2=middle2/2; //verschiebe LEDs um 1 Stelle if (mon == true) //wenn LEDs ausgegeben werden sollen { middle1 = middle1 + 65536; //setze erste LED middle2 = middle2 + 32768; //setze erste LED } } //Ausgabe Display = top | bottom | middle1 | middle2; //Ausgabe zusammenführen if (Display != Display_1) //wenn Ausgabe von letzter Ausgabe abweicht { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, (Display >> 24)); shiftOut(dataPin, clockPin, MSBFIRST, (Display >> 16)); shiftOut(dataPin, clockPin, MSBFIRST, (Display >> 8)); shiftOut(dataPin, clockPin, MSBFIRST, Display); digitalWrite(latchPin, HIGH); Display_1=Display; //schiebe LEDs an HC595 und schreibe Display in Display alt } tt--; //verringere Timer top bt--; //verringere Timer bottom mt--; //verringere Timer middle delay(5); //warte 5ms }