Открытие двери и голосовое приветствие по таймеру

Компоненты:
Ардуино Uno R3
Ультрозвуковой датчик расстояния HC - SR04
Модуль таймера часов DS3231 AT24C32 IIC RTC
Голосовой модуль
Блок реле (если необходимо)

Суть проекта:

  1. При сближение к ультрозвуковому датчику на расстояние 1м с платы ардуино поступает сигнал (желательно низкого уровня) на реле которое разблокирует электронный замок двери. Или образуется замкнутая цепь между двумя свободными пинами на плате ардуино (исключает применение реле).

  2. Таймер:
    Если ультрозвуковой датчик обнаружил объект С 7-00 До 7:30 (кроме Воскресения) - дополнительный вывод на пин (условно 1) платы ардуино сигнала низкого уровня на голосовой модуль
    в другое время пин не задействован.
    В период с 16:20 до 17:00 (кроме Пятницы) - дополнительный вывод на другой пин (условно 2) платы ардуино сигнала низкого уровня на голосовой модуль, в другое время пин не задействован.

  3. С учётом дней недели:
    Только в Воскресение С 7-00 До 7:30 - вывод на другой пин (условно 3) платы ардуино сигнала низкого уровня на голосовой модуль, в другое время пин не задействован.

Только в Пятницу с 15:20 до 17:00 - вывод на другой пин (условно 4) платы ардуино сигнала низкого уровня на голосовой модуль, в другое время пин не задействован.

Итого для таймера задействовано 4 разных пина платы ардуино Uno.

По голосовому модулю, у меня опыт работы есть.

Буду благодарен всем кто откликнется.

Имейте в виду, что датчик расстояния HC - SR04 не способен надежно распознать расстояние до человека в мягкой одежде.
Один метр там вряд ли будет

Не понял, зачем вам внешняя память AT24C32? или имеется в виду та, что на часах припаяна?

Пишите wizard-sen@yandex.ru возможно договоримся

Или htpicc@gmail.com

сижу гадаю, что это…
про котов??
или будильник информатор?
или пыточная камера какая))

Да, та что на часах припаяна

Правила вставки программного кода написаны в поле ввода пустого сообщения.
Вставьте свой код правильно, иначе его никто не будет читать

Будет ли работать этот код?

#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);

  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;

  // Если объект на расстоянии 1 м
  if (distance < 100) {
    if (!objectDetected) {
      // Новый объект обнаружен, активируем голосовой модуль на 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);  // Задержка для предотвращения излишних проверок
}  ```

по этой “логике” у вас приветствие будет повторятся непрерывно в течении 30 минут.
Это то, что вы хотели?

  if (distance < 100) {
    if (!objectDetected) {
      // Новый объект обнаружен, активируем голосовой модуль на 1.5 сек
      digitalWrite(voicePin1, LOW);
      delay(1500);  // Продолжительность сигнала
      digitalWrite(voicePin1, HIGH); ```

Разве это не сработает?

Сработает. И будет срабатывать, пока расстояние до объекта менее 100. Голосовой модуль включится на полторы секунды, тут же включится снова, снова и снова. Пока расстояние снова не увеличится. Поэтому нужно проверять не расстояние до объекта, а факт изменения расстояния - расстояние сократилось до 100 и менее - включился голосовой модуль и, пока расстояние снова не увеличится более 100, голосовой модуль более активироваться не должен

Как я понимаю, вы все тут тестируете исполнителя.)))
Да, встречались у меня такие, что устраивали перекрёстные “ссылки”, в итоге не платя никому.

Если Вам не трудно, проверьте уже изменений скетч. В нем кроме в момент сближения на 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);  // Задержка для предотвращения излишних проверок
}

Что добавлено:

  1. Логика для lockPin:

При обнаружении объекта на расстоянии 1 м, подаётся низкий сигнал на lockPin для открытия замка.

Замок остаётся открыт 1.5 секунды, после чего снова подаётся высокий уровень (замок закрыт).

  1. Сохранена связь замка и ультразвукового датчика:

Замок открывается только при условии обнаружения объекта, при этом задержка на повторное срабатывание составляет 30 секунд.

  1. Осталась логика голосового модуля:

Сигнал на голосовой модуль длится 1.5 секунды, синхронизирован с обнаружением объекта.

Таймеры для голосового модуля зависят от времени суток и дней недели.

Спасибо!

Да нет, этот скеч написал чат gpt. Хочу понять, насколько он исполнительный

Мне не трудно, но не буду - таки это коммерческая тема, а я за заказы не берусь. Ну и другим не мешаю ))

Вы не обижайтесь! Я действительно хотел создал здесь тему, чтобы найти исполнителя. Получил несколько мейлов для связи. Некоторые не отвечают. Другие задают много попутных вопросов и все хотят предоплату или весь гонорар заранее.

Вот и спросил чат gpt как в шутку. Я ему предоставил тот же текст задачи, что здесь.
Он выдал результат, я ещё усложнил за 3 сек получил ответ с разеснениями и распиновкой подключения модулей.

Я не знаю будет ли это работать. Видимо никто не захочет его проверить. Значить сам на практике. Могу потом отписаттся.

Оно и понятно.
Людей, которые внезапно обнаруживают , что могут получить код бесплатно от ЧАТГПТ - становится все больше и больше.

Только смысл в том, что платите-то вы не за код сам по себе, а за то что человек отвечает, что его код работает. И если что не так - исправит ошибку.

Поэтому бесплатно править вам код от робота - это бред.

1 лайк

Скоро за ответ такому чатгптшнику придется брать вперед, как в частной клинике.

А то тратишь на него полдня или день, в итоге получая “а я уже у чатгпт спросил, ничего не надо”.

1 лайк

и правильно, нафиг платить дурачкам, которые бесплатно работают. никогда не понимал челиков бегущих впереди паровоза, пишущих код не договорившись с заказчиком и без предоплаты, хотя б частичной. так им и надо.

2 лайка

Как оказалось на практике, скетч работал не корректно, но после многочисленных правок ИИ решил этот вопрос.

Главное, что я смог менять дату и время онлайн в мониторе порта (было необходимо для теста), а также видеть в мониторе как взаимодействуют модули.

Можно, конечно быть не довольным джи-пи-ти, но это идеальный вариант решение проблем для мелких работ. При этом мгновенная реакция без проволочек и ожидания.

Хочу добавить, что я не кого не обижал и не выкладывал чью ту физическую работу здесь, в расчёте выкатить на шару.

Спасибо всем кто обсуждал эту тему!