Работа с временем и датой

LDmitry
Offline
Зарегистрирован: 05.02.2013

Добрый день

Подскажите плз, есть ли стандартная библиотека для работы в Arduino с временем и датой?

Нужно сравнивать 2 набора значений дата+время: текущие, полученные из модуля часов ds1307 и значения, сохраненное ранее в eeprom. Ожидаемый результат операции - разница между ними в днях, часах,..

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

Нет нету. Есть библиотека для работы с ds1307.

paf
Offline
Зарегистрирован: 25.01.2013

 В готовом виде наверно нет.  То же задумался как сохранять и куда лог событий.  Т.е. дату, время начала, продолжительность. Подскажите алгоритм, пожалуйста.

 

Scare
Offline
Зарегистрирован: 30.08.2012

Посмотрите библиотеку Time http://playground.arduino.cc/Code/time

Работа с часами реального времени там описана.

LDmitry
Offline
Зарегистрирован: 05.02.2013

Библиотеку Time посмотрел, спасибо.

Но не нашел там нужных мне методов для работы с временем и датой - например DateAdd, DateDiff

RainMan
Offline
Зарегистрирован: 21.06.2011

ребята и мне нужны алгоритмы нахождения разницы дат.  А я планирую сохранять  значение текущено времени в регистрах таймера, чтобы про просыпании контроллера посмотреть сколько времени прошло пока он спал, и сделать соответствующие коррекции на погрешность хода таймера.

serega374
Offline
Зарегистрирован: 10.08.2015

Получаю время с часов DS1302. Мне надо знать когда будет 8 часов. Минуты и секунды не интересуют. Если я напишу

void CHEKTIME()
{
	 if (int(rtc.getTimeStr())==800)
	 {
    digitalWrite(lightPIN, HIGH); 
    }
  
}

Будет работать? У меня компилируеться - но проверить не скоро смогу контроллера нет пока. Сомневаюсь получиться ли 800 если переменная getTimeStr() выводилась в сериал таким форматом 8:0:0. В общем я не знаю как преобразование в int поступает со знаками и числами. 

 

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

serega374 пишет:

Мне надо знать когда будет 8 часов.

#include <Time.h>
h = hour();
if (h == 8) {}
hour();            // the hour now  (0-23)
minute();          // the minute now (0-59)          
second();          // the second now (0-59) 
day();             // the day now (1-31)
weekday();         // day of the week, Sunday is day 0 
month();           // the month now (1-12)
year();            // the full four digit year: (2009, 2010 etc) 

there are also functions to return the hour in 12 hour format
hourFormat12();    // the hour now in 12 hour format
isAM();            // returns true if time now is AM 
isPM();            // returns true if time now is PM

now();             // returns the current time as seconds since Jan 1 1970 

 

serega374
Offline
Зарегистрирован: 10.08.2015

получилось только так int h = hour(); Или должно без int работать? Соррри за  глупый вопрос

maksim
Offline
Зарегистрирован: 12.02.2012
Клапауций 911
Offline
Зарегистрирован: 18.10.2015

serega374 пишет:

Или должно без int работать? Соррри за  глупый вопрос

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

без 

void setup() {}
void loop() {}
 
заработало, а без int - не работает.
ок.
serega374
Offline
Зарегистрирован: 10.08.2015

Я только начинаю спасибо за помощь. Я весь код не писал.

 void setup() {} void loop() {} есть конечно. int был условно не показан Вами как я понял

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

serega374 пишет:

int был условно не показан Вами как я понял

и не должен был быть показан - подразумевается, что переменная была объявлена где-то выше.

serega374
Offline
Зарегистрирован: 10.08.2015
 
Тогда в чем разница кодов?

int h = hour();

void CHEKTIME()
{
	 if  (h == 8)
	 {
    digitalWrite(lightPIN, HIGH); 
    }
  
}

и 

int h;

void CHEKTIME()
{h=hour();
	 if  (h == 8)
	 {
    digitalWrite(lightPIN, HIGH); 
    }
  
}

 

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

область видимости

http://arduino.ru/Tutorial/Variables

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Есть еще одна существенная разница:

в первом случае переменной h присваивается значение перед началом выполнения программы, а во втором - при каждом вызове CHEKTIME (Кстати, если это по-английски, то правильнее было бы CheckTime).

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

andriano пишет:

Есть еще одна существенная разница:

в первом случае переменной h присваивается значение перед началом выполнения программы, а во втором - при каждом вызове CHEKTIME (Кстати, если это по-английски, то правильнее было бы CheckTime).

ну, да - нам же точно известно, где в коде находится int h;

нам дают два куска кода и просят объяснить, что за нах в них происходит.

а, хрен его знает, что.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Отчего же?

Нам точно известно, что h находится в области видимости функции. А для этого существует не так много мест.

И вообще, нужно ориентироваться на тот код, который есть, а не фантазировать, что там есть что-то кроме него.

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

andriano пишет:

Нам точно известно, что h находится в области видимости функции. А для этого существует не так много мест.

откуда нам известно, что h находится не в другой функции?

нам видим весь код или ега куски?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В приведенном фрагменте кода другая функция отсутствует.

Этого достаточно.

Обсуждать имеет смысл то, что есть, а не то, что мы можем себе нафантазировать.

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

andriano пишет:

В приведенном фрагменте кода другая функция отсутствует.

Этого достаточно.

достаточно для чего?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Клапауций 911 пишет:

достаточно для чего?

Это зависит от Ваших фантазий.

mishgan
Offline
Зарегистрирован: 25.04.2014

заказал себе экран nextion enhanced. На борту у этого экрана есть RTC. Но получить от этого экрна можно только год, месяц, день, час, минута, секунда. Можно както это все преобразовать в секунды (аналог now(); из Time.h) ? Перемножение на количество секунд в году, месяце ... не подходит т.к. они бывают разные

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

mishgan пишет:

заказал себе экран nextion enhanced. На борту у этого экрана есть RTC. Но получить от этого экрна можно только год, месяц, день, час, минута, секунда. Можно както это все преобразовать в секунды (аналог now(); из Time.h) ? Перемножение на количество секунд в году, месяце ... не подходит т.к. они бывают разные

Как вариант: http://codereview.stackexchange.com/questions/38275/convert-between-date-time-and-time-stamp-without-using-standard-library-routines

mishgan
Offline
Зарегистрирован: 25.04.2014

Посидел покумекал. И оказалось, что совсем это не сложно. 

unsigned long now () {
int Y=nex.getComand("rtc0");
int M=nex.getComand("rtc1");
int D=nex.getComand("rtc2");
int h=nex.getComand("rtc3");
int m=nex.getComand("rtc4");
int s=nex.getComand("rtc5");  
int mes[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
unsigned long now=0;
int ddtm=0;
for (int i = 1; i < M; i++) ddtm=ddtm+mes[i]; 
now=(Y-2016)*31536000+(ddtm+D-1)*86400+h*3600+m*60+s;
if ((Y%4 == 0 and Y%100 != 0) or (Y%400 == 0))  now=now+86400; 
return now;  
}

 

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

Всем доброго дня! Форумчане подскажите пожалуйста как можно организовать задержку исполнения кода используя RTС. Мне для полива растений. Допустим с RTC я получаю ткущую секунду и нужно исполнять код 10 сескунд. В голове крутиться но никак не соберу. Модуль использую DS3231

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

изложите более детально чего вы хотите, а то голова крутится, от того что прочитал.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

kost2003 пишет:

Всем доброго дня! Форумчане подскажите пожалуйста как можно организовать задержку исполнения кода используя RTС. Мне для полива растений. Допустим с RTC я получаю ткущую секунду и нужно исполнять код 10 сескунд. В голове крутиться но никак не соберу. Модуль использую DS3231

берёшь сырое время, а не секунду, которое тебе отдаёт модуль и сравниваешь разницу в 10 секунд.

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

Да, но как? Допустим сырое время 55 секунд в переменной инт, если я к переменной прибавлю 10 секунд будет 65 в значении, а корректное время то будет 05 секунд.

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

xDriver пишет:

изложите более детально чего вы хотите, а то голова крутится, от того что прочитал.

Есть подключенные часы RTC...

дальше по опредлеленному событию, подавать на 2й пин напряжение на 10 секунд после снять напряжение. И чтобы сравнение прошедших 10 секунд получать из модуля часов без делай или millis 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Просто переведи время в секунды и сравнивай/отнимай

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

kost2003 пишет:

Да, но как? Допустим сырое время 55 секунд в переменной инт, если я к переменной прибавлю 10 секунд будет 65 в значении, а корректное время то будет 05 секунд.

нет. ты берёшь Юникс-время из своего модуля и ежесекундно сравниваешь его. по достижении разницы между стоп_Юникс_тиме и старт_Юниск_тиме равное 5-ти, что то делаешь.

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

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

Клапауций 555 пишет:

kost2003 пишет:

Да, но как? Допустим сырое время 55 секунд в переменной инт, если я к переменной прибавлю 10 секунд будет 65 в значении, а корректное время то будет 05 секунд.

нет. ты берёшь Юникс-время из своего модуля и ежесекундно сравниваешь его. по достижении разницы между стоп_Юникс_тиме и старт_Юниск_тиме равное 5-ти, что то делаешь.

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

Кажется понял в какую сторону смотреть. Спасибо!

 

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

Не знаю, испугает вас это или нет, но уточню совет кота: https://www.nongnu.org/avr-libc/user-manual/group__avr__time.html#gab687d0e66f0c74b9723ff9c718ea57da

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

kost2003 пишет:

Да, но как? Допустим сырое время 55 секунд в переменной инт, если я к переменной прибавлю 10 секунд будет 65 в значении, а корректное время то будет 05 секунд.

Вы не в курсе, что такое "сырое время"? Это время только в секундах, без минут, часов, дней... Когда вы прибавлете к 55 секундам "сырого времени" еще 10, то получается не "минута и 5 секунд". а просто 65 секунд.

В большинстве компьютерных систем используется именно "сырое время", а не привычный людям календарь. Например в Unix системное время измеряется в секундах с 1 января 1970 г. В настоящее время там натикало чуть более 1.5 миллиардов секунд. В Ардуине "сырое время" отсчитывается от перезапуска системы. Переводите все свои интервалы в чистые секунды и спокойно отсчитывайте нужный интервал.

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

b707 пишет:

kost2003 пишет:

Да, но как? Допустим сырое время 55 секунд в переменной инт, если я к переменной прибавлю 10 секунд будет 65 в значении, а корректное время то будет 05 секунд.

Вы не в курсе, что такое "сырое время"? Это время только в секундах, без минут, часов, дней... Когда вы прибавлете к 55 секундам "сырого времени" еще 10, то получается не "минута и 5 секунд". а просто 65 секунд.

В большинстве компьютерных систем используется именно "сырое время", а не привычный людям календарь. Например в Unix системное время измеряется в секундах с 1 января 1970 г. В настоящее время там натикало чуть более 1.5 миллиардов секунд. В Ардуине "сырое время" отсчитывается от перезапуска системы. Переводите все свои интервалы в чистые секунды и спокойно отсчитывайте нужный интервал.

Да, это я уже понял, сейчас читаю про unixtime. Спасибо за подсказку!

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

Нет сырого вреени в ds3231. Или самому делать надо, или в некоторых библиотеках хелпер get_unixtime(struct ts t); встречается.