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


#include <TM1637Display.h>
#include <LedControl.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 = 3;

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

const int TM_CLK = 5;
const int TM_DIO = 4;

TM1637Display display(TM_CLK, TM_DIO);

const int MATRIX_DIN = A0;
const int MATRIX_CS = A1;
const int MATRIX_CLK = A2;

LedControl matrix = LedControl(MATRIX_DIN, MATRIX_CLK, MATRIX_CS, 1);

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;

byte standingPerson[8] =
{
  B00011000,
  B00011000,
  B00011000,
  B00111100,
  B00011000,
  B00011000,
  B00100100,
  B00100100
};

byte walkingPerson1[8] =
{
  B00011000,
  B00011000,
  B00011000,
  B00111100,
  B01011010,
  B00011000,
  B00101000,
  B01000100
};

byte walkingPerson2[8] =
{
  B00011000,
  B00011000,
  B00011000,
  B00111100,
  B01011010,
  B00011000,
  B00010100,
  B00100010
};

void showImage(byte image[])
{
  for (int i = 0; i < 8; i++)
  {
    matrix.setRow(0, i, image[i]);
  }
}

void showStandingPerson()
{
  showImage(standingPerson);
}

void showWalkingPerson(int frame)
{
  if (frame == 0)
  {
    showImage(walkingPerson1);
  }
  else
  {
    showImage(walkingPerson2);
  }
}

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();

  matrix.shutdown(0, false);
  matrix.setIntensity(0, 5);
  matrix.clearDisplay(0);

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

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

  showStandingPerson();
}

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()
{
  showStandingPerson();

  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);

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

    tone(BUZZER, 2000);
    showWalkingPerson(0);
    delay(150);
    noTone(BUZZER);

    showWalkingPerson(1);
    delay(212);

    showWalkingPerson(0);
    delay(212);

    showWalkingPerson(1);
    delay(212);

    showWalkingPerson(0);
    delay(212);
  }

  noTone(BUZZER);
  display.clear();

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

  showStandingPerson();

  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);
}