Отсчет времени после включения и выключения

Dima85
Offline
Зарегистрирован: 07.01.2013

Есть переменная TimeLightOffOn

После включения или выключения в эту переменную я записываю millis();

Далее вот так я узнаю сколько секунд, минус и часов работает или выключена лампочка:

(millis()-TimeLightOffOn)/1000 - получаем секунды

((millis()-TimeLightOffOn)/1000)/60 - получаем минуты

((millis()-TimeLightOffOn)/1000)/3600 - получаем часы

В этом коде есть 1 недостаток, вывод данных примерно такой: 0:13:803

Тоесть секунды не обнуляются после 60 а плусуются бесконечно, так же дело обстоит с минутами и часами.

Насколько я понимаю таким образом не получится никак нормально выводить время.

Но у меня есть DC1307

Вывод реального времени я делаю так:

rtc[2] - часы

rtc[1] - минусы

rtc[0] - секунды

Поделитесь пожалуйста идеей как  выводить время работы в таком формате 11:22:02

msng
Offline
Зарегистрирован: 07.06.2012

наверное секунды можно получить вот так - ((millis()-TimeLightOffOn)/1000)%60

Dima85
Offline
Зарегистрирован: 07.01.2013

А как быть с минутами и часами?

msng
Offline
Зарегистрирован: 07.06.2012

:)

соответственно остаток оставлять от 60 и 24

Dima85
Offline
Зарегистрирован: 07.01.2013

Не помогло, не с секундами не с минутами.

maksim
Offline
Зарегистрирован: 12.02.2012

Что не помогло?

Dima85
Offline
Зарегистрирован: 07.01.2013

Мне msng посоветовал в конце (millis()-TimeLightOffOn)/1000 добавить %60

Вот так ((millis()-TimeLightOffOn)/1000)%60. Я это сделал. Но секунды как продолжали плюсоваться после 60 так и продолжают. Тоесть сейчас секунд может быть и 300 и 700 секунд и более.

Хотя задача после 60 обнулять секунды и считать заново. Так же и минуты, после 60 минут должны обнулятся.

tsostik
Offline
Зарегистрирован: 28.02.2013

Вы либо при написании этого опечатались, либо что-то еще делаете кроме этого вычесления.

Конструкция ((millis()-TimeLightOffOn)/1000)%60 в принципе не может возвращать число больше, чем 59.

Выложите сюда свой код.

Должно быть примерно вот так:



numberOfSeconds = ((millis()-TimeLightOffOn)/1000)%60;
numberOfMinutes  = (((millis()-TimeLightOffOn)/1000)/60)%60;
numberOfHours   = (((millis()-TimeLightOffOn)/1000)/3600);

 

maksim
Offline
Зарегистрирован: 12.02.2012

Что бы не ждать целый день я вместо вычитания TimeLightOffOn из millis() складываю их:

unsigned long TimeLightOffOn = 86397000;

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

void loop() 
{
  byte Seconds = ((millis()+TimeLightOffOn)/1000UL)%60;
  byte Minutes  = (((millis()+TimeLightOffOn)/1000UL)/60UL)%60;
  byte Hours   = (((millis()+TimeLightOffOn)/1000UL)/3600UL)%24;
  Serial.print(Hours);
  Serial.print(':');
  Serial.print(Minutes);
  Serial.print(':');
  Serial.println(Seconds);
  delay(1000);
}

В монироре видим:

23:59:57
23:59:58
23:59:59
0:0:0
0:0:1
0:0:2

 

Dima85
Offline
Зарегистрирован: 07.01.2013

Все получилось. Я с скобками ранее намудрил. Никогда ранее не сталкивался с % в таких уровненеиях. Какая-то мистика но работает замечательно. Еще раз спасибо.

msng
Offline
Зарегистрирован: 07.06.2012

никакой мистики, а % действительно оч полезный оператор, его наверное можно решить как то по другому, но с ним гораздо проще...

triada13
Offline
Зарегистрирован: 04.01.2013

maksim а что такое: 1000UL, и где про это можно почитать?

maksim
Offline
Зарегистрирован: 12.02.2012

Этими суффиксами задается тип константы
U - unsigned int
L - long
UL - unsigned long

Для чего? В данном случае это конечно лишнее, просто для "перестраховки", а вот например такая конструкция:

unsigned long TimeLightOffOn;
TimeLightOffOn = 2000*1000;

как думаете что присвоится переменной TimeLightOffOn? 
2000000 ?, а не тут то было... можете проверить:

void setup() 
{
  Serial.begin(9600);
  unsigned long TimeLightOffOn;
  TimeLightOffOn = 2000*1000;
  Serial.println(TimeLightOffOn);
}

void loop() {}

дело в том что у обоих констнт по умолчанию тип int и вычисления происходят в этом же объеме памяти (2 байта), поэтому что бы получились 2000000 нужно у одной из констант изменить тип например на long

TimeLightOffOn = 2000*1000L;

 

triada13
Offline
Зарегистрирован: 04.01.2013

Во блин, а где это все почитать то можно?

leshak
Offline
Зарегистрирован: 29.09.2011

Не поверите, но в разделе "Программирование" из шапки сайта. Разделы "Константы" и "Типы данных".

Целочисленные константы
int
unsigned int
long
unsigned long

triada13
Offline
Зарегистрирован: 04.01.2013

leshak благодарю за подсказку

serenka
Offline
Зарегистрирован: 08.03.2017

скопировал скетч, проверил. Почему-то в монитор выводит 59:57

59:57
59:57
59:58
0:0
0:1
0:2
0:3
0:4
0:5
0:6
0:7
0:8
0:9
0:10
 
можно как-то убрать? Чтобы с 0:0 отсчет начинался.
59:57
59:57
59:58

 

msng
Offline
Зарегистрирован: 07.06.2012

unsigned long TimeLightOffOn = 86397000;

заменить на unsigned long TimeLightOffOn = 0;