Библиотека Time, Timezone, UTC

mrWang
Offline
Зарегистрирован: 19.03.2017

Вопрос, господа! Существует такая проблема: я с модуля GPS получаю время, каждую минуту синхронизирую RTC:

void SyncRTC_GPS() {
  tm.Hour = gps.time.hour();
  tm.Minute = gps.time.minute();
  tm.Second = gps.time.second();
  Serial.println("Sync TIME complit ");
  tm.Day = gps.date.day();
  tm.Month = gps.date.month();
  tm.Year = tmYearToCalendar(gps.date.year());
  Serial.println("Sync Date complit ");
  RTC.write(tm);
}

Далее с RTC беру время и вывожу на дисплей пока видны спутники на горизонте (соответственно оно в UTC).

Каким образом можно сделать корректное смещение часового пояса, что бы учесть пограничные значения для перевода Даты?

Пробовал костыль - подключать библиотеку Time (что бы использовать контроллер в качестве посредника подсчета времени  и библиотеки Timezone для  смещения времени ), однако что то с библиотекой Time   пошло не так.

Примеры из комплекта библиотеки Time не работают (например при получении времени из RTC выводится "9:55:46 16 1 1984", хотя при обращении к RTC через read , т.е. напрямую

 if (RTC.read(tm)) {                   // выводим время с RTC на дисплей
    writeRegistersInt(8, tm.Hour);
    writeRegistersInt(11, tm.Minute);
    writeRegistersInt(14, tm.Second);

время выводится нормально.  Куда копать?  или какой еще есть способ из UTC получить корректную дату/время в любом часовом поясе. Версия ArIde 1.8.12 библиотеки с гитхаба самые свежие))

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

UTC +/- offset -> localtime() из avrlibc

https://www.nongnu.org/avr-libc/user-manual/group__avr__time.html

mrWang
Offline
Зарегистрирован: 19.03.2017

не совсем прозрачное решение для меня.. но все же что с библиотекой TIME

только что удалил все библиотеки из папки C:\Users\user\Documents\Arduino\libraries

переустановил ИДЕ

библиотеки загрузил не  zip архивами а через "управление библиотеками"

#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t

void setup()  {
  Serial.begin(9600);
  while (!Serial) ; // wait until Arduino Serial Monitor opens
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if(timeStatus()!= timeSet) 
     Serial.println("Unable to sync with the RTC");
  else
     Serial.println("RTC has set the system time");      
}

void loop()
{
  if (timeStatus() == timeSet) {
    digitalClockDisplay();
  } else {
    Serial.println("The time has not been set.  Please run the Time");
    Serial.println("TimeRTCSet example, or DS1307RTC SetTime example.");
    Serial.println();
    delay(4000);
  }
  delay(1000);
}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

указанный код все равно возвращает фигню: "11:56:28 16 1 1984"

Kakmyc
Offline
Зарегистрирован: 15.01.2018

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

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

mrWang пишет:

но все же что с библиотекой TIME

О какой библиотеке речь? Вы что-то говорите, говорите, но никто ведь, кроме Вас не знает что Вы имеете в виду.

mrWang пишет:

указанный код все равно возвращает фигню: "11:56:28 16 1 1984"

1. Почему это фигня?

2. А что он должен возвращать?

 

mrWang
Offline
Зарегистрирован: 19.03.2017

речь идет об этой библиотеке https://playground.arduino.cc/Code/Time/

фигня это потому что вторым скетчем я проверяю дату и время в часах:

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
}

void loop() {
  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

этот код возвращает вполне корректное время, котороя я загрузил в часы

соответственно должен возвращать после синхронизации так же текущее время "23:27:56 22 02 2020"

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

Блин, ну про вторую библиотеку Вы не сказали, где Вы её взяли, так что ... В общем, я взял вот эти библиотеки:

1. https://github.com/PaulStoffregen/DS1307RTC
2. https://github.com/PaulStoffregen/Time

Скопировал Ваш код из #2 и получил следующее

RTC has set the system time
10:12:16 23 2 2020
10:12:17 23 2 2020
10:12:18 23 2 2020
10:12:19 23 2 2020
10:12:20 23 2 2020
10:12:21 23 2 2020

Проблемы не вижу.

P.S. неужели так трудно сказать, где взял библиотеки? Сколько раз уж было - трахаешься-трахаешься, а там всё совсем другое!

mrWang
Offline
Зарегистрирован: 19.03.2017

а что непонятного в фразе библиотеки загрузил не  zip архивами (не качал с githaba) а через "управление библиотеками"... скорее всего оттуда и тянет.

удалил все библиотеки.. поставил с гитхаба, все тоже самое

mrWang
Offline
Зарегистрирован: 19.03.2017

ЕвгенийП пишет:

Блин, ну про вторую библиотеку Вы не сказали, где Вы её взяли, так что ... В общем, я взял вот эти библиотеки:

1. https://github.com/PaulStoffregen/DS1307RTC
2. https://github.com/PaulStoffregen/Time

Скопировал Ваш код из #2 и получил следующее

RTC has set the system time
10:12:16 23 2 2020
10:12:17 23 2 2020
10:12:18 23 2 2020
10:12:19 23 2 2020
10:12:20 23 2 2020
10:12:21 23 2 2020

Проблемы не вижу.

P.S. неужели так трудно сказать, где взял библиотеки? Сколько раз уж было - трахаешься-трахаешься, а там всё совсем другое!

 

у вас версия ide среды какая?

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

mrWang пишет:

а что непонятного в фразе библиотеки загрузил не  zip архивами (не качал с githaba) а через "управление библиотеками"... скорее всего оттуда и тянет.

Непонятно, где мне взять именно такие библиотеки, как у Вас, а не какие-то другие.

В правилах форума однозначно сказано: "При использовании сторонних библиотек (т.е. отсутствующих сразу после инсталяции ИДЕ) - ссылки на них обязательны"

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

mrWang пишет:

у вас версия ide среды какая?

1.8.10

Поскольку я не вижу Вашей проблемы и не могу сам найти в чём там дело, я могу рассказать Вам как самому найти ошибку, но это будет не быстро "шаг за шагом" и Вы должны делать точно то, что я скажу и говорить мне результаты. Надо?

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

mrWang
Offline
Зарегистрирован: 19.03.2017

сейчас запустил билиотеки под версией arduino-1.5.4 и все заработало. Евгений прошу прощения если был резок.

Хорошего дня!

 

PS на 1.8.10 тоже прекрасно работает