Skip to content

Instantly share code, notes, and snippets.

@gorenje
Last active December 10, 2015 07:28
Show Gist options
  • Save gorenje/4401458 to your computer and use it in GitHub Desktop.
Save gorenje/4401458 to your computer and use it in GitHub Desktop.
Ardunio Xmas Tree
// -*- 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