Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 31.07.2019, 18:48   #1
[Timur]
Пользователь
 
Регистрация: 03.06.2019
Сообщений: 42
По умолчанию как сложить время. ардуино

Вопрос по ардуино(c++). Имеется модуль часов реального времени zs-042(DS3231). на его базе хочу сделать таймер(с паузой). Хочу брать время с модуля и прибавлять к нему время таймера и сохранять в переменную. Если время с модуля совпадают с временем в переменной то время истекло. Но как к времени с модуля прибавить время таймера(полтора часа или 90 минут)? Казалось всё просто берём часы и минуты к часам прибавляем 1, а к минутам 30. Но это не работает если времени например 18:50.Тогда получается 19:80, а не нужные 20:20.

Есть варианты как сложить время?
Если есть пишите в ответы!
[Timur] вне форума Ответить с цитированием
Старый 31.07.2019, 20:06   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

Считайте в секундах. Берете getUnixTime(getTime()) + 90*60
p51x вне форума Ответить с цитированием
Старый 09.08.2019, 06:17   #3
taras-proger77
Форумчанин
 
Регистрация: 17.12.2018
Сообщений: 419
По умолчанию

Делайте перенос в старший разряд. Время задаётся почти в вавилонской системе, только явный ноль добавился и глифы поменялись. А вавилонская система смешанная, старшее основание 60. То есть количество часов, количество минут, количество терций, количество кварт, количество квинт, количество секст – это всё цифры по основанию 60, просто значения этих цифр представляются в десятичной системе, а в любом компе, или электроном счётчике – во внутреннем представлении. Оно может быть и двоичным, что уже не по-вавилонски, но внутренности нас не интересуют. Сложили Вы две цифры. Отвелекитесь от времени. Надо Вам сложить просто два числа, каждая цифра записана в отдельную переменную, один разряд почему-то записан в переменные m0 и mt, а тот же разряд результата надо положить в m. Следующий по старшинству разряд лежит в переменных h0 и ht, а результат надо положить в h, основание лежит в o.
Код:
m=m0+mt; h=h0+ht;
. Что делать, если m оказалось больше или равно основанию?
Код:
m-=o;
++h;
. А теперь числа у нас описывают моменты времени, h, h0 и ht – часы, m, m0 и mt – минуты, а основание ни в какой переменной не записано, но равно 60.
Код:
m-=60;
++h;
. Тогда
Код:
m=m0+mt;
h=h0+ht;
if (m>59)
{
 m-=60;
 ++h;
}
. Итого:
Код:
s=s0+st;
m=m0+mt;
h=h0+ht;
if (s>59)
{
 s-=60;
 ++m;
}
if (m>59)
{
 m-=60;
 ++h;
}
if (h>23)
{
 h-=24;
 d=d0+1;
}
switch (month0)
{
 case 1: if (d>30)
         {
          d-=31;
          month=month0+1;
         }
 break;
 case 2: if (v0)
         {
          if (d>28)
          {
           d-=29;
           month=month0+1;
          } 
         }
         else
         {
          if (d>27)
          {
           d-=28;
           month=month0+1;
          } 
         }
 break;
 case 3: if (d>30)
         {
          d-=31;
          month=month0+1;
         }
 break;
 case 4: if (d>29)
         {
          d-=30;
          month=month0+1;
         }
 break;
 case 5: if (d>30)
         {
          d-=31;
          month=month0+1;
         }
 break;
 case 6: if (d>29)
         {
          d-=30;
          month=month0+1;
         }
 break;
 case 7: if (d>30)
         {
          d-=31;
          month=month0+1;
         }
 break;
 case 8: if (d>30)
         {
          d-=31;
          month=month0+1;
         }
 break;
 case 9: if (d>29)
         {
          d-=30;
          month=month0+1;
         }
 break;
 case 10: if (d>30)
          {
           d-=31;
           month=month0+1;
          }
 break;
 case 11: if (d>29)
          {
           d-=30;
           month=month0+1;
          }
 break;
 case 12: if (d>30)
          {
           d-=31;
           month=month0-11;
           y=y0+1;
          }
 break; 
}
, s, s0 и st – секунды, d и d0 – день месяца, month и month0 – месяц, y и y0 – год, 0 соответствует моменту, от которого надо отчистать заданное время, v0 – флаг того, что этот момент пришёлся на високосный год. Если часы без календаря, а время, которое должен отсчитать таймер, заведомо меньше суток, то
Код:
s=s0+st;
m=m0+mt;
h=h0+ht;
if (s>59)
{
 s-=60;
 ++m;
}
if (m>59)
{
 m-=60;
 ++h;
}
if (h>23)
{
 h-=24;
}
, s, s0 и st – секунды, величин: d, d0, month, month0, y, y0 и v0 нет.

Последний раз редактировалось taras-proger77; 09.08.2019 в 06:21.
taras-proger77 вне форума Ответить с цитированием
Старый 19.04.2020, 11:27   #4
[Timur]
Пользователь
 
Регистрация: 03.06.2019
Сообщений: 42
По умолчанию

taras-proger77,
спасибо!
[Timur] вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
тест Ардуино uldin Паскаль, Turbo Pascal, PascalABC.NET 0 16.12.2018 22:47
Есть ли способ узнать возможно ли сложить из определенного набора чисел сложить какое-то конкретное число? МаксимDH Microsoft Office Excel 16 12.04.2017 21:07
Программа для Ардуино Влад66 Фриланс 2 24.03.2017 07:38
raspberry в дополнение к Ардуино rlib Железо 14 10.05.2016 16:11


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS