Work 1 (Valgusfoor)

Katsed

Katse 1 — Aleksandr Nurk ÕPIMAPP/ portfoolio (nurkz.dev)

Описание

Данная программа работает как светофор для автомобилей и людей (включаяя ночные режимы — мигает желтым).
Автоматическое переключение между днем ​​и ночью.

Использованые компоненты

5x 330 Ω резисторы
5x цветные LEDы (3 для машин, 2 для людей)
6x стандартные одиночные провода «папа-папа»

Код программы

const int RED_PIN = 9;
const int YELLOW_PIN = 10;
const int GREEN_PIN = 11;
const int GREEN_PIN_HUMAN = 6;
const int RED_PIN_HUMAN = 5;

int DISPLAY_TIME = 100;	 // värvimuutuse kiirus

bool night_time = false;

void setup()
{
	pinMode(RED_PIN, OUTPUT);
	pinMode(YELLOW_PIN, OUTPUT);
	pinMode(GREEN_PIN, OUTPUT);
	pinMode(GREEN_PIN_HUMAN, OUTPUT);
	pinMode(RED_PIN_HUMAN, OUTPUT);
}

void clean()
{
	digitalWrite(RED_PIN, LOW);
	digitalWrite(YELLOW_PIN, LOW);
	digitalWrite(GREEN_PIN, LOW);
	digitalWrite(GREEN_PIN_HUMAN, LOW);
	digitalWrite(RED_PIN_HUMAN, LOW);
}

void loop()
{
	clean();

	digitalWrite(GREEN_PIN, HIGH);
	digitalWrite(RED_PIN_HUMAN, HIGH);

	//svetofor_test();
	while (true) {
		svetofor();
		delay(10000);
	}
}

void svetofor_test()
{
	while (true) {
		digitalWrite(RED_PIN, HIGH);
		delay(1000);
		digitalWrite(RED_PIN, LOW);
		digitalWrite(YELLOW_PIN, HIGH);
		delay(1000);
		digitalWrite(YELLOW_PIN, LOW);
		digitalWrite(GREEN_PIN, HIGH);
		delay(1000);
		digitalWrite(GREEN_PIN, LOW);
		digitalWrite(GREEN_PIN_HUMAN, HIGH);
		delay(1000);
		digitalWrite(GREEN_PIN_HUMAN, LOW);
		digitalWrite(RED_PIN_HUMAN, HIGH);
		delay(1000);
		digitalWrite(RED_PIN_HUMAN, LOW);
	}
}

bool is_car_color_green()
{
	return digitalRead(GREEN_PIN) == HIGH;
}

bool is_human_color_green()
{
	return digitalRead(GREEN_PIN_HUMAN) == HIGH;
}

void change_color_car()
{
	int pin = is_car_color_green() ? GREEN_PIN : RED_PIN;

	for (int i = 0; i < 5; i++) {
		digitalWrite(pin, digitalRead(pin) == HIGH ? LOW : HIGH);
		delay(500);
	}

	digitalWrite(pin, LOW);
	digitalWrite(YELLOW_PIN, HIGH);
	delay(3000);
	digitalWrite(YELLOW_PIN, LOW);
	digitalWrite(pin == GREEN_PIN ? RED_PIN : GREEN_PIN, HIGH);
}

void change_color_human()
{
	int pin = is_human_color_green() ? GREEN_PIN_HUMAN : RED_PIN_HUMAN;

	digitalWrite(pin, LOW);
	digitalWrite(pin == GREEN_PIN_HUMAN ? RED_PIN_HUMAN : GREEN_PIN_HUMAN, HIGH);
}

void night_lightning()
{
	clean();

	for (int i = 0; i < 20; i++) {
		if (digitalRead(YELLOW_PIN) == HIGH)
			digitalWrite(YELLOW_PIN, LOW);
		else
			digitalWrite(YELLOW_PIN, HIGH);

		delay(1000);
	}
}

void svetofor()
{
	for (int i = 0; i < 3; ++i) {
		if (night_time == true) {
			night_lightning();
			digitalWrite(GREEN_PIN, HIGH);
			digitalWrite(RED_PIN_HUMAN, HIGH);

			break;
		} else {
			if (is_car_color_green()) {
				change_color_car();
				delay(1000);
				change_color_human();
			} else {
				change_color_human();
				delay(1000);
				change_color_car();
			}
		}

		delay(10000);
	}

	night_time = !night_time;
}

Видеоотчет