const int redPin = 2; // пин красного диода
const int yellowPin = 3; // пин желтого диода
const int greenPin = 4; // пин зеленого диода
const int GRedPin = 5; // Пин красного диода для пешеходов
const int GGreenPin = 6; // Пин зеленого диода для пешеходов
const int buttonPin = 7; // Пин кнопки
// Variables will change:
int redState = 0; // переменные состония диодов - "изначально выключены"
int yellowState = 0; //
int greenState = 0; //
int GRedState = 0;
int GGreenState = 0;
long StartTime = 0; // сохранит время последнего запуска последовательности движения
// следующие переменные являются длинными, потому что время, измеряемое в миллисекундах,
// быстро станет большим числом, чем может быть сохранено в int.
long interval = 9000; // интервал последовательности - это время в миллисекундах с момента начала зеленого сигнала.
bool flag = false;
bool flag2 = true;
uint32_t btnTimer = 0;
const uint32_t CLICK_THRESHOLD = 2000; // Порог времени для быстрого нажатия в мс
void setup() {
// инициализация пинов
Serial.begin(9600);
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(GRedPin, OUTPUT);
pinMode(GGreenPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
bool btnState = !digitalRead(7); // читаем текущее состояние кнопки инвариатное
// put your main code here, to run repeatedly:
unsigned long CheckTime = millis(); //
unsigned long elapsedTime = CheckTime - StartTime; //
if (elapsedTime > interval) { //
StartTime = CheckTime;
flag2 = true; //
}
if (elapsedTime < 3000 ) {
redState = LOW;
yellowState = LOW;
greenState = HIGH;
GRedState = HIGH;
GGreenState = LOW;
}
if (elapsedTime > 3000 && elapsedTime < 6000 ) {
redState = LOW;
yellowState = HIGH;
greenState = LOW;
GRedState = HIGH;
GGreenState = LOW;
}
if (elapsedTime > 6000) {
redState = HIGH;
yellowState = LOW;
greenState = LOW;
GRedState = HIGH;
GGreenState = LOW;
}
if (elapsedTime > 6000 && flag2 == false) {
redState = HIGH;
yellowState = LOW;
greenState = LOW;
GGreenState = HIGH;
GRedState = LOW;
}
// Проверка состояния кнопки и переключение диодов для пешеходов
if (btnState == true && flag == false && millis() - btnTimer > 80) {
flag = true;
btnTimer = millis();
//Serial.println("press");
}
if (btnState == false && flag == true && millis() - btnTimer > 80) {
uint32_t releaseTime = millis();
//Serial.println("release");
// Проверяем, было ли нажатие дольше 2 секунд
if (releaseTime - btnTimer > CLICK_THRESHOLD) {
Serial.println("click");
flag = false;
flag2 = false;
}
}
digitalWrite(redPin,redState);
digitalWrite(greenPin,greenState);
digitalWrite(yellowPin,yellowState);
digitalWrite(GRedPin, GRedState);
digitalWrite(GGreenPin, GGreenState);
}