Last active
December 10, 2015 07:28
-
-
Save gorenje/4401458 to your computer and use it in GitHub Desktop.
Ardunio Xmas Tree
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // -*- c -*- | |
| #define TO_INT(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9) \ | |
| (256*arg1) + (128*arg2) + (64*arg3) + (32*arg4) + (16*arg5) + \ | |
| ( 8*arg6) + ( 4*arg7) + ( 2*arg8) + ( 1*arg9) | |
| const int lookup[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256 }; | |
| const int SwitchPin = 13; | |
| const int SwitchPin2 = 12; | |
| const int MaxLeds = 9; | |
| int leds[MaxLeds] = { 3, 5,4, 6,9, 8,11, 7,10 }; | |
| const int MaxRepeats = 87; | |
| int hilo[MaxRepeats][1] = { | |
| /** | |
| * Indicies are defined as follows for | |
| * the Xmas tree: | |
| * | |
| * 9 | |
| * 7 8 | |
| * 5 6 | |
| * 3 4 | |
| * 1 2 | |
| * | |
| * Which might be counter intuitive. | |
| **/ | |
| { TO_INT(HIGH,HIGH, LOW,LOW,LOW,LOW,LOW,LOW,LOW) }, | |
| { TO_INT(LOW,LOW, HIGH,HIGH, LOW,LOW,LOW,LOW,LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, HIGH,HIGH, LOW,LOW,LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, HIGH,HIGH, LOW) }, | |
| /* 4 */ | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, HIGH) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, HIGH) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, HIGH,HIGH, LOW) }, | |
| /* 8 */ | |
| { TO_INT(LOW,LOW, LOW,LOW, HIGH,HIGH, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, HIGH,HIGH, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,HIGH, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| /* 12 */ | |
| { TO_INT(HIGH,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, HIGH,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, HIGH,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, HIGH,LOW, LOW) }, | |
| /* 16 */ | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, HIGH) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,HIGH, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,HIGH, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,HIGH, LOW,LOW, LOW,LOW, LOW) }, | |
| /* 20 */ | |
| { TO_INT(LOW,HIGH, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,HIGH, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, LOW,LOW, LOW,LOW, LOW) }, | |
| /* 24 */ | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, LOW) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, LOW) }, | |
| /* 28 */ | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, LOW) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, LOW) }, | |
| /* 32 */ | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,HIGH, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| /* 36 */ | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, HIGH) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, HIGH) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| /* 40 */ | |
| { TO_INT(HIGH,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,LOW, HIGH,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,LOW, HIGH,LOW, HIGH,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,LOW, HIGH,LOW, HIGH,LOW, LOW,LOW, LOW) }, | |
| /* 44 */ | |
| { TO_INT(HIGH,LOW, HIGH,LOW, HIGH,LOW, HIGH,LOW, LOW) }, | |
| { TO_INT(HIGH,LOW, HIGH,LOW, HIGH,LOW, HIGH,LOW, HIGH) }, | |
| { TO_INT(HIGH,LOW, HIGH,LOW, HIGH,LOW, LOW,HIGH, HIGH) }, | |
| { TO_INT(HIGH,LOW, HIGH,LOW, LOW,HIGH, LOW,HIGH, HIGH) }, | |
| /* 48 */ | |
| { TO_INT(HIGH,LOW, LOW,HIGH, LOW,HIGH, LOW,HIGH, HIGH) }, | |
| { TO_INT(LOW,HIGH, LOW,HIGH, LOW,HIGH, LOW,HIGH, HIGH) }, | |
| { TO_INT(HIGH,LOW, HIGH,LOW, HIGH,LOW, HIGH,LOW, HIGH) }, | |
| { TO_INT(LOW,HIGH, LOW,HIGH, LOW,HIGH, LOW,HIGH, HIGH) }, | |
| /* 52 */ | |
| { TO_INT(HIGH,LOW, HIGH,LOW, HIGH,LOW, HIGH,LOW, HIGH) }, | |
| { TO_INT(LOW,HIGH, LOW,HIGH, LOW,HIGH, LOW,HIGH, HIGH) }, | |
| { TO_INT(LOW,HIGH, LOW,HIGH, LOW,HIGH, LOW,HIGH, LOW) }, | |
| { TO_INT(LOW,HIGH, LOW,HIGH, LOW,HIGH, LOW,LOW, LOW) }, | |
| /* 56 */ | |
| { TO_INT(LOW,HIGH, LOW,HIGH, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,HIGH, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| /* 60 */ | |
| { TO_INT(LOW,HIGH, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, HIGH,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,HIGH, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, HIGH,LOW, LOW,LOW, LOW) }, | |
| /* 64 */ | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,HIGH, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, HIGH,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,HIGH, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, HIGH) }, | |
| /* 68 */ | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, HIGH) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, HIGH) }, | |
| /* 72 */ | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, HIGH) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, HIGH,HIGH, HIGH) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, HIGH,HIGH, HIGH,HIGH, HIGH) }, | |
| /* 76 */ | |
| { TO_INT(LOW,LOW, HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, LOW) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, HIGH,LOW, LOW) }, | |
| /* 80 */ | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,HIGH, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, HIGH,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,HIGH, HIGH,HIGH, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,HIGH, HIGH,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| /* 84 */ | |
| { TO_INT(HIGH,HIGH, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(HIGH,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| { TO_INT(LOW,LOW, LOW,LOW, LOW,LOW, LOW,LOW, LOW) }, | |
| }; | |
| int is_pin_high_or_low(int val, int idx) { | |
| return ( (val & lookup[idx]) == lookup[idx] ? HIGH : LOW ); | |
| } | |
| void activate_leds( int break_pin, int high_value ) { | |
| for ( int x = 0; x < MaxRepeats+1; x++){ | |
| for ( int y = 0; y < MaxLeds; y++ ) { | |
| digitalWrite(leds[y], is_pin_high_or_low(hilo[x%MaxRepeats][0], y) == high_value ? HIGH : LOW); | |
| } | |
| if ( digitalRead(break_pin) == HIGH ) { break; } | |
| delay(150); | |
| } | |
| } | |
| void draw_xmas_tree() { | |
| activate_leds(SwitchPin2, HIGH); | |
| } | |
| void draw_xmas_tree_inverse() { | |
| activate_leds(SwitchPin, LOW); | |
| } | |
| void setup() { | |
| Serial.begin(9600); | |
| pinMode(SwitchPin, INPUT); | |
| for ( int x = 0; x < MaxLeds; x++ ) { | |
| pinMode(leds[x], OUTPUT); | |
| digitalWrite(leds[x], LOW); | |
| } | |
| } | |
| void loop() { | |
| if ( digitalRead(SwitchPin) == HIGH ) { | |
| while ( 1 == 1 ) { | |
| draw_xmas_tree(); | |
| if ( digitalRead(SwitchPin2) == HIGH ) { break; } | |
| } | |
| for ( int x = 0; x < MaxLeds; x++ ) { | |
| digitalWrite(leds[x], LOW); | |
| } | |
| digitalWrite(leds[random(0,MaxLeds)], HIGH); | |
| delay(1000); | |
| } else { | |
| if ( digitalRead(SwitchPin2) == HIGH) { | |
| while ( 1 == 1 ) { | |
| draw_xmas_tree_inverse(); | |
| if ( digitalRead(SwitchPin) == HIGH ) { break; } | |
| } | |
| for ( int x = 0; x < MaxLeds; x++ ) { | |
| digitalWrite(leds[x], LOW); | |
| } | |
| digitalWrite(leds[random(0,MaxLeds)], HIGH); | |
| delay(1000); | |
| } else { | |
| for ( int x = 0; x < MaxLeds; x++ ) { | |
| digitalWrite(leds[x], LOW); | |
| } | |
| } | |
| } | |
| delay(1); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment