Если Вам не трудно, проверьте уже изменений скетч. В нем кроме в момент сближения на 1м у.д. и активации по таймеру голосового модуля присутствует lockpin с подачей сигнала низкого уровня на реле для открытия эл.магнитного замка двери. Если все верно?
#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 rtc;
const int trigPin = 9; // Пин для триггера ультразвукового датчика
const int echoPin = 10; // Пин для эхо ультразвукового датчика
const int lockPin = 3; // Пин для реле замка
const int voicePin1 = 4; // Пин для голосового модуля (1)
const int voicePin2 = 5; // Пин для голосового модуля (2)
const int voicePin3 = 6; // Пин для голосового модуля (3)
const int voicePin4 = 7; // Пин для голосового модуля (4)
unsigned long lastEchoTime = 0; // Время последнего срабатывания эхо
bool objectDetected = false; // Флаг для проверки наличия объекта
bool echoLost = true; // Флаг для проверки потери эхо
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(lockPin, OUTPUT);
pinMode(voicePin1, OUTPUT);
pinMode(voicePin2, OUTPUT);
pinMode(voicePin3, OUTPUT);
pinMode(voicePin4, OUTPUT);
digitalWrite(lockPin, HIGH); // Изначально замок закрыт
if (!rtc.begin()) {
Serial.println("Не удалось найти RTC");
while (1);
}
}
void loop() {
// Получаем текущее время и день недели
DateTime now = rtc.now();
int hour = now.hour();
int minute = now.minute();
int weekday = now.dayOfTheWeek(); // 0 - воскресенье, 1 - понедельник и т.д.
// Проверяем ультразвуковой датчик
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) * 0.0344;
if (distance < 100) { // Если объект на расстоянии 1 м
if (!objectDetected) {
// Открываем замок
digitalWrite(lockPin, LOW);
delay(1500); // Замок открыт на 1.5 секунды
digitalWrite(lockPin, HIGH); // Замок закрывается
// Активируем голосовой модуль на 1.5 секунды
digitalWrite(voicePin1, LOW);
delay(1500);
digitalWrite(voicePin1, HIGH);
// Устанавливаем флаг, что объект обнаружен
objectDetected = true;
lastEchoTime = millis(); // Обновляем время последнего срабатывания
echoLost = false; // Эхо не потеряно
}
} else if (!echoLost && millis() - lastEchoTime > 30000) {
// Если эхо исчезло, устанавливаем задержку на 30 секунд
echoLost = true;
objectDetected = false; // Сбрасываем флаг, чтобы разрешить новое обнаружение
}
// Логика для голосового модуля с учетом времени суток и дней недели
if (hour == 7 && minute >= 0 && minute <= 30 && weekday != 0) {
digitalWrite(voicePin2, LOW); // Приветствие (2)
} else {
digitalWrite(voicePin2, HIGH); // Выключить голосовой модуль
}
if (hour == 16 && minute >= 20 && minute <= 60 && weekday != 5) {
digitalWrite(voicePin3, LOW); // Приветствие (3)
} else {
digitalWrite(voicePin3, HIGH); // Выключить голосовой модуль
}
if (hour == 7 && minute >= 0 && minute <= 30 && weekday == 0) {
digitalWrite(voicePin4, LOW); // Приветствие (4)
} else {
digitalWrite(voicePin4, HIGH); // Выключить голосовой модуль
}
if (hour == 15 && minute >= 20 && minute <= 60 && weekday == 5) {
digitalWrite(voicePin1, LOW); // Приветствие (1)
} else {
digitalWrite(voicePin1, HIGH); // Выключить голосовой модуль
}
delay(100); // Задержка для предотвращения излишних проверок
}
Что добавлено:
- Логика для lockPin:
При обнаружении объекта на расстоянии 1 м, подаётся низкий сигнал на lockPin для открытия замка.
Замок остаётся открыт 1.5 секунды, после чего снова подаётся высокий уровень (замок закрыт).
- Сохранена связь замка и ультразвукового датчика:
Замок открывается только при условии обнаружения объекта, при этом задержка на повторное срабатывание составляет 30 секунд.
- Осталась логика голосового модуля:
Сигнал на голосовой модуль длится 1.5 секунды, синхронизирован с обнаружением объекта.
Таймеры для голосового модуля зависят от времени суток и дней недели.
Спасибо!