#include <LiquidCrystal_I2C.h>
#define BUT_PIN A3
#define SLIDE_PIN 13
#define YELLOW_PIN 12
const byte RED = 1;
const byte YELLOW = 2;
const byte GREEN = 3;
volatile const byte switchColor[3] = {RED, YELLOW, GREEN};
volatile byte s = 0;
const byte colorPin[3] = {A0, A1, A2};
const byte redPin[4] = {9, 10, 5, 7};
const byte greenPin[4] = {8, 11, 4, 6};
const byte x_list[3] = {0, 4, 8};
LiquidCrystal_I2C lcd(0x27, 16, 2);
uint16_t timers[3] = {10000, 5000, 12000};
volatile uint64_t lastTimes[3] = {0, 0, 0};
bool active = true;
int curColor = RED;
int lastColor = curColor;
byte lastButState;
uint64_t lastButTime = 0;
uint16_t butTimer = 200;
void setup() {
for(byte i {0}; i < 4; i++) {
if (i < 3) { pinMode(colorPin[i], INPUT);}
pinMode(redPin[i], OUTPUT);
pinMode(greenPin[i], OUTPUT);
}
pinMode(YELLOW_PIN, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(SLIDE_PIN, INPUT_PULLUP);
pinMode(BUT_PIN, INPUT_PULLUP);
lastButState = digitalRead(BUT_PIN);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(x_list[0], 0);
lcd.print("R:");
lcd.setCursor(x_list[0], 1);
lcd.print(String(timers[0] / 1000) + "s");
lcd.setCursor(x_list[1], 0);
lcd.print("Y:");
lcd.setCursor(x_list[1], 1);
lcd.print(String(timers[1] / 1000) + "s");
lcd.setCursor(x_list[2], 0);
lcd.print("G:");
lcd.setCursor(x_list[2], 1);
lcd.print(String(timers[2] / 1000) + "s");
lcd.setCursor(12, 0);
lcd.print("avto");
digitalWrite(redPin[0], HIGH);
digitalWrite(redPin[3], HIGH);
digitalWrite(greenPin[1], HIGH);
digitalWrite(greenPin[2], HIGH);
lastTimes[0] = millis();
attachInterrupt(0, newColor, FALLING);
}
void loop() {
if (curColor == RED) {
s = 0;
if (millis() - lastTimes[0] > timers[0]) {
lastTimes[0] = lastTimes[1] = millis();
digitalWrite(greenPin[1], LOW);
digitalWrite(greenPin[2], LOW);
digitalWrite(redPin[2], HIGH);
digitalWrite(YELLOW_PIN, HIGH);
lastColor = curColor;
curColor = YELLOW;
}
} else if (curColor == YELLOW) {
s = 1;
if (millis() - lastTimes[1] > timers[1]) {
if (lastColor == RED) {
lastTimes[1] = lastTimes[2] = millis();
digitalWrite(greenPin[0], HIGH);
digitalWrite(greenPin[3], HIGH);
digitalWrite(redPin[0], LOW);
digitalWrite(redPin[3], LOW);
digitalWrite(redPin[1], HIGH);
lastColor = curColor;
curColor = GREEN;
}
else if (lastColor == GREEN) {
lastTimes[1] = lastTimes[0] = millis();
digitalWrite(redPin[0], HIGH);
digitalWrite(redPin[2], LOW);
digitalWrite(redPin[1], LOW);
digitalWrite(greenPin[1], HIGH);
digitalWrite(greenPin[2], HIGH);
lastColor = curColor;
curColor = RED;
}
digitalWrite(YELLOW_PIN, LOW);
}
} else if (curColor == GREEN) {
s = 2;
if (millis() - lastTimes[2] > timers[2]) {
lastTimes[1] = lastTimes[2] = millis();
digitalWrite(YELLOW_PIN, HIGH);
digitalWrite(greenPin[0], LOW);
digitalWrite(greenPin[3], LOW);
digitalWrite(redPin[3], HIGH);
lastColor = curColor;
curColor = YELLOW;
}
}
for(byte i {0}; i < 3; i++) {
uint16_t newTimer = map(analogRead(colorPin[i]), 0, 1023, 1000, 30000);
if (newTimer != timers[i]) {
timers[i] = newTimer;
lcd.setCursor(x_list[i], 1);
uint16_t timer = timers[i] / 1000;
lcd.print(String(timer) + "s ");
}
}
check();
if (digitalRead(SLIDE_PIN) == LOW) {
lcd.setCursor(12, 0);
lcd.print(" ");
lcd.setCursor(12, 1);
lcd.print("ruch");
active = false;
} else {
active = true;
lcd.setCursor(12, 1);
lcd.print(" ");
lcd.setCursor(12, 0);
lcd.print("avto");
}
}
void newColor() {
if (!active) {
lastTimes[s] += 60000;
}
}
void check() {
byte state = digitalRead(BUT_PIN);
if (state != lastButState) {
lastButState = state;
if(state == LOW) {
if(millis() - lastButTime > butTimer) {
lastButTime = millis();
curColor = RED;
for(byte i {0}; i < 4; i++) {
digitalWrite(redPin[i], LOW);
digitalWrite(greenPin[i], LOW);
}
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(redPin[0], HIGH);
digitalWrite(redPin[3], HIGH);
digitalWrite(greenPin[1], HIGH);
digitalWrite(greenPin[2], HIGH);
lastTimes[0] = millis();
}
}
}
}
Кнопка
перезапуска
Переключатель
режимов
Кнопка смены
цветов светофора
Arduino Uno
Потенциометры для
ручной настройки таймеров
свеотофора
ЖК-дисплей для вывода
текущего режима и таймеров
Резистор 15 Ом
Первые
светофоры
Вторые
светофоры