Closed DizzyaKZ closed 3 years ago
Делает, потому что для этого там отдельный перегруженный setTime на установку времени компиляции
Ок. Не могу воспроизвести ошибку компилятора, которая указывала на то, что при вызове 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 верное и соответствует времени на компьютере
А вот это интересно, спасибо. Гляну
Понимаю, что изначально библиотека была УЖЕ написана, но в некоторое продолжение "закрытого" issue о формате времени и порядка переменных, обратите внимание, что функция из библиотеки rtc.getTimeString()
выдает в формате HH:MM:SS
, а rtc.getDateString()
- YYYY.MM.DD
, хотя функция rtc.setTime()
просит SS:MM:HH
но DD.MM.YYYY
Это не в качестве критики, а пожелания удобства пользования библиотекой. Все должно быть "единообразно", как говорили в вооруженных силах .... :)
Так, всё работает корректно. Если оставить в программе строку rtc.setTime(COMPILE_TIME)
- каждый раз при запуске будет устанавливаться время компиляции, то есть одно и то же устаревшее время, это и происходит в примере выше. Между последней прошивкой и запуском программы прошло полтора часа. Именно для этого и нужна функция lostPower()
, для однократной установки времени при помощи сброса батарейки. Можно придумать и другие способы однократной установки на время компиляции, например флаг в епром.
По поводу порядка Ч:М:С Д.М.Г полностью согласен, первоначальный автор сделал так и я не придал этому значения, сейчас менять поздно. В только что вышедшем релизе добавил setHMSDMY
для любителей классики
Я не для полемики. Как пользователь библиотеки.
void setTime(uint8_t param); // установка времени == времени компиляции
Читается как "используя эту функцию, я могу установить время", которое "равно времени компиляции".
Я выгрузил программу после исправления, используя библиотеку, и получил некорректное с моей точки зрения время. Я же "установил время" - думает моя голова. Теперь я использую это время, а получаю не актуальное время, а время последней компиляции.
А оно мне зачем? Исторические данные? Для понимания когда была последняя компиляция? Мне же надо без NTP установить время и я читаю, то что хочу - установка времени по времени компиляции.
Использование же lostPower()
нужно мне, если вдруг при работе моего удивительного устройства, батарейка на RTC сдохла и перегрузка устройства спасет меня, установив время на правильное, актуальное время.
Если же я только скомпилировал, при разработке скетча или устройства, я же ожидаю, что будет время моей последней компиляции как минимум, а получаю вообще неправильное время, даже при использовании структуры if
и lostPower()
. Как было в моем случае, как только я начал использовать Вашу библиотеку.
Тогда либо надо изменить описание, либо установить именно время последней компиляции.
Простите за назойливость - Ваша библиотека, Вы устанавливаете правила.
за setHMSDMY
отдельное спасибо :)
Так это и есть время последней компиляции!... Как использовать - это задача программиста, библиотека является лёгким аналогом популярной rtclib. Зачем это нужно? Установить актуальное время модулю в автоматическом режиме во время прошивки. Как вариант предложен сброс батарейкой и проверка на lostPower, либо флаг сброса в eprom. Вроде всё более чем очевидно и по другому сделать не получится
ну в моем примере я же не получаю время последней компиляции. Что в моем примере не так? Я записал время с использованием 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
Может я что-то недопонимаю
Можно полный код программы? Указанный выше - явно какой то кусок. Кстати преобразовывать String к String не нужно, в крупном проекте такие дикие манипуляции со строками могут привести к крашу программы
За совет про 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
Простите, что загрузил Вас вопросом. Я пристроил костыль и работает как меня устраивает. Так что можно бросить это занятие ...
Не, если проблема есть, её надо исправить. Через пару часов буду у ПК, прошью гляну
А в чём собирается прошивка? 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
Прошил другую ардуину с модулем часов - выдаёт аналогичную ситуацию как у вас =) возможно собака зарыта где то в кеше компилятора, буду разбираться
__DATE__ Jul 14 2021
__TIME__ 21:35:06
***********TIME********************
RTC Temp: 30.25
RTC Time: 21:27:31
RTC Date: 14.07.2021
В общем да, проблема была. Компилятор выдавал последнее время изменения файла библиотеки, а не файла скетча, поэтому устанавливалось старое время. Полностью переделал весь алгоритм, но полная совместимость осталась. Спасибо за репорт)
Классно! Вы молодец. Спасибо за то, что Вы делаете
В библиотекe COMPILE_TIME возвращает значение true или false. Соответственно в примере setTime(COMPILE_TIME) не делает то, что озвучено: установка времени == времени компиляции.