Часы 1302 и time.h
- Войдите на сайт для отправки комментариев
Сб, 16/01/2016 - 20:21
Здравствуйте, у меня имеется модуль часов ds1302, подключил, запрограмировал, но возникла одна проблема:
если в коде очень часто опрашивать модуль при помощи rtc.getTimeStr() то часы очень сильно начинают врать,
как вариант сделал опрос раз в 60 сек, погрешность стала приемлимой, однако тогда возникают проблемы с нормальным отображением секунд ( обновляются раз в минуту).
Решил использовать Time.h для того что бы для всех опросов использовать встроенные часы, а синхронизацию с модулем 1302 производить при загрузке, ну и например, дополнительно раз в сутки.
Вот что получилось:
#include <DS1302.h>
#include <Wire.h>
#include <Time.h>
#include <LiquidCrystal_I2C.h>
DS1302 rtc(5, 4, 3); // (RST, DAT, CLK)
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
time_t time;
Time t;
unsigned long temphour, tempmin, tempsec, temptime;
void setup()
{
t = rtc.getTime(); //опрос модуля
temphour = t.hour; //временная переменная часа
temptime = temphour*3600+t.min*60+t.sec ; //время в секундах
setTime(temptime); //установка встроенных часов
lcd.init();
lcd.backlight();
}
void loop()
{
time = now(); //опрос встроенных часов
temphour = hour(time);
lcd.setCursor(10, 2);
lcd.print (temphour); lcd.print (" ");
tempmin = minute(time); ;
lcd.setCursor(13, 2);
lcd.print (tempmin); lcd.print (" ");
tempsec = second(time);
lcd.setCursor(16, 2);
lcd.print (tempsec); lcd.print (" ");
lcd.setCursor(12, 2); lcd.print (":"); lcd.setCursor(15, 2); lcd.print (":"); //
delay (500);
lcd.setCursor(12, 2); lcd.print (" "); lcd.setCursor(15, 2); lcd.print (" "); //
delay (500);
}
Мне кажется, что этот вариант, хоть и рабочий, но не рациональный, так как скорее всего жрет слишком много памяти под переменные temphour, tempmin, tempsec, temptime. Да и вообще не очень нравится вид строки
сетапа temptime = temphour*3600+t.min*60+t.sec ;
Можно ли какимто простым образом сделать setTime(rtc.getTime()) c минимальными затратами памяти и пр ?
Попробуйте нормальную библиотеку, проверьте заземлен ли у вас кварц(а то так они будут время на плутоне показывать).
Думаю что библиотека тормозит отсчет во время запросов, пользовался только DS1307 и таких проблем не наблюдал. Библиотеку использовал свою https://github.com/NeiroNx/RTCLib, впринципе можно ее доработать для DS1302.
Спасибо, а как заземлить кварц? Припоять к корпусу GND?
Спасибо, а как заземлить кварц? Припоять к корпусу GND?
Где-же ты пОяльник возьмёшь?
Тут форум по ардуине или по русскому языку?
Но раз уж вам так режет глаз моя оплошность в граматике, то извольте самому вспомнить правила великого русского, ведь "где-же" пишется без дефиса.
ps Предвосхищая возможную претензию типа "правильно нужно писать "ардуино" а не "ардуине"" или отсутствия двоеточия после слова "типа", прошу еще раз прочитать первую строчку моего сообщения )))
Вообще, при подключении Time.h для инициализации достаточно передать перменную time_t, содержащую текущее время. Я получаю время из инета, а не с RTC, но разницы нет.
Можно написать так: setSyncProvider(getNtpTime);
А можно так: time_t tt = getNtpTime(); setTime(tt);
я сделал так:
setup
а setSyncProvider(getNtpTime); у меня не получается так как при использовании библиотеки ds1302.h значение t=rtc.getTime(); нельзя использовать как сервер синхронизации setSyncProvider(rtc.getTime()); или вашими словами
time_t tt = getNtpTime(); setTime(tt); я не могу сделать - компилятор ругается
Функция getNtpTime(), в моем случае, получает время из инета. Тебе же нужно взять время из RTC:
time_t tt = rtc.getTime(); setTime(tt);
Всем спасибо разобрался, скачал новую библиотеку DS1302RTC
в ней используется тип time_t, теперь легко можно делать и time_t tt = RTC.get(); setTime(tt);
и setSyncProvider(RTC.get)