#define pinPeshkaGr 2 // Пин для управления зелёным светодиодом для пешеходов
#define pinPeshkaRed 3 // Пин для управления красным светодиодом для пешеходов
#define pinAvtoGr 4 // Пин для управления зелёным светодиодом для автомобилей
#define pinAvtoYe 5 // Пин для управления жёлтым светодиодом для автомобилей
#define pinAvtoRed 6 // Пин для управления красным светодиодом для автомобилей
#define pinPizza 7 // Пин для управления пьезодинамиком
#define pinSHCP 8 // Пин для тактирования сдвигового регистр, который используется для управления отображения единиц на циферблате
#define pinSTCP 9 // Пин для тактирования сдвигового регистр, который используется для управления отображения единиц на циферблате
#define pinDS 10 // Пин для подачи последовательных данных в свдиговый регистр, который используется для управления отображения единиц на циферблате
#define pinSHCP1 11 // Пин для тактирования сдвигового регистр, который используется для управления отображения десятков на циферблате
#define pinSTCP1 12 // latch
#define pinDS1 13 // Пин для подачи последовательных данных в регистр, который используется для управления отображения десятков на циферблате
const byte kefir[10] = {
0b11111100,
0b01100000,
0b11011010,
0b11110010,
0b01100110,
0b10110110,
0b10111110,
0b11100000,
0b11111110,
0b11110110,
};
int s = 261;
int s_mig = 0;
int timer_for_s_mig1 = 10;
int timer_for_s_mig2 = 20;
bool green = true;
bool mig = false;
int volna = 500;
int s_tone = 21;
int timer_for_s_tone = 17;
int s_t = 0;
void setup() {
pinMode(pinPeshkaGr, OUTPUT);
pinMode(pinPeshkaRed, OUTPUT);
pinMode(pinAvtoGr, OUTPUT);
pinMode(pinAvtoYe, OUTPUT);
pinMode(pinAvtoRed, OUTPUT);
pinMode(pinPizza, OUTPUT);
pinMode(pinSHCP, OUTPUT);
pinMode(pinSTCP, OUTPUT);
pinMode(pinDS, OUTPUT);
pinMode(pinSHCP1, OUTPUT);
pinMode(pinSTCP1, OUTPUT);
pinMode(pinDS1, OUTPUT);
digitalWrite(pinSTCP, HIGH);
digitalWrite(pinSTCP1, HIGH);
}
void loop() {
s--;
if(green) {
s_tone++;
if(s_tone >= timer_for_s_tone) {
if(s_t % 2 == 0) {
timer_for_s_tone--;
}
volna += 80;
s_tone = 0;
tone(pinPizza, volna, 200);
s_t++;
}
int q = s / 20;
int a = q / 10;
int b = q % 10 + 1;
if (b > 9) {
b = 0;
a = 1;
}
else if(a == 1 && b > 3) {
b = 3;
}
if (mig) {
s_mig++;
if(s_mig == timer_for_s_mig1) {
digitalWrite(pinPeshkaGr, HIGH);
}
else if(s_mig >= timer_for_s_mig2) {
s_mig = 0;
digitalWrite(pinPeshkaGr, LOW);
}
}
else {
digitalWrite(pinPeshkaGr, HIGH);
}
digitalWrite(pinAvtoRed, HIGH);
timer(kefir[b], kefir[a]);
if(s == 60) {
mig = true;
digitalWrite(pinAvtoYe, HIGH);
digitalWrite(pinPeshkaGr, LOW);
}
else if (s <= 0) {
timer(0b00000000, 0b00000000);
digitalWrite(pinPeshkaGr, LOW);
digitalWrite(pinAvtoRed, LOW);
digitalWrite(pinAvtoYe, LOW);
s_t = 0;
s = 261;
green = false;
mig = false;
timer_for_s_tone = 20;
volna = 500;
}
}
else {
digitalWrite(pinPeshkaRed, HIGH);
if(s == 60) {
digitalWrite(pinAvtoYe, HIGH);
digitalWrite(pinAvtoGr, LOW);
}
else if(s <= 0) {
digitalWrite(pinAvtoYe, LOW);
digitalWrite(pinPeshkaRed, LOW);
s = 261;
green = true;
}
else if (s > 60) {
digitalWrite(pinAvtoGr, HIGH);
}
}
delay(50);
}
void timer(byte a, byte b) {
digitalWrite(pinSTCP, LOW);
digitalWrite(pinSTCP1, LOW);
shiftOut(pinDS,pinSHCP,LSBFIRST,a);
shiftOut(pinDS1,pinSHCP1,LSBFIRST,b);
digitalWrite(pinSTCP1, HIGH);
digitalWrite(pinSTCP, HIGH);
}