1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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);
}
|