обработка переменных в if (реле с RTC)

hunk
Offline
Зарегистрирован: 29.03.2014

Добрый день! Есть проект реле срабатывающего по времени (arduino+DS3232RTC+2х канальное реле)

Как работает:
RTC.read(tm);

   if (((tm.Hour, DEC) > startTime) && ((tm.Hour, DEC) < stopTime)) {  // проверяем текущее время больше "6" и меньше "21", если условие верно- включаем реле
    digitalWrite(relay1, HIGH);
   }
       else { если все не так - выключаем реле
        digitalWrite(relay1, LOW);
       }
   delay(1000);

У меня проблема с срабатыванием если stopTime < 11, т.е. допустим текущее время 9 часов, если  stopTime = 10 реле не срабатывает. Поставив stopTime = 11 реле срабатывает.

Подскажите в чем проблема? Может я не корректно сравниваю значения?

 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Что, по Вашему, означает конструкция (tm.Hour, DEC)?

hunk
Offline
Зарегистрирован: 29.03.2014

kisoft пишет:
Что, по Вашему, означает конструкция (tm.Hour, DEC)?

Она возвращает время в десятичном формате. Точнее часы

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

hunk пишет:

Она возвращает время в десятичном формате. Точнее часы

А Вы попробуйте её напечатать. Просто напишите строку Serial.println((tm.Hour, DEC)) и погоняйте с разными значениями времени. Результат Вас удивит :)))))))))

Потом, когда (и если) не сможете понять почему так печатается, возьмите любую книжку про язык С и поищите там "операция запятая" - почитайте. Узнаете много интересного.

Когда узнаете (но не раньше) выбросьте это и оставьте просто tm.Hour

А вообще - прежде, чем писать вопросы, ВСЕГДА вставьте Serial.println и посмотрите значения своих переменных - львиная доля вопросов отпадут сразу. И почему все новички так любят работать вслепую?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Зачем Вам десятичный формат? Следуя Вашей логике, почему тогда все остальное в неизвестном формате?
Почитайте про представление данных в МК, все данные хранятся в одном и том же виде.
Для начала уберите ', DEC'

hunk
Offline
Зарегистрирован: 29.03.2014

Я не буду с Вами спорить, мой опыт не позволяет это делать. Но первым, что я сделал - это включил в цикл

Serial.print(tm.Hour, DEC);

И он ведет себя вполне предсказуемо, как для меня и возвращает десятично значение (пробовал с разным значением)

Спасибо за наводку, извините за беспокойство.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Serial.print это функция, tm.Hour и DEC это параметры функции.
Хранение данных в памяти МК и отображение в 'человеческом' виде не имеет отношения к сравнению.
Надеюсь мои наводки помогут осознать. Удачи

hunk
Offline
Зарегистрирован: 29.03.2014

Уже рою в этом направлении, спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

hunk пишет:

Я не буду с Вами спорить, мой опыт не позволяет это делать. Но первым, что я сделал - это включил в цикл

Serial.print(tm.Hour, DEC);

И он ведет себя вполне предсказуемо, как для меня и возвращает десятично значение (пробовал с разным значением)

Спасибо за наводку, извините за беспокойство.

Я тоже не буду с Вами спорить, но я Вам советовал не такую печать, как у Вас, а вот такую: Serial.println((tm.Hour, DEC)).

Вы разницу видите? Без скобок - это два значения, а со скобками - одно. Вы же в IF'ах одно используете, вот одно и печатайте. 

Сделайте это (и остальное по моим пунктам) - понимания добавится точно.