ARDUINO Реле автоматической подачи школьного звонка.

Реле автоматической подачи школьного звонка.
Доброй ночи, дорогие форумчане!
Еще 3 недели назад пришла идеальная идея в голову: т.к. я заканчиваю 11 класс, решил подарить школе "умную систему".
В Arduino ничего не соображал, собрал схему на nano и часах реального времени с реле. Начал пробывать писать код, кое в чем разобрался.
Всё заработало! Браво!
Думаю, так можно добавить туда ещё и сокращённое расписание. Поставил тумблер, разобрался в switch case .
И у меня уже работает реле для школы. Зачем время тянуть? На выходных его подсоединил, все в восторге.
Понедельник.. Первый день новых технологий. Первый, второй, третий, четвёртый звонки подавались сами, я был доволен.
(Раньше надо было спускаться на 1ый этаж и нажимать выключатель, чтобы подать звонок)
Хоп! Пятого звонка не прозвенело. Я пулей побежал на первый этаж, подал звонок, отключил и включил на Arduino
o питание и следующие 4 звонка опять прозвенели, а пятого не прозвучало.. Решил убрать switch case (расписание сокращённых уроков удалил). На следующий день проверил, опять такая же ерунда! В общем уже 2 недели я в школе страдаю фигнёй, пытаюсь исправить код, уже просто устал. Что только не пробывал.
Мне написали другой, якобы "лучший код", но он так же не работает.. Дорогие форумчане, я у Вас прошу помощи, что может быть не так?
Мой код, который работает, но ардуино с ним засыпает.:
#include <RTClib.h>
#include <Time.h>
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int relay = 2;      //выход на реле
#define   switchPin 3
uint8_t   switchPinState;

enum switchProg : uint8_t {
  PROG_ONE = 0,           // Если переключатель в положении GND
  PROG_TWO = 1            // Если переключатель в положении VCC
};
void setup()
{
  Serial.begin(9600);
  pinMode(relay, OUTPUT); //выход на реле
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(switchPin, INPUT);
  digitalWrite(relay, HIGH);
  if (rtc.begin()){
  Serial.println("Couldn't find RTC");

  }}
void loop()
{
    DateTime now = rtc.now();

    Serial.println("Current Date & Time: ");
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
delay(1000);

switchPinState = digitalRead(switchPin);

  switch (switchPinState) {
    case switchProg::PROG_ONE:

digitalWrite(4, HIGH);
digitalWrite(5, LOW);

if (now.hour() == 8 && now.minute() == 30 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (relay, LOW);
}
if (now.hour() == 8 && now.minute() == 30 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (relay, HIGH);
}
if (now.hour() == 9 && now.minute() == 15 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 9 && now.minute() == 15 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 9 && now.minute() == 25 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 9 && now.minute() == 25 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 10 && now.minute() == 10 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 10 && now.minute() == 10 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 10 && now.minute() == 30 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 10 && now.minute() == 30 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 11 && now.minute() == 15 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 11 && now.minute() == 15 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 11 && now.minute() == 35 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 11 && now.minute() == 35 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 12 && now.minute() == 20 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 12 && now.minute() == 20 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 12 && now.minute() == 30 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 12 && now.minute() == 30 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 13 && now.minute() == 15 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 13 && now.minute() == 15 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 13 && now.minute() == 25 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 13 && now.minute() == 25 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 14 && now.minute() == 10 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 14 && now.minute() == 10 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 14 && now.minute() == 20 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 14 && now.minute() == 20 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 15 && now.minute() == 05 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 15 && now.minute() == 05 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 15 && now.minute() == 10 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 15 && now.minute() == 10 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 15 && now.minute() == 55 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 15 && now.minute() == 55 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}

break;

   
case switchProg::PROG_TWO:

digitalWrite(5, HIGH);
digitalWrite(4, LOW);

if (now.hour() == 8 && now.minute() == 30 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (relay, LOW);
}
if (now.hour() == 8 && now.minute() == 30 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (relay, HIGH);
}
if (now.hour() == 9 && now.minute() == 10 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 9 && now.minute() == 10 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 9 && now.minute() == 45 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 9 && now.minute() == 45 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 10 && now.minute() == 00 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 10 && now.minute() == 00 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 10 && now.minute() == 35 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 10 && now.minute() == 35 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 10 && now.minute() == 50 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 10 && now.minute() == 50 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 11 && now.minute() == 25 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 11 && now.minute() == 25 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 11 && now.minute() == 30 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 11 && now.minute() == 30 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 12 && now.minute() == 05 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 12 && now.minute() == 05 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 12 && now.minute() == 10 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 12 && now.minute() == 10 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 12 && now.minute() == 45 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 12 && now.minute() == 45 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 12 && now.minute() == 50 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 12&& now.minute() == 50 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
if (now.hour() == 13 && now.minute() == 25 && now.second() == 00 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, LOW);
}
if (now.hour() == 13 && now.minute() == 25 && now.second() == 07 && (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0))
{
digitalWrite (2, HIGH);
}
      break;
     default:
      break;
  }        }
1713123632535.png
Код, который мне написали, но он не работает.:
#include <RTClib.h>       // https://github.com/adafruit/RTClib

#define   relePin   2
#define   ON        LOW
#define   OFF       HIGH
#define   LED       13

#define   SUNDAY    0
#define   SATURDAY  6

RTC_DS3231 rtc;

char daysOfTheWeek[7][10] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

DateTime now = rtc.now();

uint32_t  prevMillis;

void setup() {

  pinMode(relePin, OUTPUT);       // выход на реле
  pinMode(LED, OUTPUT);           // Встроенный светодиод, например на Nano имеется...
 
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  digitalWrite(4, HIGH);

  digitalWrite(relePin, HIGH);
  digitalWrite(LED,     LOW);

  Serial.begin(9600);             // Скорость Serial-порта

  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1) {                               // Бесконечный цикл, так как RTC не найден.
      digitalWrite(LED, !digitalRead(LED));   // И мигаем при этом встроенным светодиодом, сообщая о проблеме...
      delay(1000);
    }
  }
  prevMillis = millis();
}

void loop() {

  uint16_t  m_year          = now.year();
  uint8_t   m_month         = now.month();
  uint8_t   m_day           = now.day();
  uint8_t   m_dayOfTheWeek  = now.dayOfTheWeek();
  uint8_t   m_hour          = now.hour();
  uint8_t   m_minute        = now.minute();
  int8_t    m_second        = now.second();

  if (millis() - prevMillis >= 1000) {
    prevMillis = millis();
    Serial.println("Current Date & Time: ");
    Serial.print(m_year,  DEC);
    Serial.print('/');
    Serial.print(m_month,  DEC);
    Serial.print('/');
    Serial.print(m_day,    DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[m_dayOfTheWeek]);
    Serial.print(") ");
    Serial.print(m_hour,   DEC);
    Serial.print(':');
    Serial.print(m_minute, DEC);
    Serial.print(':');
    Serial.print(m_second, DEC);
    Serial.println();
  }
 digitalWrite(5, HIGH);
  if (m_dayOfTheWeek != SUNDAY && m_dayOfTheWeek != SATURDAY) {  // Если сегодня будний день (Пн...Пт), то...
    
    if (m_hour == 8 && m_minute == 30) {
      if (m_second <= 7) {
        digitalWrite (relePin, ON);
      } else {
        digitalWrite (relePin, OFF);
      }
    }

    if (m_hour == 9 && m_minute == 15) {
      if (m_second <= 7) {
        digitalWrite (relePin, ON);
      } else {
        digitalWrite (relePin, OFF);
      }
    }

    if (m_hour == 9 && m_minute == 25) {
      if (m_second <= 7) {
        digitalWrite (relePin, ON);
      } else {
        digitalWrite (relePin, OFF);
      }
    }

    if (m_hour == 10 && m_minute == 10) {
      if (m_second <= 7) {
        digitalWrite (relePin, ON);
      } else {
        digitalWrite (relePin, OFF);
      }
    }

    if (m_hour == 10 && m_minute == 30) {
      if (m_second <= 7) {
        digitalWrite (relePin, ON);
      } else {
        digitalWrite (relePin, OFF);
      }
    }
  }
}
 

Комментарии

vortigont

★★★★★★✩
24 Апр 2020
941
507
Saint-Petersburg, Russia
@Alexhhhhgf,
вот вам дуракоупорный код

При загрузке подключает RTC модуль и считывает время, если модуль не найдет - часто мигает диодом на плате.
При работе не дергает RTC модуль вообще и не зависит от его зависаний/отвала.
Пока код жив - мигает диодом раз в секунду. Пока звенит звонок - диод горит непрерывно.
В консоль выводит рабочее расписание 1 или 2 и текущую дату каждую секунду.

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

Синхронизацию системного времени с РТЦ модулем раз в сутки оставляю вам в качестве домашки.
 
  • Лойс +1
Реакции: Alexhhhhgf

Старик Похабыч

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
@vortigont, А вот тут кстати вариант с ресетом платы - например после того как отзвенел звонок можно сделать ресет и тогда будет синхронизация, но это такое костыльное решение.
 

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
39
0
@vortigont, Пробывал, при переключении тумблера светодиоды НЕ реагируют ( OUTPUT 4 и 5). Строка #75 к чему? Вписал в первое расписание время, на сайте не работает, в живую на макетной плате тоже.

@vortigont, можно было бы попробовать, чтобы, если расписание 1, моргал светодиод 4, вместо 13. А если расписание 2, то моргал 5 светодиод. Доделай пожалуйста, я тебя как следует отблагодарю

Вот это я лоханулся. Сегодня же суббота, а он по выходным не звенит
 
Изменено:

vortigont

★★★★★★✩
24 Апр 2020
941
507
Saint-Petersburg, Russia
в светодиодах и тумблере я не разбирался т.к. я не знаю как у вас тумблер подключен и какие на пинах уровни должны быть. Схему я скопировал со скетча Похабыча, допишите эту часть сами.
 

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
39
0
С вашей помощью что-то накалякал. Завтра проверю, как будет работать, сделал, чтобы в воскресенье он работал пока что. В Понедельник буду молиться.
Уфф:
#include <RTClib.h>       // https://github.com/adafruit/RTClib
#include <TimeLib.h>      // https://github.com/PaulStoffregen/Time


#define   relePin   2
#define   LED       13    // built-in led
#define   SWITCH_PIN    3

#define   SUNDAY    0
#define   SATURDAY  6
#define   RING_SECONDS      7

#define   TZ_OFFSET 180   // MSK

#define   HOURS     60

RTC_DS3231 rtc;

bool status_led = false;

const char* daysOfTheWeek[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

const uint16_t raspisanie[] = {
    8 * HOURS + 30,
    9 * HOURS + 15,
    9 * HOURS + 25,
    10 * HOURS + 10,
    10 * HOURS + 30,
    11 * HOURS + 15,
    11 * HOURS + 35,
    12 * HOURS + 20,
    12 * HOURS + 30,
    13 * HOURS + 15,
    13 * HOURS + 25,
    14 * HOURS + 10,
    14 * HOURS + 20,
    15 * HOURS + 5,
    15 * HOURS + 10,
    15 * HOURS + 50,
};

const uint16_t raspisanie2[] = {
    8 * HOURS + 30,
    9 * HOURS + 5,
    9 * HOURS + 10,
    9 * HOURS + 45,
    10 * HOURS + 1,
    10 * HOURS + 35,
    10 * HOURS + 50,
    11 * HOURS + 25,
    11 * HOURS + 30,
    12 * HOURS + 5,
    12 * HOURS + 10,
    12 * HOURS + 45,
    12 * HOURS + 50,
    13 * HOURS + 25,
};


void zvonok(DateTime &dt){
    for (int i = 0; i != sizeof(raspisanie)/sizeof(uint16_t); ++i ){
      if ( (dt.hour() * HOURS + dt.minute()) == raspisanie[i] ){
          digitalWrite(relePin, dt.second() < RING_SECONDS ? LOW : HIGH );
          if (digitalRead(relePin)) digitalWrite(LED_BUILTIN, HIGH);
          if (dt.second() < RING_SECONDS){
              Serial.print("Raspisanie 1: Ring for ");
              Serial.print(RING_SECONDS - dt.second());
              Serial.println(" seconds more");
          }
      }
    }       
};

void zvonok2(DateTime &dt){
    for (int i = 0; i != sizeof(raspisanie2)/sizeof(uint16_t); ++i ){
      if ( (dt.hour() * HOURS + dt.minute()) == raspisanie2[i] ){
          digitalWrite(relePin, dt.second() < RING_SECONDS ? LOW : HIGH );
          if (digitalRead(relePin)) digitalWrite(LED_BUILTIN, HIGH);
          if (dt.second() < RING_SECONDS){
              Serial.print("Raspisanie 2: Ring for ");
              Serial.print(RING_SECONDS - dt.second());
              Serial.println(" seconds more");
          }
      }
    }       
};


void setup() {

  pinMode(relePin, OUTPUT);       // выход на реле
  pinMode(LED, OUTPUT);           // Встроенный светодиод, например на Nano имеется...
 
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);

  digitalWrite(relePin, HIGH);
  digitalWrite(LED,     LOW);

  Serial.begin(9600);             // Скорость Serial-порта

  while (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    digitalWrite(LED, !digitalRead(LED));   // И мигаем при этом встроенным светодиодом, сообщая о проблеме...
    delay(200);
  }

  DateTime time_now = rtc.now();
  adjustTime(TZ_OFFSET * SECS_PER_MIN);
  setTime(time_now.hour(), time_now.minute(), time_now.second(), time_now.day(), time_now.month(), time_now.year());
}

void loop() {
   //DateTime time_now = rtc.now();

    DateTime time_now = now();    // use internal clock
    Serial.print("Raspisanie: ");
    Serial.println(digitalRead(SWITCH_PIN) ? 1 : 2 );
    Serial.print("Current Date & Time: ");
    Serial.print(time_now.year(),  DEC);
    Serial.print('/');
    Serial.print(time_now.month(),  DEC);
    Serial.print('/');
    Serial.print(time_now.day(),    DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[time_now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(time_now.hour(),   DEC);
    Serial.print(':');
    Serial.print(time_now.minute(), DEC);
    Serial.print(':');
    Serial.print(time_now.second(), DEC);
    Serial.println();



  digitalWrite(LED_BUILTIN, status_led);
  status_led = !status_led;

  //if (time_now.dayOfTheWeek() != SUNDAY) {  // Если сегодня не воскресенье.
    if (digitalRead(SWITCH_PIN)){
      zvonok(time_now);
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);
    } else {
      zvonok2(time_now);
      digitalWrite(5, HIGH);
      digitalWrite(4, LOW);
    }
 // }
 if (time_now.hour() == 8) {
  if (time_now.minute() == 1 && time_now.second() == 1) {
    DateTime time_now = rtc.now();
      }
  }
  delay(1000);
}
 

vortigont

★★★★★★✩
24 Апр 2020
941
507
Saint-Petersburg, Russia
@Alexhhhhgf,
C++:
if (time_now.hour() == 8) {
  if (time_now.minute() == 1 && time_now.second() == 1) {
    DateTime time_now = rtc.now();
  }
}
вот здесь ничего не происходит, вы просто запросили время из ртц, но никуда его не сохранили
 

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
39
0
setTime(time_now.hour(), time_now.minute(), time_now.second(), time_now.day(), time_now.month(), time_now.year());
А если это добавить

C++:
#include <RTClib.h>       // https://github.com/adafruit/RTClib
#include <TimeLib.h>      // https://github.com/PaulStoffregen/Time


#define   relePin   2
#define   LED       13    // built-in led
#define   SWITCH_PIN    3

#define   SUNDAY    0
#define   SATURDAY  6
#define   RING_SECONDS      7

#define   TZ_OFFSET 180   // MSK

#define   HOURS     60

RTC_DS3231 rtc;

bool status_led = false;

const char* daysOfTheWeek[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

const uint16_t raspisanie[] = {
    8 * HOURS + 30,
    9 * HOURS + 15,
    9 * HOURS + 25,
    10 * HOURS + 10,
    10 * HOURS + 30,
    11 * HOURS + 15,
    11 * HOURS + 35,
    12 * HOURS + 20,
    12 * HOURS + 30,
    13 * HOURS + 15,
    13 * HOURS + 25,
    14 * HOURS + 10,
    14 * HOURS + 20,
    15 * HOURS + 5,
    15 * HOURS + 10,
    15 * HOURS + 50,
};

const uint16_t raspisanie2[] = {
    8 * HOURS + 30,
    9 * HOURS + 5,
    9 * HOURS + 10,
    9 * HOURS + 45,
    10 * HOURS + 1,
    10 * HOURS + 35,
    10 * HOURS + 50,
    11 * HOURS + 25,
    11 * HOURS + 30,
    12 * HOURS + 5,
    12 * HOURS + 10,
    12 * HOURS + 45,
    12 * HOURS + 50,
    13 * HOURS + 25,
};


void zvonok(DateTime &dt){
    for (int i = 0; i != sizeof(raspisanie)/sizeof(uint16_t); ++i ){
      if ( (dt.hour() * HOURS + dt.minute()) == raspisanie[i] ){
          digitalWrite(relePin, dt.second() < RING_SECONDS ? LOW : HIGH );
          if (digitalRead(relePin)) digitalWrite(LED_BUILTIN, HIGH);
          if (dt.second() < RING_SECONDS){
              Serial.print("Raspisanie 1: Ring for ");
              Serial.print(RING_SECONDS - dt.second());
              Serial.println(" seconds more");
          }
      }
    }       
};

void zvonok2(DateTime &dt){
    for (int i = 0; i != sizeof(raspisanie2)/sizeof(uint16_t); ++i ){
      if ( (dt.hour() * HOURS + dt.minute()) == raspisanie2[i] ){
          digitalWrite(relePin, dt.second() < RING_SECONDS ? LOW : HIGH );
          if (digitalRead(relePin)) digitalWrite(LED_BUILTIN, HIGH);
          if (dt.second() < RING_SECONDS){
              Serial.print("Raspisanie 2: Ring for ");
              Serial.print(RING_SECONDS - dt.second());
              Serial.println(" seconds more");
          }
      }
    }       
};


void setup() {

  pinMode(relePin, OUTPUT);       // выход на реле
  pinMode(LED, OUTPUT);           // Встроенный светодиод, например на Nano имеется...
 
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);

  digitalWrite(relePin, HIGH);
  digitalWrite(LED,     LOW);

  Serial.begin(9600);             // Скорость Serial-порта

  while (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    digitalWrite(LED, !digitalRead(LED));   // И мигаем при этом встроенным светодиодом, сообщая о проблеме...
    delay(200);
  }

  DateTime time_now = rtc.now();
  adjustTime(TZ_OFFSET * SECS_PER_MIN);
  setTime(time_now.hour(), time_now.minute(), time_now.second(), time_now.day(), time_now.month(), time_now.year());
}

void loop() {
   //DateTime time_now = rtc.now();

    DateTime time_now = rtc.now();
    setTime(time_now.hour(), time_now.minute(), time_now.second(), time_now.day(), time_now.month(), time_now.year());
//    DateTime time_now = now();    // use internal clock
    
    /*
    Serial.print("Raspisanie: ");
    Serial.println(digitalRead(SWITCH_PIN) ? 1 : 2 );
    Serial.print("Current Date & Time: ");
    Serial.print(time_now.year(),  DEC);
    Serial.print('/');
    Serial.print(time_now.month(),  DEC);
    Serial.print('/');
    Serial.print(time_now.day(),    DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[time_now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(time_now.hour(),   DEC);
    Serial.print(':');
    Serial.print(time_now.minute(), DEC);
    Serial.print(':');
    Serial.print(time_now.second(), DEC);
    Serial.println();
*/


  digitalWrite(LED_BUILTIN, status_led);
  status_led = !status_led;

  if (time_now.dayOfTheWeek() != SUNDAY) {  // Если сегодня не воскресенье.
    if (digitalRead(SWITCH_PIN)){
      zvonok(time_now);
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);
    } else {
      zvonok2(time_now);
      digitalWrite(5, HIGH);
      digitalWrite(4, LOW);
    }
  }
 
  delay(1000);
}
для себя вставил его
 

vortigont

★★★★★★✩
24 Апр 2020
941
507
Saint-Petersburg, Russia
@Alexhhhhgf,

C++:
    DateTime time_now = rtc.now();
    setTime(time_now.hour(), time_now.minute(), time_now.second(), time_now.day(), time_now.month(), time_now.year());
//    DateTime time_now = now();    // use internal clock
вы хоть немного думаете что вы делате, нет? Или просто копипастите навскидку не видя дальше одной строчки? Вы опять запихали опрос времени с РТЦ модуля в каждом цикле, хотя я специально объяснял почему этого делать не нужно. Используйте луче тот код что вам дали вообще без отсебятины - меньше ошибок сделаете.
 

vortigont

★★★★★★✩
24 Апр 2020
941
507
Saint-Petersburg, Russia
@Alexhhhhgf, Пока вы не выяните причину того что у вас вообще звонок не звенит вам какая разница насколько он уходит-то? Ну будет у вас точное время, но не будет звонков :) Вы сначала решите основную проблему, а потом будете проводить "оптимизации".
 

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
44
9
Если есть трудности с пониманием кода, забивайте вопросы\код в бесплатную нейросетку, типа beta.theb.ai (бесплатная версия на gtp 3.5 turbo, но нужен рег по почте). Быстрее придете к пониманию. Только перепроверяйте все на практике, т.к. иногда пишет хрень.
К слову, использую такой же модуль времени и обновляю запрос раз в 1 сек. Отставаний не наблюдаю.
Возвращайтесь на свой старый код, он рабочий, иначе закопаетесь еще сильней. А фичу сделать хочется.

Есть возможность докупить модуль дисплея для наблюдения за временем? https://www.ozon.ru/product/simvolnyy-displey-1602-i2c-konverter-raspayan-zelenyy-268171271/
 
Изменено:
  • Лойс +1
Реакции: Alexhhhhgf

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
39
0
@vortigont, в понедельник звонок отработал, как положено. Сегодня тоже понаблюдаю за ним. Парни спасибо всем большое

В 9:25 Звонок не подался. Диод на плате светился, не моргал. Ардуино и реле я ставил новую, заранее проверял. Я в ахуэ
 

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
44
9
Пробовали подключать только ардуину и релешку? Без всего остального. Надо заменить\перебрать всю распай.коробку. Каждую деталь, проводок.
 
Изменено:

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
39
0
@Zuker, пробовал, всё работало. 2 дня звонок я не трогал. Был включенный с воскресенья. Я думаю, это из-за получения времени в void loop
 

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
44
9
@Alexhhhhgf, я правильно понял, с 21.04 к ардуинке было подключено только реле и это работало до 22.04, но 23.04 в 9:25 звонок уже не прозвенел? Расписание было при этом по умолчанию правильное для 21.04 - 22.04, и для 23.04? Ведь тумблер откинут, а время 9:25 у вас есть только в одном расписании.

Вы подключались к ардуинке сегодня, время в мониторе порта вроде у вас выводится, оно было правильное? Каждый раз тыкайтесь ноутом и смотрите время, появился ли разброс. Если разброса нет, дело в другом.
 
Изменено:

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
39
0
@Zuker В воскресенье я сделал звонок, поставил ткдп заведомо рабочую Ардуино и реле. Сделал, чтобы каждую секунду Ардуино дергало часы и спрашивало время. Через 40 часов Ардуино зависло. Диод на плате не моргал. Я отключилл питание и включил, звонок щяс работает. Как сделать, чтобы он раз в час время с ртц спрашивал?
 

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
44
9
@Alexhhhhgf, можно фотку реле или ссылку, где брали.

Еще варианты для эксперимента:

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

2. Блок питания на основной ардуинке меняем на другой, или берем от 7v до 12v и подключаем на контакты VIN \ GND

3. Меняем пины для реле
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
Как сделать, чтобы он раз в час время с ртц спрашивал?
Сделать можно, но какой в этом смысл если не известна причина зависания ?
Никси часы опрашивают модуль по разному, обычно раз в 15 минут и работают годами без зависания. Но там нет реле, а это очень капризная штука.