Не смог построить логику с часами реального времени

Бурцев Николай
Offline
Зарегистрирован: 24.10.2020

Здравствуйте помогите пожалуйста!!!
не смог составить логику реального времени(RTC_DS1307).
Мне нужна чтобы в 8:00 пин 13 был HIGH, 8:20 пин 14 HIGH;
и в 23:00 пин 13 был LOW, 23:20 пин 14 был LOW

iarduino_RTC watch(RTC_DS1307);
LiquidCrystal_I2C lcd(0x27,20,4);

void setup() {
Serial.begin(9600);

watch.begin();
pinMode(13, OUTPUT);
pinMode(14, OUTPUT);
//watch.settime(40,59,22,16,03,21,2); // сек, мин, час, число , месяц, год, день недели
}

void loop() {
String H = watch.gettime("H");
String M = watch.gettime("i");

Serial.println(watch.gettime("H:i"));

if ((H>="08") and (H<"23"))
{
Serial.println("Первая лампа включина ON");
digitalWrite(14, HIGH);
}
if ((H>="08") and (H<"23"))
{
Serial.println("Вторая лампа включина ON");
digitalWrite(13, HIGH);
}

}

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Во первых вставьте программу по правилам.

Во вторых как Вы себе представляете сравнение текстовых строк? Особенно когда больше или равно?

Преобразуйте в числа и их сравнивайте stoi() Вам в помощь.

Да, а где #include???

 

nik182
Offline
Зарегистрирован: 04.05.2015

Эти вещи делаются через unix-time. 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Цитата:
При любом обращении к функциям gettime() и gettimeUnix(), автоматически обновляются значения следующих переменных:

Переменная seconds // Содержит секунды от 0 до 59.

Переменная minutes// Содержит минуты от 0 до 59.

Переменная hours // Содержит часы от 1 до 12.

Переменная Hours // Содержит часы от 0 до 23.

Переменная midday // Содержит полдень 0 или 1 (0-am, 1-pm).

Переменная day // Содержит день месяца от 1 до 31.

Переменная weekday // Содержит день недели от 0 до 6 (0-воскресенье, 6-суббота).

Переменная month // Содержит месяц от 1 до 12.

Переменная year // Содержит год от 0 до 99.

Переменная Unix // Содержит секунды прошедшие с начала эпохи Unix, от 0 до 4'294'967'295.

Pyotr
Offline
Зарегистрирован: 12.03.2014

Николай, вот пример. Доделаете под свои задачи.

void setup() {
  pinMode(13, OUTPUT);
}
void loop() {
  uint16_t totalMinut = getTotalMinut();  
  digitalWrite(13, totalMinut >= 480 && totalMinut < 1380);   
}
//получаем время с RTC и считаем количество минут с начала суток
uint16_t getTotalMinut(){
  uint16_t t = millis() % 1440;//это для примера
  return t;
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

delay(24*60*60*1000UL) не в трендах?

А, сорри. Я этот пост с постом про перезагрузка каждые 24 часа спутал ))

fogary
Offline
Зарегистрирован: 05.03.2016

Вариант

void loop(){
  watch.gettime();

  if (watch.Hours == 8) || (watch.Hours == 23){
    bool new_sate = (watch.Hours == 8) ? HIGH : LOW;

    if (watch.minuts == 0) && (digitalRead(13) != new_sate)
      digitalWrite(13, new_sate);

    if (watch.minuts == 20) && (digitalRead(14) != new_sate)
      digitalWrite(14, new_sate);
  }
}

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

fogary пишет:

Вариант

Негодный вариант))

Pyotr
Offline
Зарегистрирован: 12.03.2014

Минусователь,)) расскажи в чем я неправ.

b707
Offline
Зарегистрирован: 26.05.2017

Pyotr пишет:

Минусователь,)) расскажи в чем я неправ.


отключаться пины никогда не будут?

new_sate это new_state? - полиглот:)

Pyotr
Offline
Зарегистрирован: 12.03.2014

b707 пишет:
Pyotr пишет:

Минусователь,)) расскажи в чем я неправ.


отключаться пины никогда не будут?

new_sate это new_state? - полиглот:)


Как только выражение ( totalMinut >= 480 && totalMinut < 1380) станет ложью, так и отключится.

Green
Offline
Зарегистрирован: 01.10.2015

sadman41 пишет:
delay(24*60*60*1000UL) не в трендах?

Шалун.)

b707
Offline
Зарегистрирован: 26.05.2017

Pyotr, a вы какой код обсуждаете? Не вижу у fogary переменной Totalminut
Вообще помоему у fogary в #6 все нормально, насчет отключения это я сам прогнал

Green
Offline
Зарегистрирован: 01.10.2015

Свой.) И я бы добавил -1 за magic numbers.)

Pyotr
Offline
Зарегистрирован: 12.03.2014

b707 пишет:
Pyotr, a вы какой код обсуждаете? Не вижу у fogary переменной Totalminut Вообще помоему у fogary в #6 все нормально, насчет отключения это я сам прогнал

Канешн свой) ТС_у для подумать чуть.

По #6. Девайс включили или он перегрузился в 9:00. Что будет?

b707
Offline
Зарегистрирован: 26.05.2017

Green пишет:

Свой.) И я бы добавил -1 за magic numbers.)


это Петру? Там скорее нужно говорить о сознательном запутывании ТС:) Одна строчка с миллис ("для примера") чего стоит ;)

Pyotr
Offline
Зарегистрирован: 12.03.2014

Green пишет:

Свой.) И я бы добавил -1 за magic numbers.)

Я посчитал минуты за ТС. А минусы я люблю, гловное шоб поболе)))

Green
Offline
Зарегистрирован: 01.10.2015

Это что. Я на Яндекс.дзене как то добавил комментарий... и получил -700.(

Pyotr
Offline
Зарегистрирован: 12.03.2014

b707 пишет:
Green пишет:

Свой.) И я бы добавил -1 за magic numbers.)

это Петру? Там скорее нужно говорить о сознательном запутывании ТС:) Одна строчка с миллис ("для примера") чего стоит ;)

А никто и не обещал легкой жизни начинающему ардуинщику))

Pyotr
Offline
Зарегистрирован: 12.03.2014

Green пишет:

Это что. Я на Яндекс.дзене как то добавил комментарий... и получил -700.(

Любопытно посмотреть.

Green
Offline
Зарегистрирован: 01.10.2015

b707 пишет:
это Петру? Там скорее нужно говорить о сознательном запутывании ТС:) Одна строчка с миллис ("для примера") чего стоит ;)

И я о том же.) Ну вот нафига высчитывать за компилятор? Ну хотя бы пиши 8 * 60 тогда.)

Green
Offline
Зарегистрирован: 01.10.2015

Pyotr пишет:

Любопытно посмотреть.


Нет. Обстановка сильно накалилась.( Сам был не рад. Да и давно это было, года 2 как.

b707
Offline
Зарегистрирован: 26.05.2017

Такого количества идиотов, как в Дзене - еще поискать. Домохозяйки и пенсинерки

Green
Offline
Зарегистрирован: 01.10.2015

b707 пишет:
Такого количества идиотов, как в Дзене - еще поискать. Домохозяйки и пенсинерки

Я лично зарёкся. Правда попадались и адекватные (некоторые даже благодарили), но их меньшинство.(

fogary
Offline
Зарегистрирован: 05.03.2016

Pyotr пишет:

По #6. Девайс включили или он перегрузился в 9:00. Что будет?

Специально для Вас:

void setup(){
  Serial.begin(9600);

  pinMode(13, OUTPUT);
  pinMode(14, OUTPUT);
  digitalWrite(13, LOW);
  digitalWrite(14, LOW);

  watch.begin();
  watch.gettime();
  unsigned int min_of_day = watch.Hours * 60 + watch.minuts;
  if (min_of_day >= 8*60) && (min_of_day < 23*60) digitalWrite(13, HIGH);
  if (min_of_day >= 8*60+20) && (min_of_day < 23*60+20) digitalWrite(14, HIGH);
}

Остальная часть без изменений.

Pyotr
Offline
Зарегистрирован: 12.03.2014

fogary пишет:

Pyotr пишет:

По #6. Девайс включили или он перегрузился в 9:00. Что будет?

Специально для Вас:

void setup(){
  Serial.begin(9600);

  pinMode(13, OUTPUT);
  pinMode(14, OUTPUT);
  digitalWrite(13, LOW);
  digitalWrite(14, LOW);

  watch.begin();
  watch.gettime();
  unsigned int min_of_day = watch.Hours * 60 + watch.minuts;
  if (min_of_day >= 8*60) && (min_of_day < 23*60) digitalWrite(13, HIGH);
  if (min_of_day >= 8*60+20) && (min_of_day < 23*60+20) digitalWrite(14, HIGH);
}

Остальная часть без изменений.

Ну если для меня))... то я бы убрал строки 6 и 7, и ради чтения двух регистров из RTC не стал бы тянуть библиотеку (говорят не самая лучшая).

Ну и если в будущем захочется сделать установку времени, скажем в 7:59 подвести часы на 2 минуты вперед, то опять все порушится. В лупе условия нужно писать как в сетапе сейчас.

Green
Offline
Зарегистрирован: 01.10.2015

А если в будущем нужно включить в 23:00, а выключить в 8? А если ещё один выход добавить?
Обычно все параметры задаются вне, а в код вообще не заглядываешь.