// TM1637 SevenSegment Counter Wokwi Example
//
// https://wokwi.com/projects/339227323398095442
#include <GyverTM1637.h>
#define PIN_SENSOR A1
uint32_t btnTimer = 0, Timer = 0,STimer=0;
int rTimer = 30, gTimer = 50, caunt = 30,val,cauntLS,cauntNS,SCaunt=5;
const int CLK = 6, DIO = 5;
GyverTM1637 disp(CLK, DIO);
void setup() {
disp.clear();
disp.brightness(7);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);//car
pinMode(7, INPUT);
pinMode(8, INPUT);//human
pinMode(10, INPUT_PULLUP);
pinMode(A0, INPUT);
pinMode(PIN_SENSOR, INPUT);
}
class Svetofor
{
public:
Svetofor()
{
}
void Red()
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
};
void Green()
{
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
void yellowGinR()
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
void yellowRinG()
{
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
};
class disDR
{
public:
byte pin, last = 0;
disDR()
{
}
void dWriteC(int T)
{
if (T > 0)
{
disp.display(2, (T / 10) % 10);
disp.display(3, T % 10);
}
else
{
disp.displayByte(2, 0x40);
disp.displayByte(3, 0x40);
}
}
void dWriteP(int T)
{
if (T > 0)
{
disp.display(0, (T / 10) % 10);
disp.display(1, T % 10);
}
else
{
disp.displayByte(0, 0x40);//0x40 == -
disp.displayByte(1, 0x40);
}
}
};
Svetofor Sv;
disDR d;
void loop() {
green();
}
void green()
{
Sv.Green();
d.dWriteC(0);
d.dWriteP(0);
cauntNS=(map(analogRead(A0), 0, 1023, 30, 80)+cauntNS*7)/8;
if(cauntLS!=cauntNS)
{
Timer=millis();
cauntLS=cauntNS;
caunt=cauntNS;
}
if (millis() - Timer > 1000 && caunt > 0)
{
Timer = millis();
caunt--;
}
if (!digitalRead(10))
{
perGreen();
}
if(digitalRead(PIN_SENSOR)&& millis()-Timer>900) { // Датчик не срабатывает
Timer=millis();
SCaunt--;
if(SCaunt==0)
{
perGreen();
}
}
}
void perGreen()
{
gTimer = caunt + 10;
Sv.Green();
while (true)
{
if (millis() - btnTimer > 1000)
{
btnTimer = millis();
gTimer--;
}
d.dWriteC(gTimer - 5);
d.dWriteP(gTimer);
if (gTimer < 6)
{
Sv.yellowGinR();
}
if (gTimer == 0)
break;
}
red();
}
void red()
{
rTimer = 20;
Sv.Red();
while (true)
{
if (millis() - btnTimer > 1000)
{
btnTimer = millis();
rTimer--;
}
d.dWriteC(rTimer);
d.dWriteP(rTimer - 5);
if (rTimer < 6)
{
Sv.yellowRinG();
}
if (rTimer == 0)
{
break;
}
}
caunt = 30;
SCaunt=5;
loop();
}