Часы 1302 и time.h

IljaT
Offline
Зарегистрирован: 16.01.2016

Здравствуйте, у меня имеется модуль часов 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 минимальными затратами памяти и пр ?
 
NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Попробуйте нормальную библиотеку, проверьте заземлен ли у вас кварц(а то так они будут время на плутоне показывать).

Думаю что библиотека тормозит отсчет во время запросов, пользовался только DS1307 и таких проблем не наблюдал. Библиотеку использовал свою https://github.com/NeiroNx/RTCLib, впринципе можно ее доработать для DS1302.

IljaT
Offline
Зарегистрирован: 16.01.2016

Спасибо, а как заземлить кварц? Припоять к корпусу GND?

ioleg73
Offline
Зарегистрирован: 16.05.2015

Спасибо, а как заземлить кварц? Припоять к корпусу GND?

Где-же ты пОяльник возьмёшь? 

IljaT
Offline
Зарегистрирован: 16.01.2016

Тут форум по ардуине или по русскому языку?

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

ps Предвосхищая возможную претензию типа "правильно нужно писать "ардуино" а не "ардуине"" или отсутствия двоеточия после слова "типа", прошу еще раз прочитать первую строчку моего сообщения )))

 

alexvs
Offline
Зарегистрирован: 22.07.2014

Вообще, при подключении Time.h для  инициализации достаточно передать перменную time_t, содержащую текущее время. Я получаю время из инета, а не с RTC, но разницы нет.

Можно написать так: setSyncProvider(getNtpTime);

А можно так:  time_t tt = getNtpTime(); setTime(tt);

IljaT
Offline
Зарегистрирован: 16.01.2016

я сделал так: 

time_t time;
Time ti;
 

setup

 ti = rtc.getTime(); 
setTime(ti.hour,ti.min,ti.sec,0,0,0);
 
 
loop
time = now();   // опрос времени
 Hour = hour(time);
 Min =  minute(time); 
 Sec =  second(time); 
 

а setSyncProvider(getNtpTime); у меня не получается так как при использовании  библиотеки ds1302.h значение t=rtc.getTime();  нельзя использовать как сервер синхронизации setSyncProvider(rtc.getTime()); или вашими словами

 time_t tt = getNtpTime(); setTime(tt); я не могу сделать - компилятор ругается

alexvs
Offline
Зарегистрирован: 22.07.2014

Функция  getNtpTime(), в моем случае, получает время из инета. Тебе же нужно взять время из RTC: 

 time_t tt = rtc.getTime(); setTime(tt);

IljaT
Offline
Зарегистрирован: 16.01.2016
я понял что вы из инета делаете синхр
#include <DS1302.h>
#include <Time.h>
time_t tt;
DS1302 rtc(1, 2, 3);    // (RST, DAT, CLK)
 
void setup() {}
 
void loop() { tt = rtc.getTime(); setTime(tt);}
 
компилятор пишет: cannot convert 'Time' to 'time_t {aka long unsigned int}' in assignment
 
Тоесть при использовании библиотеки DS1302.h   возвращаемое  значение функции rtc.getTime() является переменной типа Time, а функция setTime() из библиотеки Time.h требует аргументом переменную типа time_t
 
Мне кажется что дело в библиотеке ds1302, возможно в других билблиотеках (для шилдов 1307 или 1323)  rtc.getTime() будет возвращать переменную типа time_t и все получится? Может быть есть возможность как то просто преобразовать Time в time_t ?
IljaT
Offline
Зарегистрирован: 16.01.2016

Всем спасибо разобрался, скачал новую библиотеку DS1302RTC

в ней используется тип time_t, теперь легко можно делать и time_t tt = RTC.get(); setTime(tt); 

и  setSyncProvider(RTC.get)