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

Комментарии

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

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
Предположение. Если я прав, то исправит можно будет очень просто.
Смотрим код сразу после получения текущего времени не считая вывода, хотя учитывая его. ВИдим строку 44

delay(1000);

Учитывая получение времени и вывод в монитор порта получаем задержку больше 1 секунды, а значит рано или поздно получим пропуск секунды, а от этого и не будет включения звонка. Т.е. тут алгоритм линейный и простой, то включать звонок можно хоть 100 раз подряд , ничего не изменится, то попробуй уменьшить задержку в 10 раз.
В таком коде даже delay(7000) после включения и можно оставить - это ни на что не повлияет.
 
  • Лойс +1
Реакции: Alexhhhhgf

vortigont

★★★★★★✩
24 Апр 2020
941
507
Saint-Petersburg, Russia
но он так же не работает..
так же это как? Тоже делает только 4 звонка из пяти?

так попробуйте (не проверял)

C++:
#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
#define   RING_SECONDS      10

#define   HOURS     60

RTC_DS3231 rtc;

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 + 30,
};

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 ? HIGH : LOW );
            if (dt.second() < RING_SECONDS){
                Serial.print("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(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);
    }
  }
}

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

  // digitalWrite(5, HIGH); не знаю что это

  if (now.dayOfTheWeek() != SUNDAY && now.dayOfTheWeek() != SATURDAY) {  // Если сегодня будний день (Пн...Пт), то...   
    zvonok(now);
  }

  delay(1000);
}
 
  • Лойс +1
Реакции: Alexhhhhgf

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
39
0
1713124047842.png @Старик Похабыч, на второй день работы звонка были все 8 звонков, без проблем. Позже на другой день звонок включился и не выключался. Я в коде изменил задержку на 100. Завтра к 12 дня отпишу, как результат. А если это переместить в воид сетап? Или delay вовсе убрать?
 

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

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

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
39
0
@Старик Похабыч, я слышал, что он два года от батарейки будет работать, погрешность 5 сек в год. Если что, это ерунда через два года в школу заехать и поменять батарейку на модуле.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,723
481
я слышал, что он два года от батарейки будет работать, погрешность 5 сек в год.
Вот именно, что "слышал". Реально он убегает на пару-тройку минут в месяц, иногда и больше. Всё зависит от экземпляра. А через год что будет?
 

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
44
9
Как уже выше заметили, из-за delay() секунда проскакивает и ваше условие секунда в секунду просто не попадает. Используйте операторы сравнения меньше\больше (< \ >) и конструкции if \ else. В таком случае пропажа секунды роли не сыграет и delay() можно оставить. Ниже условный пример для трех первых звонков.

C++:
if (now.dayOfTheWeek() != 6 & now.dayOfTheWeek() != 0) {

    //первый
    if (now.hour() == 8 && now.minute() == 30 ) {
        if (now.second() < 7) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }

    //второй
    else if (now.hour() == 9 && now.minute() == 15 ) {
        if (now.second() < 7) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }

    //третий
    else if (now.hour() == 9 && now.minute() == 25 ) {
        if (now.second() < 7) {
            digitalWrite (relay, LOW);
        }
        else {
            digitalWrite (relay, HIGH);
        }
    }
//...
}
@Старик Похабыч, я слышал, что он два года от батарейки будет работать, погрешность 5 сек в год. Если что, это ерунда через два года в школу заехать и поменять батарейку на модуле.
На личном опыте, частое вкл\выкл схемы по основному питанию вредно, погрешность набегает на глазах. Добавьте к схеме функционал настройки часов (экран "LCD 1602" + кнопки), будут подводить часы без вашей помощи.
 
Изменено:
  • Лойс +1
Реакции: Alexhhhhgf

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
39
0
Завтра это чудо запишу а ардуинку.:
 #include <RTClib.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);        // вход с переключателя (HIGH / LOW)
  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.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 ) {                // первый
        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;
    }     
          }
 

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

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
Вот так можно делать, что бы не дрючить ардуинку в живую, но стоит учесть, что тут идеальный вариант, и такие косяки могут не всплыть: https://wokwi.com/projects/395259684036699137

Еще нашел не то что бы косяк, но 22 строка: выводить сообщение надо когда модуль не найден, а не когда он найден. Причем если он не найден дальше бесполезно что то делать, имеет смысл зациклить там код и скажем мигать светодиодами попеременно сигнализируя об аварии.
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
550
135
А если так попробовать? Проверьте расписание, а то вдруг ошибся где. Хотя не стоит пробовать. Если вдруг какой сбой по питанию и хана, следующий звонок будет только на следующий день. Но можно значение переменной счетчика звонков сохранять в еепром, тогда все будет ОК.
C++:
 #include "RTClib/src/RTClib.h"
     RTC_DS3231 rtc;

//нормальное расписание
     uint8_t hours [16] =   { 8,  9,  9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15};
     uint8_t minutes [16] = {30, 15, 25, 10, 30, 15, 35, 20, 30, 15, 25, 10, 20, 05, 10, 50};

//сокращенное расписание
     uint8_t hour_small [14] =   {8,  9,  9,  9, 10, 10, 10, 11, 11, 12, 12, 12, 12, 13};
     uint8_t minute_small [14] = {30, 5, 10, 45, 0,  35, 50, 25, 40, 15, 20, 55,  0, 35};

    uint8_t i = 0; // переменная счетчика звонков.
    
  #define  relay  2;                 // выход на реле
  #define   switchPin 3             // вход с тумблера

   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);        // задаём сигнал на реле
//  if (!rtc.begin()){
 // Serial.println("Couldn't find RTC");}
  }
     void loop()
 {
    DateTime now = rtc.now();
    if (now.dayOfTheWeek() != 6 /* не Суббота*/ && now.dayOfTheWeek() != 0 /*и не Воскресенье*/)
    {
    if  (digitalRead(switchPin) == PROG_ONE)
    {
     digitalWrite(4, HIGH);
     digitalWrite(5, LOW);
      if (now.hour() == hours [i] && now.minute() == minutes [i])
        {bell();}
       if ( i > 15) i =0;
     }

      if  (digitalRead(switchPin) == PROG_TWO)
    {
      digitalWrite(5, HIGH);
      digitalWrite(4, LOW);
      if (now.hour() == hour_small [i] && now.minute() == minute_small[i])
        {bell();}
       if ( i > 13) i =0;
     }
   }
}


  void bell (void)
  {
           digitalWrite (relay, LOW);
           delay(7000);
           digitalWrite (relay, HIGH);
      i++;
  }
 
Изменено:
  • Лойс +1
Реакции: Alexhhhhgf

vortigont

★★★★★★✩
24 Апр 2020
941
507
Saint-Petersburg, Russia
я выше давал код который не будет сбоить при перезагрузках и избавлен от тучи ифов в луп.
@Alexhhhhgf, ваша портянка выглядит ужасно, используте массив звонков и процедуру.
 
  • Лойс +1
Реакции: Alexhhhhgf

viktor1703

★★★✩✩✩✩
9 Дек 2021
550
135

@vortigont,
"Обидеть художника может каждый". Не у всех же есть пять звезд, а парень в 11 классе только начал изучать программирование и не в профильных институтах, а сам. Вы же понимаете на сколько тернист и некозист путь изучения ЯП, тем более самостоятельно.
 

vortigont

★★★★★★✩
24 Апр 2020
941
507
Saint-Petersburg, Russia
@viktor1703, да я целиком согласен, молодец что старается и делает, вопрос свой грамотно оформил, схему привел.
Многие и этого не могут сделать. Почему бы не помочь? Поэтому я не просто сказал что его код так себе, но и привел готовый улучшеный скетч целиком и без излишних усложнений.
Второй массив для укороченных уроков по аналогии он сможет добавить сам.
 
  • Лойс +1
Реакции: bort707 и viktor1703

bort707

★★★★★★✩
21 Сен 2020
2,924
868
я целиком согласен, молодец что старается и делает,
Но дрючить их надо :) Код как у него в первом посте оставлять нельзя. И это не вопрос красоты - с таким числом ифов отлаживать код фактически невозможно
 
  • Лойс +1
Реакции: vortigont

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
39
0
Парни, спасибо за помощь. Код, который я последний скидывал, пока что работает. Попробую разобраться в тех, которые вы скинули. Если мой код 3 дня будет корректно работать, оставлю его, а нет, буду ваши пробовать записывать.
 

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
44
9
Релешка новая или б\у, где брали? Я бы ее погонял мультиметром на сработку, раз так 100 подряд. Умирающая релешка может 20 раз подряд сработать, следующие 5 нет и т.д.

Закомментируйте весь код после delay(1000), а delay(1000) раскомментируйте. Вместо этого меняйте состояние реле строкой: digitalWrite(relay, !digitalRead(relay));
Подключите щупы мультиметра вместо звонка и наблюдайте. По крайней мере исключим причину неисправного реле.
C++:
 #include <RTClib.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);        // вход с переключателя (HIGH / LOW)
  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.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
*/
    delay(1000);
    digitalWrite (relay, !digitalRead(relay));
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));

//
//    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;
//    }  
          }
UPD: Так же добавил моргание светодиода на плате раз в секунду. Если моргание прекратится, значит зависла плата.
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,201
1,287
Москва
@Alexhhhhgf, Это уже интересно. Залипание никто не отменял конечно, на симулятор все работает.
Тогда так, есть переключатель режимов, его переключение сопровождается переключением светодиодов, в сл. раз при сбое попробуйте переключить режим и проверить переключатся ли светодиоды. Если нет, то от работы реле полностью зависает плата.
Если плата не зависает, то хорошо бы проверить получаемое время с часов, но подключив USB плата перегрузится, можно подключить любой дисплей из наличия и выводить на него время раз в секунду, тогда будет понятно есть ли тут сбой.
 

Zuker

✩✩✩✩✩✩✩
10 Янв 2024
44
9
@viktor1703,
В IDE меню ПКМ 1 клик. А так стараюсь работать с исходником, чтобы ТСу было понятней.
 
Изменено:

vortigont

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