#include unsigned char values[14] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; unsigned int index = 0; bool noisy = false; enum { DEMO, COMET, TWINKLE, STAR, TRAIN, BOUNCE, RANDOM_WALK, SERVO, DAYLIGHT } mode; Servo servo; long int itrain = 0b11111; int train_length = 5; int how_many_pd_lights = 8; int how_many_pb_lights = 6; int total_lights = 8 + 6; int x = 0; void setup() { P2REN = 0b01111000; // Enable pullup / pulldown resistors on P2.3, 4, 5, and 6 P2OUT = 0b00111000; // Make switches pull up, solar pull down P1DIR = 0b11111111; P2DIR = 0b00000111; P1OUT = 0; mode = DEMO; if( noisy ) { delay( 500 ); Serial.begin( 9600 ); Serial.println( "Artists!" ); delay( 500 ); } servo.attach( P1_0 ); x = 0; } enum { WD_60MS, WD_8S }; void power_down( int flags ) { delay( 100 ); } unsigned char getMode( void ) { if( noisy ) { Serial.println( "getMode()" ); delay( 100 ); } P2OUT |= 0b00111000; // Make switches pull up, solar pull down if( digitalRead( P2_6 ) ) return DAYLIGHT; if( noisy ) { Serial.print( "Switches are: " ); Serial.println( (P2IN >> 3) & 0b111 ); delay( 100 ); } return (P2IN >> 3) & 0b111; } // // Comet controls the brightness of 14 LEDs on a scale from 0 to 13. // As the pattern moves right to left (or clockwise if the LEDs are arranged // in a circle, the brightest LED is at the front, and subsequent LEDs are // each one step dimmer, like the tail of a comet. // void comet( void ) { if( noisy ) { Serial.println( "Comet" ); delay( 100 ); } int lights = 0; for( int x = 0; x < 50; x++ ) { lights = 0; for( int y = 0; y < 14; y++ ) { if( x < 1<> 8) & 0b111; } values[index]--; values[index++] &= 0xF; index %= 14; } // // Star lights one LED at a time, in a series of 11 LEDs // void star( void ) { if( noisy ) { Serial.println( "Star" ); delay( 100 ); } int lights = 1 << x++; P1OUT = lights & 0b11111111; P2OUT = (lights >> 8) & 0b111; x %= 11; power_down( WD_60MS ); } // // Train moves five lights at a time from left to right, like a train. // void train( void ) { if( noisy ) { Serial.println( "Train" ); delay( 100 ); } itrain <<= 1; itrain = (itrain | (itrain >> total_lights)) & 0xFFFFFFL; P1OUT = (itrain >> train_length) & 0b11111111; P2OUT = (itrain >> (train_length + how_many_pd_lights)) & 0b111; power_down( WD_60MS ); } // // This program lights up one LED after another, and then it reverses. // It looks like the light is bouncing from one side to the other. // void bounce( void ) { if( noisy ) { Serial.println( "Bounce" ); delay( 100 ); } static unsigned long int lights = 1; static bool go_left = true; if( lights & 1 ) go_left = true; else if( lights & (1<<10) ) go_left = false; if( go_left ) lights <<= 1; else lights >>= 1; P1OUT = lights & 0b11111111; P2OUT = (lights >> 8) & 0b111; power_down( WD_60MS ); } // // Random walk makes a light appear to walk randomly around in a string // of 11 LEDs. // void random_walk( void ) { if( noisy ) { Serial.println( "Random Walk" ); delay( 100 ); } static unsigned int lights = 1 << 9; static bool go_left = true; if( random( 100 ) > 50 ) go_left = true; else go_left = false; if( lights & 1 ) go_left = true; else if( lights & (1<<10) ) go_left = false; if( go_left ) lights <<= 1; else lights >>= 1; P1OUT = lights & 0b11111111; P2OUT = (lights >> 8) & 0b111; power_down( WD_60MS ); } void move_servo( void ) { if( noisy ) { Serial.println( "Servo" ); delay( 100 ); } for( int x = 0; x < 190; x += 5 ) { servo.write( x ); P1OUT = x & ~1; delay( 50 ); } for( int x = 190; x >= 0; x -= 5 ) { servo.write( x ); P1OUT = x & ~1; delay( 50 ); } } void twinkle( void ) { if( noisy ) { Serial.println( "Twinkle" ); delay( 100 ); } int lights = random( 65535 ); P1OUT = lights & 0b11111111; P2OUT = (lights >> 8) & 0b111; power_down( WD_60MS ); } void demo( void ) { if( noisy ) { Serial.println( "Demo" ); delay( 100 ); } P1OUT = 0; P2OUT = 0; for( int i = 0; i < 1000 && getMode() == 0; i++ ) comet(); P1OUT = 0; P2OUT = 0; for( int i = 0; i < 100 && getMode() == 0; i++ ) star(); P1OUT = 0; P2OUT = 0; for( int i = 0; i < 206 && getMode() == 0; i++ ) train(); P1OUT = 0; P2OUT = 0; for( int i = 0; i < 200 && getMode() == 0; i++ ) bounce(); P1OUT = 0; P2OUT = 0; for( int i = 0; i < 200 && getMode() == 0; i++ ) twinkle(); P1OUT = 0; P2OUT = 0; for( int i = 0; i < 200 && getMode() == 0; i++ ) random_walk(); } void daylight( void ) { if( noisy ) { Serial.println( "Daylight" ); delay( 100 ); } P1OUT = 0; P2OUT = 0; power_down( WD_8S ); } void loop( void ) { switch( getMode() ) { case DEMO: demo(); break; case COMET: comet(); break; case TWINKLE: twinkle(); break; case STAR: star(); break; case TRAIN: train(); break; case BOUNCE: bounce(); break; case RANDOM_WALK: random_walk(); break; case SERVO: move_servo(); break; case DAYLIGHT: daylight(); break; } }