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

Комментарии

Zuker

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

Alexhhhhgf

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

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

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

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

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

vortigont

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

Alexhhhhgf

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

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

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

vortigont

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

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

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

Alexhhhhgf

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

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

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

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

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
@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
39
0
Парни! Сегодня 11 звонок не подался. Тумблер щёлкнул, не среагировал светодиод. Зависла плата.
Мне идёт ещё одна плата и модуль реле. Что можно придумать, если не переписывать код? Я попробовал разобраться в массивах, слабо понял. Понимаю, что надо код сокращать, буду пробовать.
 

Zuker

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

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
39
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
941
507
Saint-Petersburg, Russia
Я дабивил, чтоб каждые 40 минут посылался сигнал на рестарт
неверно, вы добавили бесконечную перезагрузку в интервале времени :40:00 - :40:07 каждого часа.
А главное какой в этом смысл? Не знаю причину "зависания" (если это вообще "зависание") перезагрузкой вы никак это зависание не предотвратите.
Вы почему-то упорно игнорируете то что вам советуют и продолжаете окостыливать свой корявый код. Ну как знаете....
 
  • Лойс +1
Реакции: Старик Похабыч

Alexhhhhgf

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

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

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

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
44
9
@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
39
0
@Zuker, светодиоды 5v. Завтра получу платы, буду пробовать на выходных разбираться.

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

Zuker

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

Alexhhhhgf

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

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

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

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

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

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

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
44
9
@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
39
0
@Zuker, спасибо. Исправил свою опечатку про рестарт Ардуино. Сейчас на время изучения своих ошибок, Ардуино в 12 минут каждого часа перезагружается.

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

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

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

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