В зависимости от положения тумблера (2 положения) выполняется первая или вторая программа

А я вижу. В первых же строках. Причём и с той библиотекой, что ТС дал.

@Лёха посмотрите на вот эти строки из Вашего “огрызка” (№№ 7-10 у Вас)

if (rtc.begin()) {
	Serial.println("Couldn't find RTC");
}

А теперь на описание (можно и на текст) метода begin из библиотеки, что Вы дали ссылку:

Метод begin
/**************************************************************************/
/*!
    @brief  Start I2C for the DS3231 and test succesful connection
    @param  wireInstance pointer to the I2C bus
    @return True if Wire can find DS3231 or false otherwise.
*/
/**************************************************************************/
bool RTC_DS3231::begin(TwoWire *wireInstance) {
  if (i2c_dev)
    delete i2c_dev;
  i2c_dev = new Adafruit_I2CDevice(DS3231_ADDRESS, wireInstance);
  if (!i2c_dev->begin())
    return false;
  return true;
}

Вас точно ничего не смущает? Никто тут “на голове вверх тормашками” не стоит?

Оно же влияет только на вывод в Serial ?

1 лайк

Ну, таки, да. Т.е. она при каждом удачном запуске пихает в сериал сообщение об ошибке. А при неудачном запуске - не пихает. Очень удобно и информативно.

1 лайк

Ну, щегол, пробуй вот это:

Что за день сегодня такой? Одни секретные послания ))
#include <RTClib.h>       // https://github.com/adafruit/RTClib

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

RTC_DS3231 rtc;

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

DateTime now = rtc.now();

uint32_t  prevMillis;

void setup() {

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

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

  if (m_hour == 8 && m_minute == 30) {
    if (m_second >= 00 && m_second <= 07) {
      digitalWrite (relePin, ON);
    } else {
      digitalWrite (relePin, OFF);
    }
  }

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

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

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

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

Скетч использует 6448 байт (20%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 556 байт (27%) динамической памяти, оставляя 1492 байт для локальных переменных. Максимум: 2048 байт.

Потом не забудь написать как оно “работает” и работает ли вообще *проверять у меня времени не было…

ЗЫ: Вопрос о схеме всё ещё актуален. Не по феншую приходить с вопросом на форум и без схемы ))

1 лайк

Ну чо там? Уроки давно уже закончились. Домашку делаешь???

За такое отношение к срочной проблеме «помогите» - я умываю руки.

Не мог зайти

Ебаа , щя гляну код
Огромное спасибо

Ты не представляешь, насколько, я тебе благодарен. Огромное спасибо от всей души!!!
Завтра и после завтра отпишусь, как дела😉

Не будет никакой схемы, Вы и так всё напишете. А если написанное не налезет на реальную схему, будете виноваты и должны всё переделать :slight_smile:

1 лайк

ОффТоп:
Евгений Петрович, поясните появление вот такого сообщения:

warning: comparison is always true due to limited range of data type [-Wtype-limits]
if (m_second >= 0 && m_second <= 7) {

Убрал я это сообщение (чтобы не надоедало) заменив это:

uint8_t    m_second        = now.second();

На это:

int8_t    m_second        = now.second();

Но осадочек остался… Почему компилятор считает, что выражение будет всегда верно, если оно ограничено “отрезком” от 0 до 7, а весь диапазон uint8_t от 0 до 255 ?

В данном случае signed или unsigned - без разницы, потому что малы значения. А если бы нужен был отрезок 0…245 ? Или переходить на int16_t или постоянно любоваться на подобные сообщения компилятора?

А я кажется понял )))

#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 имеется...

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

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

Так и код немного проще…
Долго я тупил, простите - был не прав, исправлюсь (дурное влияние ТС :smiley: )… ))

1 лайк

Он просто напомнил Вам, что если у Вас m_second имеет тип uint8_t , то сравнение

m_second >= 0

всегда будет истинным, а потому не смысла сравнивать

Вы с этим не согласны?

Не работает. В воид сетап я добавил включение светодиода, он не включается. Пробовал что то менять нихера. Добавил в #include wire.h и time.h. тоже ничего.

Как добавил? Что добавил? Где скетч?

Мужики, реально предлагаю прекратить кормить ленивую задницу, пока не увидим полной схемы и полного скетча! Сколько можно, он же издевается!

Я загрузил ваш скетч, он не работает. В воид сетап добавил включение светодиода digitalWrite(4, HIGH);
Он не включился (задал ему значение OUTPUT). Реле тоже не срабатывает.
Скетч тот, который вы последний скидывали.
Он на флешке в кармане, а ноутбука нету, чтобы отправить. Когда я комплелировал скетч, написало, что надо библиотека wire.h
Я написал
#include <Wire.h>
И всеровно ничего не работает.


Это ответ мне? Зачем? Я говорил про схему и скетч, в ответе нет ни того, ни другого.

Значит включай голову. Что может быть причиной, если код точно рабочий?

Согласен ))) Я это понял еще в #54 )))