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

Zuker

★✩✩✩✩✩✩
10 Янв 2024
75
17
Ну и самое главное, перепроверьте все контакты на несколько раз. Может быть плохой контакт.
В идеале надо избавляться от макетных проводов и все по нормальному пропаивать.
 
Изменено:
  • Лойс +1
Реакции: Alexhhhhgf

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@Старик Похабыч, реле я перед установкой проверял, раз 100 клацало. Завтра проверю на пятом звонке, который не прозвенит щёлкнуть тумблером. Если всё с платой нормально, то или думать что с кодом, или прописать, чтобы она перезагружалась в 17 минут каждого часа,, например. Т.к. в это время звонок не подаётся.

@Zuker, провода все хорошо сидят.

@vortigont, или изменить, чтобы светодиод не горел, а моргал.
 

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

★★★★★★★
14 Авг 2019
4,323
1,319
Москва
@Alexhhhhgf, Я ваш код сегодня пол дня крутил на эмуляторе - он четко срабатывает, а перегружать то можно, но это костыль. Надо что бы не нужно было перегужать
 

vortigont

★★★★★★✩
24 Апр 2020
1,019
542
Saint-Petersburg, Russia
Возможно у вас модуль часов залипает еще, не отвечает или отвечает чепуху. Включите дома его у себя, соберите лог за ночь, чего гадать-то.
Когда вылезают проблемы надо снимать прибор и тестировать по всякому пока не найдете причину. А так поменяю одну строку и понесу завтра в школу вы будете еще долго бегать туда-сюда
 

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
Буду заказывать модуль времени, если дело не в плате

@Старик Похабыч, как эмулятор запустить

@vortigont, а может быть, это из за того, что реле управляется слаботочным током, я прописываю для реле high, а управляю сигналом low
 

vortigont

★★★★★★✩
24 Апр 2020
1,019
542
Saint-Petersburg, Russia
реле управляется слаботочным током, я прописываю для реле high, а управляю сигналом low
вы путаете термины. HIGH, LOW в данном контексте не ток, это логические уровны в которые переводится вывод контроллера "единица" и "ноль".

Вообще если хотите вникнуть и сделать более-менее нормально, то у вас изначально неверный подход к программе. Вы постоянно опрашиваете модуль RTC, в вашем коде тысячи раз в секунду и просто отбрасываете эти рузультаты. В таком режиме модуль может глюкануть (не должен, но вполне может) и тогда ваш код остается без времени вообще, соответсвенно ничего работать не будет, даже если не зависнет сам контроллер и будет исправно реле.
В моём коде выше модуль опрашивается раз в секунуду для простоты, но это тоже неверный подход. Эти RTC модули предназначенны чтобы считывать с них время один раз при загрузке контроллера и заводить свой собственный счетчик в контроллере. Далее вся работа с временем должна вестись на основе программного счетчика в контроллере. Возможно, иногда только (раз в сутки) синхронизироваться с модулем RTC что бы компенсировать дрейф.
Поищите библиотеку работы со временем на ардуино нано, их навалом. И переделайте код так что бы не нужно было постоянно опрашивать модуль RTC. Даже в случае если RTC зависинет, ваш контроллер будет продолжать работать на основе своего таймера пока время сильно не уплывет. На это уйдут недели, а как уплывут, то его можно просто перегрузить вручную, но вы не останетесь без звонков по вине ртц модуля.

Кстати как вы выставили время в модуле-то изначально?
 
  • Лойс +1
Реакции: Vaqtincha

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@vortigont, понял. Я на пк перевёл время на 10 сек назад, с форума Гайвера загрузил скетч (1 строчка какая-то) и всё

Ничего не менял, сегодня уже 7 звонков прозвенело

Уже прозвенели 11 звонков. Думаю, и правда реле глючит. Заказал другую
 

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

★★★★★★★
14 Авг 2019
4,323
1,319
Москва
@vortigont, Совершенно верно!

@Alexhhhhgf,
Из советов что надо бы сделать.
1) Задавать лучше не время выключения звонка, а его длительность, в данном случае 7 секунд.
2) Перенести все время начала звонков в массив. Возможно стоит переводить значения прямо в секунды, типа так:
C++:
buz_om[1]=10*3600+35*60; // выключение в 10:35
Это программно не даст выигрыша, но длинное условие включения будет сильно короче.
3) Разместить все это в начале программы.
4) Подумать как сделать так, что бы при включении звонка условие на включение и выключение выполнялось только один раз (только 1 digitalWrite). Подскажу, состояние пина, которые стоит на вывод можно легко прочитать как обычно. Такое условие даст возможность сделать вменяемую отладку с минимумом лишних выводов в монитор порта.
5) Постараться все сделать не используя в цикле loop delay - это упростит реализацию остальных пунктов
6) Подумать о настройке часов на будущее.
7) Загружать расписание звонков например с карты памяти, которую можно будет считывать при старте устройства. Тоже сильно на будущее.

Вроде ничего принципиально не забыл.
 
  • Лойс +1
Реакции: Alexhhhhgf и vortigont

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
Парни! Сегодня 11 звонок не подался. Тумблер щёлкнул, не среагировал светодиод. Зависла плата.
Мне идёт ещё одна плата и модуль реле. Что можно придумать, если не переписывать код? Я попробовал разобраться в массивах, слабо понял. Понимаю, что надо код сокращать, буду пробовать.
 

Zuker

★✩✩✩✩✩✩
10 Янв 2024
75
17
@Alexhhhhgf, программную авто-перезагрузку платы по таймеру пробовал?
C++:
asm volatile("jmp 0x00");
Если еще не пришел к мысли об оптимизации кода, значит пока так удобно. Главное чтобы устраивало самого.
 
  • Лойс +1
Реакции: Alexhhhhgf

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@Старик Похабыч, не могу в этот сайт вставить свой код, проверить. Я дабивил, чтоб каждые 40 минут посылался сигнал на рестарт. (12 выход)
C++:
 #include <RTClib.h>
    RTC_DS1307 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);        // вход с переключателя (HIGH / LOW)
  digitalWrite(relay, HIGH);        // задаём сигнал на реле
  digitalWrite(7, HIGH);
  pinMode(7, OUTPUT);

  if (rtc.begin()){
  Serial.println("Couldn't find RTC");
  }
    }
     void loop()
{
    DateTime now = rtc.now();
    delay(100);
   
      if (now.minute() == 40 && now.second() < 07 ) {
            digitalWrite (12, LOW);
        }

    switchPinState = digitalRead(switchPin);

     switch (switchPinState) {
     case switchProg::PROG_ONE:
     digitalWrite(4, HIGH);
     digitalWrite(5, LOW);
   
if (now.hour() == 8 && now.minute() == 30 ) {                // первый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 9 && now.minute() == 15 ) {          // второй
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 9 && now.minute() == 25 ) {           // третий
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 10 && now.minute() == 10 ) {           // четвёртый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 10 && now.minute() == 30 ) {           // пятый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 11 && now.minute() == 15 ) {            // шестой
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 11 && now.minute() == 35 ) {            // седьмой
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 12 && now.minute() == 20 ) {            // восьмой
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 12 && now.minute() == 30 ) {            // девятый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 13 && now.minute() == 15 ) {            // десятый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 13 && now.minute() == 25 ) {            // одиннадцатый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
    else if (now.hour() == 14 && now.minute() == 10 ) {           // двинадцатый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 14 && now.minute() == 20 ) {            // тринадцатый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
    else if (now.hour() == 15 && now.minute() == 05 ) {           // четырнадцатый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 15 && now.minute() == 10 ) {           // пятнадцатый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
         else if (now.hour() == 15 && now.minute() == 50 ) {     // шестнадцатый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
        break;

 
     case switchProg::PROG_TWO:
     digitalWrite(5, HIGH);
     digitalWrite(4, LOW);
   
   if (now.hour() == 8 && now.minute() == 30 ) {                // первый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 9 && now.minute() == 05 ) {          // второй
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 9 && now.minute() == 10 ) {           // третий
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 9 && now.minute() == 45 ) {           // четвёртый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 10 && now.minute() == 00 ) {           // пятый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 10 && now.minute() == 35 ) {            // шестой
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 10 && now.minute() == 50 ) {            // седьмой
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 11 && now.minute() == 25 ) {            // восьмой
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 11 && now.minute() == 30 ) {            // девятый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 12 && now.minute() == 05 ) {            // десятый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 12 && now.minute() == 10 ) {            // одиннадцатый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
    else if (now.hour() == 12 && now.minute() == 45 ) {           // двинадцатый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
   else if (now.hour() == 12 && now.minute() == 50 ) {            // тринадцатый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
    else if (now.hour() == 13 && now.minute() == 25 ) {           // четырнадцатый
        if (now.second() < 07) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
     break;
    }    
          }
 

vortigont

★★★★★★✩
24 Апр 2020
1,019
542
Saint-Petersburg, Russia
Я дабивил, чтоб каждые 40 минут посылался сигнал на рестарт
неверно, вы добавили бесконечную перезагрузку в интервале времени :40:00 - :40:07 каждого часа.
А главное какой в этом смысл? Не знаю причину "зависания" (если это вообще "зависание") перезагрузкой вы никак это зависание не предотвратите.
Вы почему-то упорно игнорируете то что вам советуют и продолжаете окостыливать свой корявый код. Ну как знаете....
 
  • Лойс +1
Реакции: Старик Похабыч

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@vortigont, думаю его попробовать загружать

Может она зависать из-за светодиодов мощных? Или плата плохая?

Парни, можете написать код, я пару рублей скину. Хотя бы на 3 включения звонка, а время я сам допишу.
 

Zuker

★✩✩✩✩✩✩
10 Янв 2024
75
17
@Alexhhhhgf, это рабочий исходник кода? Перезагрузка получилась аналогом звонка, который отрабатывает в течении 7 сек. (т.е. пока значение секунд меньше 7). Чтобы сработать один раз, нужно что-то вроде:
C++:
static bool check = false;
if (now.minute() == 40 && check == false ) {
    digitalWrite (12, LOW);
    check = true;
}
if (now.minute() != 40) { check = false; }
Но перезагрузка это временное решение для работы звонка, пока готовите дома новую схему. Такого быть не должно.
Избавиться от delay() можно так:

C++:
static unsigned long globalTimer;
if (millis() - globalTimer >= 1000) {
globalTimer = millis();
   //тут весь код loop (выполняется раз в секунду)
}
В теме накидали много рабочих вариантов. Собирайте дома аналогичную схему и прорабатывайте с нуля каждый момент.

@Alexhhhhgf, светодиоды 5v?
 
Изменено:

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@Zuker, светодиоды 5v. Завтра получу платы, буду пробовать на выходных разбираться.

@viktor1703, надо попробовать, у нас в школе ноутбуков свободных нету. Я у медсестры прошу на 5 минут, иду к звонку и записываю другой скетч, а сидеть около звонка экспериментировать возможности нету.
 

Zuker

★✩✩✩✩✩✩
10 Янв 2024
75
17
@Alexhhhhgf, попробуйте откинуть светодиоды на время, если грешите на них. Вообще оставьте только релешку, а тумблер напрямую в цепь звонка (!!!если может коммутировать напругу звонка!!!), для ручного запуска.
 

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@Zuker,
На звонке стоит выключатель для ручного управления. В субботу будут модули Ардуино, соберу анолагичную схему.
 

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

★★★★★★★
14 Авг 2019
4,323
1,319
Москва
Реле должно быть с опторазвязкой и не питаться о @Alexhhhhgf,
Код не получается загрузить т.к. он залит в моем аккаунте. Надо создать новый и все туда аккуратно перенести (сохранить, загрузит и т.д.)
И действительно у вас прописано 7 секунд перезагрузок, а хватит одного раза. Т.е. условием должно быть строгое равенство.
C++:
if (now.minute() == 40 && now.second() < 07 ) {
            digitalWrite (12, LOW);
        }
И что бы не использовать пин для ресета можно вызывать функцию с адресом 0, где то в ответах это было.

При этом не вижу режима 12-го пин на выход и что бы в начале он устанавливался в HIGH
А 7-ой вижу, что на нем непонятно.

Если зависание происходит из за включения нагрузок, то нет гарантии , что ресет раз в час поможет исправить положение.

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

Zuker

★✩✩✩✩✩✩
10 Янв 2024
75
17
@Alexhhhhgf, в новой !полной! схеме сразу тестируем сработку реле 100 подряд отдельным образом, типа:
C++:
delay(1000);
digitalWrite(relay, !digitalRead(relay));
Так же можно потестить имитацию ускоренного времени, где за 1 секунду будет проходить 5 минут. Чтобы наглядно проследить сработку реле по всем временным отрезкам в коде. За временем наблюдаем в отладке порта.
C++:
#include <RTClib.h>
DateTime now;
RTC_DS1307 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);        // вход с переключателя (HIGH / LOW)
  digitalWrite(relay, HIGH);        // задаём сигнал на реле
  digitalWrite(7, HIGH);
  pinMode(7, OUTPUT);

  if (rtc.begin()) {
    Serial.println("Couldn't find RTC");
  }
  now = DateTime(2000, 1, 1, 8, 0, 0); //тестовое стартовое время, 8 часов 0 мин
}
void loop()
{
  delay(1000);
  now = now + TimeSpan(0, 0, 5, 0); //толкаем время на 5 минут (каждую секунду)
  Serial.println( String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second()) ) ;
  //if (now.minute() == 40 && now.second() < 07 ) {
  //  digitalWrite (12, LOW);
  //}

  switchPinState = digitalRead(switchPin);

  switch (switchPinState) {
    case switchProg::PROG_ONE:
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);

      if (now.hour() == 8 && now.minute() == 30 ) {                // первый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 9 && now.minute() == 15 ) {          // второй
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 9 && now.minute() == 25 ) {           // третий
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 10 && now.minute() == 10 ) {           // четвёртый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 10 && now.minute() == 30 ) {           // пятый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 11 && now.minute() == 15 ) {            // шестой
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 11 && now.minute() == 35 ) {            // седьмой
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 12 && now.minute() == 20 ) {            // восьмой
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 12 && now.minute() == 30 ) {            // девятый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 13 && now.minute() == 15 ) {            // десятый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 13 && now.minute() == 25 ) {            // одиннадцатый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 14 && now.minute() == 10 ) {           // двинадцатый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 14 && now.minute() == 20 ) {            // тринадцатый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 15 && now.minute() == 05 ) {           // четырнадцатый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 15 && now.minute() == 10 ) {           // пятнадцатый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 15 && now.minute() == 50 ) {     // шестнадцатый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      break;


    case switchProg::PROG_TWO:
      digitalWrite(5, HIGH);
      digitalWrite(4, LOW);

      if (now.hour() == 8 && now.minute() == 30 ) {                // первый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 9 && now.minute() == 05 ) {          // второй
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 9 && now.minute() == 10 ) {           // третий
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 9 && now.minute() == 45 ) {           // четвёртый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 10 && now.minute() == 00 ) {           // пятый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 10 && now.minute() == 35 ) {            // шестой
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 10 && now.minute() == 50 ) {            // седьмой
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 11 && now.minute() == 25 ) {            // восьмой
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 11 && now.minute() == 30 ) {            // девятый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 12 && now.minute() == 05 ) {            // десятый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 12 && now.minute() == 10 ) {            // одиннадцатый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 12 && now.minute() == 45 ) {           // двинадцатый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 12 && now.minute() == 50 ) {            // тринадцатый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      else if (now.hour() == 13 && now.minute() == 25 ) {           // четырнадцатый
        if (now.second() < 07) {
          digitalWrite (relay, LOW);
        }
        else {
          digitalWrite (relay, HIGH);
        }
      }
      break;
  }
}
 
Изменено:

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@Zuker, спасибо. Исправил свою опечатку про рестарт Ардуино. Сейчас на время изучения своих ошибок, Ардуино в 12 минут каждого часа перезагружается.

В 13 15 звонка не было. Через 20 секунд я его подал. При переключении тумблера светодиод реагирует.
 

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

★★★★★★★
14 Авг 2019
4,323
1,319
Москва
Я говорил, что перезагрузка не исправит возможные косяки в аппаратной части.

Если светодиод реагирует, то плата не зависла, если звонка не было, то либо не выполнилось условие, либо ошибка в цепи. В идеальных условиях код выполняется верно, значит единственной причиной невыполнения кода могут быть неверные данные полученные с часов (т.е. какая то белиберда) - это надо проверить выводом на дисплей текущего времени или постоянным выводом в монитор порта, а это не возможно , как я понял. Это что касается программной части.
Что касается аппаратной. Начинать надо с варианта сработало реде или нет. Если нет, то виновато либо реле, либо мк (см. выше) . Если сработало, то что то с контактами между звонком и реле.