//------------------------Deklarationen---------------------------------// int neue_led = 0; int neue_ebene = 0; int leds[80]; int ebenen[80]; int speichern = 0; long int seed_bestimmen = 0; bool schalter = false; //-----------------------Initialisierung--------------------------------// void setup() { for( int i = 0; i < 50; i++) seed_bestimmen |= (analogRead(14) & 0x01) << i; randomSeed(seed_bestimmen); DDRC = 0x3F; DDRB = 0x3F; // Register B C D als Ausgänge DDRC = 0x3F; DDRD = 0xFF; PORTC = 0x3C; // Pin0+1 (für led 14+15) LOW; Pins2-5 für ebenen auf HIGH } //------------------------Hauptprogramm---------------------------------// void loop(){ if(schalter == false){ // erzeugt eine led auf zufälliger ebenen neue_led = random(0, 16); neue_ebene = random(2, 6); } if(schalter == true){ // abschalten der leds (led Wert egal, ebene = 0 -> stimmt nie mit ebenen 2-5 überein -> leds aus) neue_led = 0; neue_ebene = 0; } leds[speichern] = neue_led; // es wird nun die neue led zu den übrigen hinzugefügt ebenen[speichern] = neue_ebene; if(speichern < 79) speichern += 1; // speichert ort rückt immer weiter (zuerst wird 0 ersetzt, dann 1 usw) else{ speichern = 0; schalter ^= true; // falls das gesamte array gefüllt ist, wird der schalter "umgelegt" und die leds werden wieder abgeschaltet } for(int k = 0; k < 10;){ // schleife damit die animation nicht zu schnell abläuft for(int i = 2; i < 6; i++){ // schaltet nach einander die ebenen durch PORTC &= ~(1 << i); for(int j = 0; j < 80; j++){ // setzt leds auf HIGH, falls die aktuelle ebene mit der im array übereinstimmt if(ebenen[j] == i){ // zufällige leds (zahlen von 0 bis 15) teilen sich auf 3 Ports auf: if(leds[j] < 8) PORTD |= (1 << leds[j]); // PortD 0...7, PortB 8...13 und PortC 14+15 (restliche 4 pins PortC ebenen1-4) if(leds[j] > 7 && leds[j] < 14) PORTB |= (1 << leds[j] - 8); if(leds[j] > 13) PORTC |= (1 << leds[j] - 14); // bsp: led_high = 14 -> ansteuern portc -> pin 0 auf high } } delay(5); // multiplexing, es scheint als währen alle etagen gleichzeitig an for(int j = 0; j < 80; j++){ // setzt leds auf LOW, falls die aktuelle ebene mit der im array übereinstimmt if(ebenen[j] == i){ // bsp: led_low = 11 -> ansteuern portb -> pin 3 auf low if(leds[j] < 8) PORTD &= ~(1 << leds[j]); if(leds[j] > 7 && leds[j] < 14) PORTB &= ~(1 << (leds[j] - 8)); if(leds[j] > 13) PORTC &= ~(1 << (leds[j] - 14)); } } PORTC |= (1 << i); } if(speichern > 15) k += 2; // ab der 15ten led werden die leds doppelt so schnell aktiviert else k++; } }