
Описание
Световая цепочка с несколькими светодиодами разного цвета, работает в 6 режимах.
1. Быстрый триколор
2. Медленный триколор
3. Биколор
4. Пульсация
5. Случайные диоды
6. Змейка
Использованые компоненты
6x 330 Ω резисторы
6x цветные LEDы (2 крассных, 2 синих, 2 зеленых)
11x стандартные одиночные провода «папа-папа»
1x потенциометр
Код программы
#define DEBUG 1
const int SENSOR_PIN = 0;
const int RED_PIN1 = 13;
const int RED_PIN2 = 10;
const int BLUE_PIN1 = 12;
const int BLUE_PIN2 = 9;
const int GREEN_PIN1 = 11;
const int GREEN_PIN2 = 8;
int val;
void setup() {
pinMode(RED_PIN1, OUTPUT);
pinMode(RED_PIN2, OUTPUT);
pinMode(BLUE_PIN1, OUTPUT);
pinMode(BLUE_PIN2, OUTPUT);
pinMode(GREEN_PIN1, OUTPUT);
pinMode(GREEN_PIN2, OUTPUT);
#ifdef DEBUG
Serial.begin(9600);
#endif
}
void setStateArgs(int count, int state, ...) {
va_list args;
va_start(args, state);
for (int i = 0; i < count; i++) {
digitalWrite(va_arg(args, int), state);
}
va_end(args);
}
void setState(int count, int state, va_list args) {
va_list argscopy;
va_copy(argscopy, args);
for (int i = 0; i < count; i++) {
digitalWrite(va_arg(argscopy, int), state);
}
va_end(argscopy);
}
void triggerState(int count, int _delay, ...) {
va_list args;
va_start(args, _delay);
setState(count, HIGH, args);
delay(_delay);
setState(count, LOW, args);
va_end(args);
}
void red(int _delay) {
triggerState(2, _delay, RED_PIN1, RED_PIN2);
}
void blue(int _delay) {
triggerState(2, _delay, BLUE_PIN1, BLUE_PIN2);
}
void green(int _delay) {
triggerState(2, _delay, GREEN_PIN1, GREEN_PIN2);
}
void three_colors(int _delay) {
red(_delay);
blue(_delay);
green(_delay);
}
void two_colors() {
setStateArgs(4, HIGH, RED_PIN1, RED_PIN2, BLUE_PIN1, BLUE_PIN2);
delay(300);
setStateArgs(2, HIGH, GREEN_PIN1, GREEN_PIN2);
setStateArgs(2, LOW, RED_PIN1, RED_PIN2);
delay(300);
setStateArgs(4, LOW, BLUE_PIN1, BLUE_PIN2, GREEN_PIN1, GREEN_PIN2);
delay(400);
}
void colors_pulsating() {
setStateArgs(3, HIGH, RED_PIN1, BLUE_PIN1, GREEN_PIN1);
delay(200);
digitalWrite(RED_PIN1, LOW);
digitalWrite(RED_PIN2, HIGH);
delay(200);
digitalWrite(BLUE_PIN1, LOW);
digitalWrite(BLUE_PIN2, HIGH);
delay(200);
digitalWrite(GREEN_PIN1, LOW);
digitalWrite(GREEN_PIN2, HIGH);
delay(200);
setStateArgs(3, LOW, RED_PIN2, BLUE_PIN2, GREEN_PIN2);
delay(200);
}
void random_colors() {
triggerState(1, 100, (rand() % 6) + 8);
}
void light_chain() {
triggerState(1, 200, RED_PIN1);
triggerState(1, 200, BLUE_PIN1);
triggerState(1, 200, GREEN_PIN1);
triggerState(1, 200, RED_PIN2);
triggerState(1, 200, BLUE_PIN2);
triggerState(1, 200, GREEN_PIN2);
}
void loop() {
val = analogRead(SENSOR_PIN);
val = map(val, 0, 1023, 0, 6);
#ifdef DEBUG
Serial.println(val);
#endif
if (val == 1) {
three_colors(200);
} else if (val == 2) {
three_colors(600);
} else if (val == 3) {
two_colors();
} else if (val == 4) {
colors_pulsating();
} else if (val == 5) {
random_colors();
} else if (val == 6) {
light_chain();
} else {
digitalWrite(RED_PIN1, LOW);
digitalWrite(RED_PIN2, LOW);
digitalWrite(BLUE_PIN1, LOW);
digitalWrite(BLUE_PIN2, LOW);
}
}
