Часы спешат - аппаратная проблема?

К Arduino UNO R3 подключены real time clock DS1302, для работы с ними использую эту библиотеку https://iarduino.ru/file/235.html в последней версии 2.0.0, в итоге часы спешат примерно на 9 секунд в день.

Вот код:

#include <iarduino_RTC.h>        
iarduino_RTC time(RTC_DS1302,8,6,7);
void setup() {
    delay(300);                                          
    Serial.begin(9600);                           
    time.begin();                  
    //time.settime(00,00,00); - после установки времени я перезаписываю код в таком виде, естественно 
}   
void loop() {
    int xxx = time.seconds;
    Serial.println(time.gettime("H:i:s"));
    Serial.println(xxx);
    delay(5000);
}

Это таймер, мне всего лишь надо его точное срабатывание 2 раза в день, чтобы не приходилось его часто корректировать вручную. Что посоветуете, скорректировать библиотеку относительно моего экземпляра часов (если это возможно), или просто в код вставить корректор, который будет добавлять 9 сек в день?

Замени на DS3231.

Оффтоп: Ещё один странный глюк нового форума - не менее 20 символов в сообщении. Кто это гамно все высчитывал???

1 лайк

Почитал описание - звучит красиво. А у самого опыт есть их использования?

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

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

по DS3231 есть пост на старом форуме как подстроить на старение кварца, у меня несколько таких модулей и все разные, самый лучший после калибровки имеет точность хода лучше 30 миллисекунд за три месяца, остальные раза в два-три похуже…так что мой совет менять модуль и откалиброваться

Насчёт дураков нелогично, а ds1302 создавали дураки что ли? Да и Abibas или Reeboc есть шанс прикупить

Спасибо за совет, но поиск там тем про 3231 сотни выдаёт, и в первых же их там ругают вплоть до минуты за сутки разницы. Не буду заморачиваться, скорректирую программно. Не в курсе, из loop() в setup() можно перепрыгнуть в ходе работы ардуино по какому-нибудь условию? Так-то я новичок

Дураки покупали самую дешевую китайскую плату, на которой оказался припаян ds1302.

1 лайк

По простому - нет. Да и зачем?

1 лайк

Вопрос цены. Дешевый модуль - вот и все дела. Можно кварц перепаять - например, на компьютерных материнках ставятся кварцы всяко лучше, чем на этих модулях, но скорее всего это будет что мертвому припарка

Можно. setup() - обычная функция, ее можно вызвать из loop() как любую другую.

Только вы должны четко понимать, что делаете. В setup() обычно инициализация библиотек пишется, некоторые библиотеки не любят, чтобы их два раза инициализировали

если корректировать библиотеку необходимо, чтобы она умела корректировать натиканное время в своих часах, а по другому никак, любой сбой и перезагрузка не должны влиять на конечный результат…я делал аналогичное в часиках на миллис() и чтобы хоть как-то приблизится к реальному времени за промежуток неделя там был сложный алгоритм подвода часиков раз в секунду, раз в минуту, раз в час (вычисляемые коэффициенты корректировки в миллисекундах) …но это всё от крайней степени бедности…DS3231 решает проблему точности хода раз и навсегда

1 лайк

Я думал ТС имел ввиду конкретное место в setup()…

Что понимается под “перепрыгнуть” и какова цель этого действа?

Да, тут я не сильно подумавши ляпнул. Просто надо вставить в loop() +9 секунд, допустим в 21:00. Надеюсь, это не должно быть сильно сложно

как пример, но это только если надо только добавлять секунды…

#include <iarduino_RTC.h>
iarduino_RTC watch(RTC_DS3231);
uint32_t diff = 9;

void setup() {
  watch.begin();
}

void loop() {
  static uint32_t tm = watch.gettimeUnix();
  if (tm % 86400 == 0) {
    tm += diff;
    watch.settimeUnix(tm);
  }
}

Спасибо, потом подумаю над этим, пока непонятно. Надо библиотеку поподробней изучить и вообще возможности языка. Я думал просто что-то вроде if время = 21:00:00 then settime 21:00:09

я тебе выдал готовое решение, в 0 часов подводящее твои часики

Очень мило, тем более, что я об этом совершенно не просил