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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

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

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

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

Делайте перенос в старший разряд. Время задаётся почти в вавилонской системе, только явный ноль добавился и глифы поменялись. А вавилонская система смешанная, старшее основание 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 в 07:21.
taras-proger77 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


06:57.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.