#include<TimerOne.h> // подключение библиотеки
int signal1[] = {10, 9, 8}; // объявление переменных и констант
int signal2[] = {13, 12, 11};
volatile int triggerpin1 = 5;
volatile int echopin1 = 4;
volatile int triggerpin2 = 3;
volatile int echopin2 = 6;
volatile long time;
volatile int S1, S2;
int t = 5;
void setup(){ // постоянная функция
for(int i=0; i<3; i++){ // объявление пинов, как выходов
pinMode(signal1[i], OUTPUT);
pinMode(signal2[i], OUTPUT);
}
pinMode(triggerpin1, OUTPUT);
pinMode(echopin1, INPUT);
pinMode(triggerpin2, OUTPUT);
pinMode(echopin2, INPUT);
Serial.begin(110000); // работа таймера
Timer1.initialize(90000);
Timer1.attachInterrupt(softInterr);
}
void softInterr() { // функция, включающая таймер после его завершения
// 1 датчик
digitalWrite(triggerpin1, LOW);
delayMicroseconds(2);
digitalWrite(triggerpin1, HIGH);
delayMicroseconds(10);
digitalWrite(triggerpin1, LOW);
time = pulseIn(echopin1, HIGH);
S1= time*0.034/2;
// 2 датчик
digitalWrite(triggerpin2, LOW);
delayMicroseconds(2);
digitalWrite(triggerpin2, HIGH);
delayMicroseconds(10);
digitalWrite(triggerpin2, LOW);
time = pulseIn(echopin2, HIGH);
S2= time*0.034/2;
// Печать значений расстояний на последовательном мониторе для отладки
Serial.print("S1: ");
Serial.print(S1);
Serial.print(" S2: ");
Serial.print(S2);
}
void loop() { // циклическая функция
if(S1<t) {
signal1Function();
}
if(S2<t) {
signal2Function();
}
}
void signal1Function() { // функция, определяющая работу 1 светофора
Serial.println("1");
low();
digitalWrite(signal1[0], LOW);
digitalWrite(signal1[2], HIGH);
delay(3000);
if(S2<t) {
digitalWrite(signal1[2], LOW);
delay(300);
digitalWrite(signal1[2], HIGH);
delay(300);
digitalWrite(signal1[2], LOW);
delay(300);
digitalWrite(signal1[2], HIGH);
delay(300);
digitalWrite(signal1[2], LOW);
delay(300);
digitalWrite(signal1[2], HIGH);
delay(300);
// 2
digitalWrite(signal1[2], LOW);
digitalWrite(signal2[1], HIGH);
digitalWrite(signal1[1], HIGH);
delay(2500);
}
}
void signal2Function() { // функция, определяющая работу второго светофора
Serial.println("2");
low();
digitalWrite(signal2[0], LOW);
digitalWrite(signal2[2], HIGH);
delay(3000);
if(S1<t) {
digitalWrite(signal2[2], LOW);
delay(300);
digitalWrite(signal2[2], HIGH);
delay(300);
digitalWrite(signal2[2], LOW);
delay(300);
digitalWrite(signal2[2], HIGH);
delay(300);
digitalWrite(signal2[2], LOW);
delay(300);
digitalWrite(signal2[2], HIGH);
delay(300);
// 2
digitalWrite(signal2[2], LOW);
digitalWrite(signal1[1], HIGH);
digitalWrite(signal2[1], HIGH);
delay(2500);
}
}
// Функция, делающая все светодиоды низкими, кроме красного
void low() {
for(int i=1; i<3; i++) {
digitalWrite(signal1[i], LOW);
digitalWrite(signal2[i], LOW);
}
for(int i=0; i<1; i++) {
digitalWrite(signal1[i], HIGH);
digitalWrite(signal2[i], HIGH);
}
}