Загрузка данных


#include <TM1637Display.h>

const int LED_RED = 13;
const int LED_YELLOW = 12;
const int LED_GREEN = 11;

const int PED_RED = 10;
const int PED_GREEN = 9;

const int BUZZER = 8;

const int TRIG_PIN = 7;
const int ECHO_PIN = 6;

const int CLK = 5;
const int DIO = 4;

TM1637Display display(CLK, DIO);

const int DETECT_DISTANCE = 20;
const int TIMEOUT_YELLOW = 1690;
const int TIMEOUT_FLASH_GREEN = 500;
const int PEDESTRIAN_TIME = 5;
const int SAFETY_DELAY = 500;

bool sensorReady = true;

void setup()
{
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_YELLOW, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);

  pinMode(PED_RED, OUTPUT);
  pinMode(PED_GREEN, OUTPUT);

  pinMode(BUZZER, OUTPUT);

  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  display.setBrightness(7);
  display.clear();

  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_YELLOW, LOW);
  digitalWrite(LED_GREEN, HIGH);

  digitalWrite(PED_RED, HIGH);
  digitalWrite(PED_GREEN, LOW);
}

float getDistance()
{
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);

  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);

  digitalWrite(TRIG_PIN, LOW);

  long duration = pulseIn(ECHO_PIN, HIGH, 30000);

  if (duration == 0)
  {
    return 999;
  }

  return duration * 0.0343 / 2.0;
}

void pedestrianCycle()
{
  for (int i = 0; i < 3; i++)
  {
    digitalWrite(LED_GREEN, LOW);
    delay(TIMEOUT_FLASH_GREEN);

    digitalWrite(LED_GREEN, HIGH);
    delay(TIMEOUT_FLASH_GREEN);
  }

  digitalWrite(LED_GREEN, LOW);
  digitalWrite(LED_YELLOW, HIGH);

  delay(TIMEOUT_YELLOW);

  digitalWrite(LED_YELLOW, LOW);
  digitalWrite(LED_RED, HIGH);

  delay(SAFETY_DELAY);

  digitalWrite(PED_RED, LOW);
  digitalWrite(PED_GREEN, HIGH);

  tone(BUZZER, 2000);

  for (int seconds = PEDESTRIAN_TIME; seconds > 0; seconds--)
  {
    display.showNumberDec(seconds);
    delay(1000);
  }

  noTone(BUZZER);
  display.clear();

  digitalWrite(PED_GREEN, LOW);
  digitalWrite(PED_RED, HIGH);

  delay(SAFETY_DELAY);

  digitalWrite(LED_YELLOW, HIGH);

  delay(TIMEOUT_YELLOW);

  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_YELLOW, LOW);
  digitalWrite(LED_GREEN, HIGH);
}

void loop()
{
  float distance = getDistance();

  if (sensorReady && distance > 2 && distance <= DETECT_DISTANCE)
  {
    sensorReady = false;
    pedestrianCycle();
  }

  if (!sensorReady && distance > 25)
  {
    sensorReady = true;
  }

  delay(100);
}