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

Комментарии

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@Старик Похабыч, диод на плате перестал моргать. Я переключил тумблер. Плата среагировала. Два раза перезапустил, диод не моргает. Остановил видео, и диод заморгал.


Мб питание подать не на 5v pin, а на мини юсб

А ещё эта проводка, которая идёт на звонок херовая. Я думаю, там падение напряжения большое
 

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

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
У меня как то была проблема с дисплеем на i2c, он зависал, мне пришлось в сетапе перезапустить отдельно эту шину. Тут, возможно, из за наводок шина подвисает. Можно попробовать после отработки звонка сделать
C++:
Wire.end();
// тут может какую то задержку прописать небольшую
Wire.begin();
А может изменить частоту тактирования
 
  • Лойс +1
Реакции: vortigont

Zuker

★✩✩✩✩✩✩
10 Янв 2024
56
12
Меня смущает этот тумблер для режима расписания. Его бы сделать просто кнопкой с подтяжкой (INPUT_PULLUP), т.е. чтобы не соприкасалась с 5v напрямую https://alexgyver.ru/lessons/arduino-buttons/

Кстати, напругу 5v измеряли во время работы звонка?
 
Изменено:

Zuker

★✩✩✩✩✩✩
10 Янв 2024
56
12
@Alexhhhhgf, быстрее будет в коде поменять. А провод от тумблера до линии 5v убрать.
C++:
pinMode(switchPin, INPUT_PULLUP); //D3
При использовании БП напрямую в 5V мне кажется вредным брать питание еще и на кнопки. Хотя я так не запитывался никогда. Может кто-то другой знающий подскажет. Тут нужен хороший стабилизированый бп. Тестируйте другую запитку.
 
Изменено:
  • Лойс +1
Реакции: Alexhhhhgf

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@Zuker, прикол в том, что я взял туда потрёпанный запядник от телефона. Выдавал он ровно 5 вольт. Периодически он пищит тихонько

Ахаххках, мозги всем проморочил

@Alexhhhhgf, а пищал из-за слабого напряжения.
 

Вложения

Zuker

★✩✩✩✩✩✩
10 Янв 2024
56
12
@Alexhhhhgf, смотрю сейчас характеристики своих зарядников в доме, все работают в диапазоне 100-240 вольт. Так что хз. Сам БП сколько выдает?
 

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@Zuker, я поставил другой БП. Прошлый выдавал при 220в 5.00вольт
Этот выдает 5.10 вольт.
Я уверен, что на этой линии просадки напряжения до 120вольт
 

Zuker

★✩✩✩✩✩✩
10 Янв 2024
56
12
@Alexhhhhgf, Для запитки в контакт 5V отклонение +- вредно. Если с ардуинкой так и будет затык, можно попробовать другой контроллер - ESP.
Почитайте мануал от AlexGyver по питанию: https://alexgyver.ru/lessons/arduino-power/
 
Изменено:

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@Zuker, я кстати вчера поменял там блок и запитал через юсб

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

Мб из-за того, что с тумблера плюс в без резистора в плату вставлен.

Может имеет эээ то важность.
Два зелёных светодиода, которые на звонке у меня стоят индикаторами расписания (сокращённое или нет). Один из светодиодов 5V, который показывает обычное расписание вчера утром горел тускло. Подгорел диод, не плата. Как?
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
а код-то какой сейчас залит на данный момет? О чем разговаривать-то если кода нет. Если диод горит непрерывно, значит код заблокирован на какой-то операции, убирайте из кода всё по частям пока не найдёте проблемный участок.
 

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@vortigont, Код залит, который я последний скидывал. Я убрал из него тумблер. Прописал define switchPIN LOW
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
@Alexhhhhgf, если вы про этот, то я вам уже говорил в чем там потенциальная проблема. Похабыч вам тоже самое говорил, но продолжайте гадать раз вам так нравится.

P.S. и да, перестаньте материться, вам тут не школа :)
 

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

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
Описание бибилиотеки:

setClock() -меняет частоту. Но это все тыканье.

Надо вот как проверить: включить устройство дома, подключить к пк по USB и посмотреть будет ли так зависать. Если нет, то проблема скорее всего в питании. Если да, то хорошо, можно использовать Serial и монитор порта для отладки.
Если открыть пример I2C сканера (Wirescan), то там есть такой кусок кода:
C++:
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0){
      Serial.printf("I2C device found at address 0x%02X\n", address);
      nDevices++;
    } else if(error != 2){
      Serial.printf("Error %d at address 0x%02X\n", error, address);
    }
Он проверяет на доступность устройство с указанным адресом.
В начале все хорошо работает, значит достаточно перед получением данных проверить устройство. Если все ок, то выводить ничего не надо, достаточно выводить при ошибке.
Далее если ошибка выключай Wire как в моем примере, сделай паузу в 200 мс, включай и еще паузу в 200 мс. Далее опять проверь кодом из сканера. Если опять нет устройства - ошибка.
Еще если часы не отвечают, то если на них есть пин ресет, то можно его дернуть.

Если часы ответили, то получаешь время, проверь его на валидность , т.е. Время должно быть больше времени компиляции и не больше скажем времени компиляции плюс 10-20 ЛЕТ! Если нет - ошибка модуля, его надо перезапускать или менять.
Так же можно выводить полученное время в монитор порта, но не каждую секунду, а только после получения для визуального контроля.
 
Изменено:
  • Лойс +1
Реакции: Alexhhhhgf

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
Что только не пробовал, нигде инфы полезной нету. Думаю зависает SCL

Парни, я уже задрался с этой ерундой. Если кто знает, что мне поменять, сделать я денег хорошо заплачу. Я не могу сказать в школе, что это чудо не работает
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
@Alexhhhhgf, вы очень упёртый человек )) игнорируете что вам прямо говорят, делаете по-своему, потом жалуетесь что всё так и не работает :)
Чтобы выяснить зависают ли у вас часы или плата нужно было залить тот код который я вам дал 2 недели назад без всяких изменений кроме расписания в массиве звонков. Всё!
За 2-3 дня всё стало бы ясно. И тогда, достоверно выяснив причину, уже работали бы над исправлением. Но вы пошли своим путём и до сих пор строите догадки походу/не походу...
Зависают у вас наверняка часы на шине, как это обойти/исправить вам подробно расписал похабыч, но вы всё равно навтыкали какой-то отсебятины с инклудом и продолжаете недоумевать.
Так какой помощи вы здесь ждёте? За вас в школу ходить и на месте тестировать никто не будет. Заплатите деньги кому-нибудь из одноклассников, кто просто сможет перечитать эту тему и сделать ровно как тут написано. Отдайте ему прибор и дело с концом.
 
  • Лойс +1
Реакции: Alexhhhhgf

viktor1703

★★★✩✩✩✩
9 Дек 2021
611
145
Может из-за того, что не прописал
Include wire.h
Wire.begin
Нет не из-за этого. Библиотека RTClib подключает библиотеку Adafruit_I2CDevice.h, а та в свою очередь подтягивает заголовочный файл Wire.h и вызывает функцию инициализации шины I2C. Пробуй делать то что старшие говорят. На этом форуме народ добрый и терпеливый, но скоро могут перестать давать советы.
 
  • Лойс +1
Реакции: Alexhhhhgf

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@vortigont, так я этот код и использую уже 2 недели

При работе схемы если отключить реле, плата зависает. В основном зависание через каждые 3-6 звонков. Когда звонок звонит, на плате светодиод не горит.
Проблем по питанию нет. Если оставить работать на ночь, он не зависал.

Сразу же после обработки второго звонка плата зависла. Диод горит непрерывно. После перезапуска диод опять начал моргать.
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
@vortigont, так я этот код и использую уже 2 недели
ну ранее вы приводили другой код, вы уж определитесь там.

При работе схемы если отключить реле, плата зависает
что эта фраза означает? отключить реле от чего, блин? От платы, от нагрузки или от сети?
Забудьте слово "зависает". Контроллеры очень редко "зависают", то что для вас выглядит как завис, на самом деле обычно заблокирован на какой-то операции.

Когда звонок звонит, на плате светодиод не горит.
ну разберитесь с этим сами, поменяйте логический уровень в коде на ножке диода во время звонка, может его просто инвертировать надо. Я не помню как плата уно собрана и каким сигналом на ноге диод зажигается и каким гасится. Делов на 5 минут дома проверить.

Диод горит непрерывно. После перезапуска диод опять начал моргать.
это значит что диод просто не погас после предыдущего цикла моргания а код на чем-то заблокирован. На "чем-то" в вашем коде может быть только в одном месте - на запросе времени из РТЦ модуля. В дцатый раз вам повторяю - уберите запрос времени из ртц модуля из loop(). Как еще вам сказать что бы до вас наконец дошло?
 
  • Лойс +1
Реакции: Alexhhhhgf

Alexhhhhgf

✩✩✩✩✩✩✩
14 Апр 2024
42
0
@vortigont, убрал из воид луп запрос на время ртц на второй схеме. После отработки звонка диод горел секунд 30, потом продолжил моргать.

Разобрался. После отработки звонка (допустим в 10:30:00) диод горит непрерывно с 10:30:07 пока не будет 10:31:00, потом опять моргает. Плата "зависала" только после отработки звонка. На тестовом стенде , где в void loop я убрал запрос времени с rtc, он не зависает. Только, если время запрашивать 1 раз при запуске в void setup, Ардуино опаздывает на секунд 30. Как сделать, чтобы каждый час без проблем обновлялось время на Ардуино?