#define R 13 // красный сигнал у машин
#define Y 12 // жёлтый сигнал у машин
#define G 11 // зелёный сигнал у машин
#define R_P 9 // красный сигнал у пешехода
#define G_P 8 // зелёный сигнал у пешехода
#define BUT 2 // кнопка для пешеходного перехода
#define POT A0 // потенциометр для регулировки длительности перехода
#define BUZZ 3 // зуммер
bool requestCross = false; // заявка на переход
// настройка пинов
void setup() {
pinMode(R, OUTPUT);
pinMode(Y, OUTPUT);
pinMode(G, OUTPUT);
pinMode(R_P, OUTPUT);
pinMode(G_P, OUTPUT);
pinMode(BUZZ, OUTPUT);
pinMode(BUT, INPUT_PULLUP);
}
// функция работы светофора для машин
void cars(bool r, bool y, bool g)
{
digitalWrite(R, r);
digitalWrite(Y, y);
digitalWrite(G, g);
}
// функция работы свотофора для пешеходов
void peds(bool r, bool g)
{
digitalWrite(R_P, r);
digitalWrite(G_P, g);
}
// функция проверки кнопки
void waitWithButton(uint32_t ms)
{
uint32_t start = millis();
while (millis() - start < ms)
{
if (digitalRead(BUT) == LOW)
{
delay(20);
if (digitalRead(BUT) == LOW)
{
requestCross = true;
while (digitalRead(BUT) == LOW)
{
delay(10);
}
}
}
}
}
// функция работы светофора для перехода
void pedestrianPhase(uint32_t cross_ms)
{
cars(true, false, false);
peds(false, true);
uint32_t t0 = millis();
while(millis() - t0 < cross_ms)
{
uint32_t elapsed = millis() - t0;
uint32_t remain = (cross_ms > elapsed) ? (cross_ms - elapsed) : 0;
// зуммер каждые 500 мс звук
if((elapsed % 500) < 120)
{
tone(BUZZ, 1000, 100);
}
// последние 2 секунды мигание пешеходам
if(remain <= 2000)
{
digitalWrite(G_P, (millis() / 200) % 2);
}
else
{
digitalWrite(G_P, HIGH);
}
delay(20);
}
peds(true, false);
}
void loop()
{
// Машинам зелёный
cars(false, false, true);
peds(true, false);
waitWithButton(5000);
// Машинам жёлтый
cars(false, true, false);
waitWithButton(1000);
// Машинам красный
cars(true, false, false);
// Проверяем была ли заявка
if(requestCross)
{
uint32_t cross_ms = map(analogRead(POT), 0, 1023, 3000, 10000);
pedestrianPhase(cross_ms);
requestCross = false;
}
delay(2000);
}Loading
st-nucleo-c031c6
st-nucleo-c031c6