Work 2 (Valguskett)

Описание

Световая цепочка с несколькими светодиодами разного цвета, работает в 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);
	}
}

Видеоотчет