GyverLibs / microDS3231

Лёгкая библиотека для работы с RTC DS3231 для Arduino
MIT License
20 stars 7 forks source link

COMPILE_TIME is bool и не возвращает, то что предполагается #1

Closed DizzyaKZ closed 3 years ago

DizzyaKZ commented 3 years ago

В библиотекe COMPILE_TIME возвращает значение true или false. Соответственно в примере setTime(COMPILE_TIME) не делает то, что озвучено: установка времени == времени компиляции.

GyverLibs commented 3 years ago

Делает, потому что для этого там отдельный перегруженный setTime на установку времени компиляции

DizzyaKZ commented 3 years ago

Ок. Не могу воспроизвести ошибку компилятора, которая указывала на то, что при вызове setTime(COMPILE_TIME) выдавало ошибку использования bool. (Использовался VS Code)

Однако, сейчас данная функция устанавливает в RTC время на один час раньше, чем фактическое время компиляции, выдаваемое DATE TIME

#include <microDS3231.h>

void setup() {
 rtc.setTime(COMPILE_TIME);  // установить время компиляции

  Serial.println("__DATE__ "+String(__DATE__));
  Serial.println("__TIME__ "+String(__TIME__));
}

void loop() {
  Serial.println("RTC Temp: "
                + String(rtc.getTemperatureFloat())
                );
  //Serial.println(rtc.getTemperature());
  Serial.println("RTC Time: "
                + String(rtc.getTimeString())
                );
  Serial.println("RTC Date: "
                + String(rtc.getDateString())
                );

}

Выдает следующий результат:

__DATE__ Jul 14 2021
__TIME__ 16:06:36
RTC Temp: 30.25
RTC Time: 14:39:25
RTC Date: 2021.07.14

При этом значение TIME верное и соответствует времени на компьютере

GyverLibs commented 3 years ago

А вот это интересно, спасибо. Гляну

DizzyaKZ commented 3 years ago

Понимаю, что изначально библиотека была УЖЕ написана, но в некоторое продолжение "закрытого" issue о формате времени и порядка переменных, обратите внимание, что функция из библиотеки rtc.getTimeString()выдает в формате HH:MM:SS, а rtc.getDateString() - YYYY.MM.DD, хотя функция rtc.setTime() просит SS:MM:HH но DD.MM.YYYY

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

GyverLibs commented 3 years ago

Так, всё работает корректно. Если оставить в программе строку rtc.setTime(COMPILE_TIME) - каждый раз при запуске будет устанавливаться время компиляции, то есть одно и то же устаревшее время, это и происходит в примере выше. Между последней прошивкой и запуском программы прошло полтора часа. Именно для этого и нужна функция lostPower(), для однократной установки времени при помощи сброса батарейки. Можно придумать и другие способы однократной установки на время компиляции, например флаг в епром.

По поводу порядка Ч:М:С Д.М.Г полностью согласен, первоначальный автор сделал так и я не придал этому значения, сейчас менять поздно. В только что вышедшем релизе добавил setHMSDMY для любителей классики

DizzyaKZ commented 3 years ago

Я не для полемики. Как пользователь библиотеки.

void setTime(uint8_t param); // установка времени == времени компиляции

Читается как "используя эту функцию, я могу установить время", которое "равно времени компиляции".

Я выгрузил программу после исправления, используя библиотеку, и получил некорректное с моей точки зрения время. Я же "установил время" - думает моя голова. Теперь я использую это время, а получаю не актуальное время, а время последней компиляции.

А оно мне зачем? Исторические данные? Для понимания когда была последняя компиляция? Мне же надо без NTP установить время и я читаю, то что хочу - установка времени по времени компиляции.

Использование же lostPower() нужно мне, если вдруг при работе моего удивительного устройства, батарейка на RTC сдохла и перегрузка устройства спасет меня, установив время на правильное, актуальное время.

Если же я только скомпилировал, при разработке скетча или устройства, я же ожидаю, что будет время моей последней компиляции как минимум, а получаю вообще неправильное время, даже при использовании структуры ifи lostPower(). Как было в моем случае, как только я начал использовать Вашу библиотеку.

Тогда либо надо изменить описание, либо установить именно время последней компиляции.

Простите за назойливость - Ваша библиотека, Вы устанавливаете правила.

DizzyaKZ commented 3 years ago

за setHMSDMY отдельное спасибо :)

GyverLibs commented 3 years ago

Так это и есть время последней компиляции!... Как использовать - это задача программиста, библиотека является лёгким аналогом популярной rtclib. Зачем это нужно? Установить актуальное время модулю в автоматическом режиме во время прошивки. Как вариант предложен сброс батарейкой и проверка на lostPower, либо флаг сброса в eprom. Вроде всё более чем очевидно и по другому сделать не получится

DizzyaKZ commented 3 years ago

ну в моем примере я же не получаю время последней компиляции. Что в моем примере не так? Я записал время с использованием rtc.setTime(COMPILE_TIME);, а по факту это не то время ...

__DATE__ Jul 14 2021
__TIME__ 16:06:36
RTC Temp: 30.25
RTC Time: 14:39:25
RTC Date: 2021.07.14

Может я что-то недопонимаю

GyverLibs commented 3 years ago

Можно полный код программы? Указанный выше - явно какой то кусок. Кстати преобразовывать String к String не нужно, в крупном проекте такие дикие манипуляции со строками могут привести к крашу программы

DizzyaKZ commented 3 years ago

За совет про String спасибо. Оно было у меня для вывода других значения, так и оставил.

Вот код с которого все началось:

#include <Arduino.h>

#include <GyverOS.h>
#include <microDS18B20.h>
#include <microDS3231.h>

GyverOS<5> OS;  // указать макс. количество задач

#define DS_PIN 2 // пин для термометров

MicroDS3231 rtc;

// Уникальные адреса датчиков - считать можно в примере address_read
uint8_t s1_addr[] = {0x28, 0x00, 0xDF, 0x16, 0xA8, 0x01, 0x3C, 0x14};
uint8_t s2_addr[] = {0x28, 0xF0, 0xFD, 0x16, 0xA8, 0x01, 0x3C, 0x1D};
uint8_t s3_addr[] = {0x28, 0x2B, 0x33, 0x16, 0xA8, 0x01, 0x3C, 0xA1};

MicroDS18B20<DS_PIN, s1_addr> sensor1;
MicroDS18B20<DS_PIN, s2_addr> sensor2;
MicroDS18B20<DS_PIN, s3_addr> sensor3;

float temp1= 0.0;
float temp2= 0.0;
float temp3= 0.0;

void getSensorsTempData();

void setup() {

  Serial.begin(115200);

  rtc.setTime(COMPILE_TIME);  // установить время компиляции

  Serial.println("__DATE__ "+String(__DATE__));
  Serial.println("__TIME__ "+String(__TIME__));

  pinMode(13, OUTPUT);

  // подключаем задачи (порядковый номер, имя функции, период в мс)
  OS.attach(0, getSensorsTempData, 10000);

  sensor1.setResolution(12);
  sensor2.setResolution(12);
  sensor3.setResolution(12);

  //OS.detach(0);         // отключить задачу 0
  //OS.setPeriod(0, 200); // сменить период задачи 0 на 200 мс
  OS.start(0);          // запустить задачу 0
  //OS.stop(0);           // остановить задачу 0
  //OS.exec(0);           // выполнить задачу 0 сейчас
}

void loop() {
  OS.tick();    // вызывать как можно чаще, задачи выполняются здесь

  // OS.getLeft() возвращает время в мс до ближайшей задачи
  // на это время можно усыпить МК, например при помощи narcoleptic или GyverPower
  // для примера просто поставим delay на это время
  //delay(OS.getLeft());
}

// обработчики задач
void getSensorsTempData() {

  static uint32_t ms;

  Serial.println("***********TIME********************");
  Serial.println("RTC Temp: "
                + String(rtc.getTemperatureFloat())
                );  
  //Serial.println(rtc.getTemperature());
  Serial.println("RTC Time: "
                + String(rtc.getTimeString())
                );
  Serial.println("RTC Date: "
                + String(rtc.getDateString())
                );
  Serial.println("*******************************");

  ms = millis();

  sensor1.requestTemp();      // Запрашиваем преобразование температуры
  sensor2.requestTemp();
  sensor3.requestTemp();

  temp1=sensor1.getTemp();
  temp2=sensor2.getTemp();
  temp3=sensor3.getTemp();

 // датчик 1

  Serial.println("Sensor 1 temp: " + String(temp1) + " *C");

  // датчик 2

  Serial.println("Sensor 2 temp: " + String(temp2) + " *C");

  // датчик 3

  Serial.println("Sensor 3 temp: " + String(temp3) + " *C");

}

Результат:

================================================================== [SUCCESS] Took 5.34 seconds ==================================================================
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/cu.usbmodem14101  115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
__DATE__ Jul 14 2021
__TIME__ 21:32:55
***********TIME********************
RTC Temp: 25.00
RTC Time: 14:39:25
RTC Date: 2021.07.14
*******************************
Sensor 1 temp: 25.63 *C
Sensor 2 temp: 25.25 *C
Sensor 3 temp: 25.25 *C

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

GyverLibs commented 3 years ago

Не, если проблема есть, её надо исправить. Через пару часов буду у ПК, прошью гляну

GyverLibs commented 3 years ago

А в чём собирается прошивка? Platformio? У меня в Arduino IDE всё работает корректно

__DATE__ Jul 14 2021
__TIME__ 21:27:21
***********TIME********************
RTC Temp: 30.75
RTC Time: 21:27:31
RTC Date: 14.07.2021
GyverLibs commented 3 years ago

Прошил другую ардуину с модулем часов - выдаёт аналогичную ситуацию как у вас =) возможно собака зарыта где то в кеше компилятора, буду разбираться

__DATE__ Jul 14 2021
__TIME__ 21:35:06
***********TIME********************
RTC Temp: 30.25
RTC Time: 21:27:31
RTC Date: 14.07.2021
GyverLibs commented 3 years ago

В общем да, проблема была. Компилятор выдавал последнее время изменения файла библиотеки, а не файла скетча, поэтому устанавливалось старое время. Полностью переделал весь алгоритм, но полная совместимость осталась. Спасибо за репорт)

DizzyaKZ commented 3 years ago

Классно! Вы молодец. Спасибо за то, что Вы делаете