#define LED 4
#define PIN_TRIG 3
#define PIN_ECHO 2
unsigned long prev = 0; //в этой переменной будем хранить время, когда расстояние стало меньше порогового
const long period = 1000; //интервал времени в миллисекундах, через который светодиод загорится
const int threshold = 30; // порог расстояния в см
int ledState = LOW; // состояние светодиода (пока не горит)
bool turnOn = true;
int crossroad = 0;
uint32_t getDist() {
// Начинаем измерение
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
return duration / 58.2;
}
void setup() {
Serial.begin(9600);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
uint32_t dist = getDist();
uint32_t cur = millis(); // текущее время (millis считает миллисекунды с момента старта программы)
// проверяем прошли ли 5000ms
if (dist < threshold && cur - prev <= period && turnOn) {
digitalWrite(LED, HIGH);
Serial.println(cur - prev);
}
if (dist < threshold && cur - prev >= period) {
digitalWrite(LED, LOW);
turnOn = false;
Serial.println("Мотор не работает, обнуляем таймер");
prev = cur; // светодиод не горит, но обновляем таймер
}
if (dist > threshold && !turnOn) {
digitalWrite(LED, LOW);
turnOn = true;
prev = cur;
crossroad ++;
Serial.print("Перекрёсток № ");
Serial.println(crossroad);
}
delay(50); // ждя корректного замера
}