diff options
Diffstat (limited to 'arduino/blinkme.ino')
| -rw-r--r-- | arduino/blinkme.ino | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/arduino/blinkme.ino b/arduino/blinkme.ino new file mode 100644 index 0000000..09a1c14 --- /dev/null +++ b/arduino/blinkme.ino @@ -0,0 +1,139 @@ +/* + Blink + Turns on an LED on for one second, then off for one second, repeatedly. + + This example code is in the public domain. + */ + + +// the setup routine runs once when you press reset: +void setup() { + // initialize the digital pin as an output. + pinMode(13, OUTPUT); + pinMode(12, OUTPUT); + pinMode(11, OUTPUT); + pinMode(10, OUTPUT); +} + +int LED0 = 0x01; +int LED1 = 0x02; +int LED2 = 0x04; +int LED3 = 0x08; + +int PWM_BASE = 15; + +void channel_set (int duration, int leds, int pwm) +{ + for (int i = 0; i < duration; i+=PWM_BASE) { + digitalWrite (10, leds & LED0); + digitalWrite (11, leds & LED1); + digitalWrite (12, leds & LED2); + digitalWrite (13, leds & LED3); + if ((pwm > PWM_BASE) || (pwm == 0)) { + delay (PWM_BASE); + continue; + } + delay (PWM_BASE-pwm); + digitalWrite (10, 0); + digitalWrite (11, 0); + digitalWrite (12, 0); + digitalWrite (13, 0); + delay (PWM_BASE-(PWM_BASE-pwm)); + } +} + +void run_left(int num, int f, int pwm) +{ + int i = 1; + + while (num) { + channel_set (f, LED3, pwm); + channel_set (f, LED2, pwm); + channel_set (f, LED1, pwm); + if (i >= num) + break; + channel_set (f, LED0, pwm); + i++; + } +} + +void run_right(int num, int f, int pwm) +{ + int i = 1; + + while (num) { + channel_set (f, LED0, pwm); + channel_set (f, LED1, pwm); + channel_set (f, LED2, pwm); + if (i >= num) + break; + channel_set (f, LED3, pwm); + i++; + } +} + +void red_white (int num, int f, int pwm) +{ + for (int i=0; i<num; i++) + { + channel_set (f, LED0|LED2, pwm); + channel_set (f, 0, pwm); + } + for (int i=0; i<num; i++) + { + channel_set (f, LED1|LED3, pwm); + channel_set (f, 0, pwm); + } + for (int i=0; i<num; i++) + { + channel_set (f, LED1, pwm); + channel_set (f, LED3, pwm); + } + for (int i=0; i<num; i++) + { + channel_set (f, LED0, pwm); + channel_set (f, LED2, pwm); + } +} + +void lr_speedup (int num, int pwm) +{ + int f_start = 100; + int i = 0; + do { + run_right (num-i, f_start, pwm); + run_left (num-i, f_start, pwm); + i++; + f_start += (5 * i); + } while (i < num); +} + +void flash (int num, int on, int off, int pwm) +{ + for (int i=0; i<num; i++) + { + channel_set (on, LED0|LED2, pwm); + channel_set (off, 0, pwm); + channel_set (on, LED1|LED3, pwm); + channel_set (off, 0, pwm); + } +} + +void dimmer (int f) +{ + for (int i = PWM_BASE; i > 0; i--) + channel_set (f*(i/4), LED0|LED1|LED2|LED3, i); + + channel_set (f*20, LED0|LED1|LED2|LED3, 0); + + for (int i = 1; i <= PWM_BASE; i++) + channel_set (f*(i/4), LED0|LED1|LED2|LED3, i); +} + +// the loop routine runs over and over again forever: +void loop() { + dimmer (250); + red_white (3, 400, PWM_BASE-1); + flash (10, 200, 80, PWM_BASE-1); + lr_speedup (4, PWM_BASE-1); +} |
