int led_SER_1 = 2; int led_RCK_1 = 3; int led_SCK_1 = 4; int btn_latch_1 = 8; int btn_data_1 = 9; int btn_clock_1 = 7; int led_test = 24; int led_count = 146; boolean on[146]; boolean on_next[146]; boolean visited[146]; boolean visited_next[146]; // complete network, functional, but doesn't match the installation int network_ints[146][10] = {{0,0,0,0,0,0,0,0,0,1024},{128,0,0,0,0,0,0,0,0,0},{256,0,0,0,0,0,0,0,0,0},{16384,0,0,0,0,0,0,0,3072,256},{96,0,0,0,0,0,0,0,0,256},{16,0,0,0,0,0,0,0,0,0},{1040,0,0,0,0,0,0,0,0,0},{4354,0,0,0,0,0,0,0,0,0},{4740,0,0,0,0,0,0,0,0,256},{256,0,0,0,0,0,0,0,0,0},{64,0,0,0,0,0,0,0,0,0},{4096,0,0,0,0,0,0,0,0,0},{10624,3,0,0,0,0,0,0,0,0},{4096,0,0,0,0,0,0,0,0,0},{8,296,0,0,0,0,0,0,32,0},{4096,0,0,0,0,0,0,0,0,0},{4096,212,0,0,0,0,0,0,0,0},{0,18,0,0,0,0,0,0,0,0},{16384,32,0,0,0,0,0,8192,32,0},{0,6,0,0,0,0,0,0,0,0},{16384,8,0,0,0,0,0,516,0,0},{0,258,0,0,0,0,0,0,0,0},{0,2,0,0,0,0,0,0,0,0},{16384,8256,0,0,0,0,0,4,0,0},{0,2048,0,0,0,0,0,0,0,0},{0,2048,0,0,0,0,0,0,0,0},{0,5632,1,0,0,262,0,0,0,0},{0,2048,0,0,0,0,0,0,0,0},{0,256,512,0,0,0,8,4,0,0},{0,0,1,0,0,0,0,0,0,0},{0,18432,2,0,0,0,8,0,0,0},{0,0,1,0,0,0,0,0,0,0},{0,0,9728,12,0,0,0,0,0,0},{0,0,32,8,0,0,0,0,0,0},{0,0,64,8,0,0,0,0,0,0},{0,0,8,0,0,0,0,0,0,0},{0,0,16,0,0,0,0,0,0,0},{0,0,256,8,0,0,0,0,0,0},{0,0,128,0,0,0,0,0,0,0},{0,8192,4,0,0,1,0,0,0,0},{0,0,4100,0,0,0,0,0,0,0},{0,0,4096,0,0,0,0,0,0,0},{0,0,11264,4,0,0,0,0,0,0},{0,0,4100,0,0,0,0,0,0,0},{0,0,0,4,0,0,0,0,0,0},{0,0,0,10,0,0,0,0,0,0},{0,0,0,1,0,0,0,0,0,0},{0,0,20484,0,0,0,0,0,0,0},{0,0,156,145,0,0,0,0,0,0},{0,0,0,72,0,0,0,0,0,0},{0,0,0,640,8192,0,0,0,0,0},{0,0,0,144,0,0,0,0,0,0},{0,0,0,1128,0,0,0,0,0,0},{0,0,0,1024,0,0,0,0,0,0},{0,0,0,32,4096,0,0,0,0,0},{0,0,0,384,5120,0,0,0,0,0},{0,0,0,8192,2,0,0,0,0,0},{0,0,0,0,2,0,0,0,0,0},{0,0,0,2048,2,0,0,0,0,0},{0,0,0,0,2,0,0,0,0,0},{0,0,0,0,2,0,0,0,0,0},{0,0,0,30720,61,0,0,0,0,0},{0,0,0,0,2,0,0,0,0,0},{0,0,0,0,98,0,0,0,0,0},{0,0,0,0,2,0,0,0,0,0},{0,0,0,0,778,0,0,0,0,0},{0,0,0,0,8,0,0,0,0,0},{0,0,0,0,2560,0,0,0,0,0},{0,0,0,0,544,0,0,0,0,0},{0,0,0,0,1440,0,0,0,0,0},{0,0,0,1024,512,0,0,0,0,0},{0,0,0,0,16512,0,0,0,0,0},{0,0,0,1536,24576,0,0,0,0,0},{0,0,0,32,4096,0,0,0,0,0},{0,0,0,0,6144,3,0,0,0,0},{0,0,512,0,16384,2,0,0,0,0},{0,2048,0,0,16384,137,0,0,0,0},{0,2048,0,0,0,0,0,0,0,0},{0,0,0,0,0,18,0,0,0,0},{0,0,0,0,0,40,0,0,0,0},{0,0,0,0,0,5200,0,0,0,0},{0,0,0,0,0,9888,0,0,0,0},{0,0,0,0,0,66,0,0,0,0},{0,2048,0,0,0,0,0,0,0,0},{0,0,0,0,0,16448,0,0,0,0},{0,0,0,0,0,2144,0,0,0,0},{0,0,0,0,0,5120,1,0,0,0},{0,0,0,0,0,2080,16,0,0,0},{0,0,0,0,0,64,2,0,0,0},{0,0,0,0,0,512,0,0,0,0},{0,0,0,0,0,2048,8,0,0,0},{0,0,0,0,0,8192,0,0,0,0},{0,0,0,0,0,0,8,0,0,0},{0,8192,1,0,0,0,5,4,0,0},{0,0,0,0,0,4096,320,0,0,0},{0,0,0,0,0,0,320,0,0,0},{0,0,0,0,0,0,1072,0,0,0},{0,0,0,0,0,0,1024,0,0,0},{0,0,0,0,0,0,2096,0,0,0},{0,0,0,0,0,0,1024,0,0,0},{0,0,0,0,0,0,4800,1,0,0},{0,0,0,0,0,0,24832,0,0,0},{0,0,0,0,0,0,1024,0,0,0},{0,0,0,0,0,0,2048,0,0,0},{0,0,0,0,0,0,2048,1024,0,0},{0,0,0,0,0,0,1024,2,0,0},{0,0,0,0,0,0,0,13,0,0},{0,8480,0,0,0,0,8,50,0,0},{0,0,0,0,0,0,0,2,0,0},{0,0,0,0,0,0,0,196,0,0},{0,0,0,0,0,0,0,4,0,0},{0,0,0,0,0,0,0,16,0,0},{0,0,0,0,0,0,0,16,0,0},{0,0,0,0,0,0,0,512,0,0},{0,32,0,0,0,0,0,16640,0,0},{0,0,0,0,0,0,16384,0,384,0},{0,0,0,0,0,0,0,16384,0,0},{0,0,0,0,0,0,0,16384,0,0},{0,8,0,0,0,0,0,16384,4,0},{0,0,0,0,0,0,0,14848,25,0},{0,0,0,0,0,0,0,16384,0,0},{0,0,0,0,0,0,0,0,64,0},{0,0,0,0,0,0,0,8192,8,0},{0,0,0,0,0,0,0,16384,4,0},{0,0,0,0,0,0,0,16384,0,0},{16384,8,0,0,0,0,0,0,512,0},{0,0,0,0,0,0,0,0,642,0},{0,0,0,0,0,0,0,1024,576,0},{0,0,0,0,0,0,0,1024,1024,0},{0,0,0,0,0,0,0,0,1248,0},{8,0,0,0,0,0,0,0,2816,0},{8,0,0,0,0,0,0,0,1024,1},{0,0,0,0,0,0,0,0,8192,264},{0,0,0,0,0,0,0,0,4096,0},{0,0,0,0,0,0,0,0,0,32},{0,0,0,0,0,0,0,0,2048,0},{0,0,0,0,0,0,0,0,0,32},{0,0,0,0,0,0,0,0,0,32},{0,0,0,0,0,0,0,0,4096,32},{0,0,0,0,0,0,0,0,0,32},{0,0,0,0,0,0,0,0,16384,1246},{0,0,0,0,0,0,0,0,0,32},{0,0,0,0,0,0,0,0,0,32},{280,0,0,0,0,0,0,0,4096,1024},{0,0,0,0,0,0,0,0,0,1024},{1,0,0,0,0,0,0,0,0,800}}; //define an array that corresponds to values for each //of the shift register's pins boolean a_button_is_pressed; boolean btn_DOWN[146]; int bitwise_filters[15]; long millis_betweenUpdates = 500; // could possibly be changed with a knob. otherwise, there's no need for the variable (if memory is an issue), since it's only called once. long millis_sinceUpdate = 0; long millis_prevFrame; //potentiometer speed control int speed; void setup(){ pinMode(led_SER_1, OUTPUT); pinMode(led_SCK_1, OUTPUT); pinMode(led_RCK_1, OUTPUT); //define pin modes pinMode(btn_latch_1, OUTPUT); pinMode(btn_clock_1, OUTPUT); pinMode(btn_data_1, INPUT); Serial.begin(9600); digitalWrite(led_RCK_1, LOW); digitalWrite(btn_latch_1, 0); for(int i = 0; i < 15; i++){ bitwise_filters[i] = 1 << i; } Serial.println("ready"); /* for(int i=0; i < 146; i++){ for(int j=0; j < 10; j++){ Serial.print(network_ints[i][j]); Serial.print(","); } Serial.println("}"); } */ // turn on the test pin pinMode(led_test, OUTPUT); digitalWrite(led_test, HIGH); } void loop(){ long millis_curr = millis(); millis_sinceUpdate += millis_curr - millis_prevFrame; if(millis_prevFrame > millis_curr) millis_sinceUpdate = 0; // to account for millis() rolling over to zero after 9 hours. if(millis_sinceUpdate > millis_betweenUpdates){ millis_sinceUpdate = 0; updateNet(); //potentiometer speed = analogRead(0); // read analog input pin 0 millis_betweenUpdates = speed; } millis_prevFrame = millis(); //Pulse the latch pin: //set it to 1 to collect parallel data a_button_is_pressed = false; pulse_btn_latch_1(); shiftIn_1(); /* if(a_button_is_pressed){ Serial.println("pressed"); } else { Serial.println("notpressed"); }*/ update_leds(); if(a_button_is_pressed){ millis_sinceUpdate = 0; int i = 0; if(allHaveBeenVisited()){ millis_sinceUpdate = 0; for(i = 0; i < led_count; i++){ on[i] = false; visited[i] = false; on_next[i] = false; visited_next[i] = false; } } for(i = 0; i < led_count; i++){ if(btn_DOWN[i]){ on[i] = true; visited[i] = true; on_next[i] = true; visited_next[i] = true; } } } } /* void all_leds(int high_or_low){ digitalWrite(led_RCK_1, LOW); for( int x = led_count-1; x >= 0; x --){ // set SER digitalWrite(led_SER_1, high_or_low); pulse_led_SCK(); } pulse_led_RCK(); } */ void update_leds(){ digitalWrite(led_RCK_1, LOW); //digitalWrite(led_RCK_2, LOW); int x= led_count-1; while(x >= 0){ if(on[x]){ digitalWrite(led_SER_1, HIGH); } else { digitalWrite(led_SER_1, LOW); } pulse_led_SCK_1(); x--; } pulse_led_RCK_1(); } void pulse_led_SCK_1(){ // pulse SCK (it pushes the SER value down the line) digitalWrite(led_SCK_1, HIGH); digitalWrite(led_SCK_1, LOW); } void pulse_led_RCK_1(){ // pulse SCK (it pushes the SER value down the line) digitalWrite(led_RCK_1, HIGH); //delayMicroseconds(20); digitalWrite(led_RCK_1, LOW); }