Убегает время на Tiny rtc ds1307
- Войдите на сайт для отправки комментариев
Чт, 03/10/2013 - 12:50
Друзья, подключил к ардуине Tiny rtc ds1307 согласно примеру схемы подключения.
Vcс – питание; GND – земля; SDA – А4; SCL – А5;
Модуль часов покупной.
Пробовал использовать поочередно разные библиотеки - <RTClib.h> и <ds1307.h>.
Заливаю пример скетча из соответствующей библиотеки.
Время устанавливается, часы идут, но вот вопрос - как они идут. За секудну часы отсчитывают порядка 20 секунд. У меня складывается впечатление, что тут аппаратная проблема, может брак, может при пайке что-то запортил. Рассчитываю на ваше мнение.
Время устанавливается, часы идут, но вот вопрос - как они идут. За секудну часы отсчитывают порядка 20 секунд. У меня складывается впечатление, что тут аппаратная проблема, может брак, может при пайке что-то запортил. Рассчитываю на ваше мнение.
Резисторы на шине есть?
Конденсаторы по питанию есть?
Я извиняюсь, но не до конца понимаю, зачем и где они должны быть.
http://kazus.ru/forums/showthread.php?t=11998
Както так
речь идет про подтяжку i2c, резисторы д.б. между sda и vcc, другой между scl и vcc, ну а конденсаторы по питанию (между vcc и gnd ). думаю дело в чем то другом. (на всех моих покупных модулях они были). а сама дунька нормально обрабатывает допустим команду delay(1000) ? останавливается на 1 секунду или меньше?
ps всё же думаю дело в модуле
да, резисторы и конденсаторы на моем модуле присутствуют.
ардуина нормально обрабатывает команды, при delay(1000) останавливается на 1 секунду как и положено,
Да может быть кварц. Но у меня есть именно Tiny rtc ds1307 без подтягивающих резисторов - он же Tiny. Зато американский с хорошим кварцем и вообще не убегает :)
Значит всетаки кварц битый - есть возможнось впаять другой? Лучше от старой материнки.
Ок, спасибо за советы, вечером все прозвоню и попробую по возможности поменять кварц.
Добрый день.
в продолжение темы убегают вперед время.. существенно. примерно 3-4 секунды за 1 минуты.
использую вот http://www.aliexpress.com/item/Ds1307-at24c128-ds18b20-three-in-interface-module/1413800604.html. резистор и конденсатор в модуле есть, на первый взгляд.
особенность:
если тупо установить время в модули и отключить от платы arduino, то время отсчитывается правильное (за 7 часов разница не больше 1-2 секунд. ).
скеч использую вот такой
#include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; void setup () { Wire.begin(); RTC.begin(); // RTC.adjust(DateTime(__DATE__, __TIME__)); } void loop () { DateTime now = RTC.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(' '); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); delay(1000); }Если в void loop установить delay = 1 секунду, или вообще delay убрать(выводим на дисплей 1602), то время убегает вперед на ~3-5 секунд за 1 минуту, если dalay установить на 10 секунд, то время уже убегает на ~1 cекунда в 2-3 минуты.
где искать ошибку?
Добрый день.
в продолжение темы убегают вперед время.. существенно. примерно 3-4 секунды за 1 минуты.
использую вот http://www.aliexpress.com/item/Ds1307-at24c128-ds18b20-three-in-interface-module/1413800604.html. резистор и конденсатор в модуле есть, на первый взгляд.
особенность:
если тупо установить время в модули и отключить от платы arduino, то время отсчитывается правильное (за 7 часов разница не больше 1-2 секунд. ).
скеч использую вот такой
#include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; void setup () { Wire.begin(); RTC.begin(); // RTC.adjust(DateTime(__DATE__, __TIME__)); } void loop () { DateTime now = RTC.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(' '); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); delay(1000); }Если в void loop установить delay = 1 секунду, или вообще delay убрать(выводим на дисплей 1602), то время убегает вперед на ~3-5 секунд за 1 минуту, если dalay установить на 10 секунд, то время уже убегает на ~1 cекунда в 2-3 минуты.
где искать ошибку?
Прошу прощения а как в это й библиотеке задать время? Использую ее проблем с убеганием нет.
#include <Wire.h> #include <BMP085.h> #include <LiquidCrystal_I2C.h> #include "RTClib.h" #include <TimeHelpers.h> #define CLEAR_INTERVAL _MIN_(1) #define PRINT_INTERVAL _SEC_(1) #define LIGHT_INTERVAL _SEC_(1) #define READ_INTERVAL 500 #define LIGHT_SENSOR A0 #define BORDER_LIGHT_OFF 700 long Temperature = 0, Pressure = 0; long TemperatureMAX = 0, TemperatureMIN = 0; int HOR, MIN, SEC; int maxHOR, maxMIN, minHOR, minMIN; int SensVal = 0; BMP085 dps = BMP085(); LiquidCrystal_I2C lcd(0x27,20,4); RTC_DS1307 RTC; void setup(void) { Wire.begin(); RTC.begin(); dps.init(); lcd.init(); lcd.backlight(); dps.getTemperature(&Temperature); dps.getPressure(&Pressure); TemperatureMAX = Temperature; TemperatureMIN = Temperature; delay(500); } void loop(void) { DO_EVERY(CLEAR_INTERVAL,{ lcd.clear(); ) }; DO_EVERY(READ_INTERVAL,{ DateTime now = RTC.now(); HOR = now.hour(); MIN = now.minute(); SEC = now.second(); dps.getTemperature(&Temperature); dps.getPressure(&Pressure); if (Temperature >= TemperatureMAX){ TemperatureMAX = Temperature; maxHOR = HOR; maxMIN = MIN; } if (Temperature <= TemperatureMIN){ TemperatureMIN = Temperature; minHOR = HOR; minMIN = MIN; } } ); DO_EVERY(LIGHT_INTERVAL,{ SensVal = analogRead(LIGHT_SENSOR); if (SensVal > BORDER_LIGHT_OFF) { lcd.noBacklight(); } else { lcd.backlight(); } } ); DO_EVERY(PRINT_INTERVAL,{ lcd.setCursor(0, 0); lcd.print("T: "); lcd.print(Temperature *0.1); lcd.print(" P: "); lcd.print(Pressure /133.3224); lcd.setCursor(0, 1); lcd.print("max T: "); lcd.print(TemperatureMAX *0.1); lcd.print(" > "); lcd.print(maxHOR); lcd.print(":"); lcd.print(maxMIN); lcd.setCursor(0, 2); lcd.print("min T: "); lcd.print(TemperatureMIN *0.1); lcd.print(" > "); lcd.print(minHOR); lcd.print(":"); lcd.print(minMIN); lcd.setCursor(0, 3); lcd.print("sens: "); lcd.print(SensVal); lcd.setCursor(15, 3); lcd.print(HOR); lcd.print(":"); lcd.print(MIN); } ); }Добрый день.
в продолжение темы убегают вперед время.. существенно. примерно 3-4 секунды за 1 минуты.
использую вот http://www.aliexpress.com/item/Ds1307-at24c128-ds18b20-three-in-interface-module/1413800604.html. резистор и конденсатор в модуле есть, на первый взгляд.
особенность:
если тупо установить время в модули и отключить от платы arduino, то время отсчитывается правильное (за 7 часов разница не больше 1-2 секунд. ).
скеч использую вот такой
#include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; void setup () { Wire.begin(); RTC.begin(); // RTC.adjust(DateTime(__DATE__, __TIME__)); } void loop () { DateTime now = RTC.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(' '); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); delay(1000); }Если в void loop установить delay = 1 секунду, или вообще delay убрать(выводим на дисплей 1602), то время убегает вперед на ~3-5 секунд за 1 минуту, если dalay установить на 10 секунд, то время уже убегает на ~1 cекунда в 2-3 минуты.
где искать ошибку?
Прошу прощения а как в это й библиотеке задать время? Использую ее проблем с убеганием нет.
#include <Wire.h> #include <BMP085.h> #include <LiquidCrystal_I2C.h> #include "RTClib.h" #include <TimeHelpers.h> #define CLEAR_INTERVAL _MIN_(1) #define PRINT_INTERVAL _SEC_(1) #define LIGHT_INTERVAL _SEC_(1) #define READ_INTERVAL 500 #define LIGHT_SENSOR A0 #define BORDER_LIGHT_OFF 700 long Temperature = 0, Pressure = 0; long TemperatureMAX = 0, TemperatureMIN = 0; int HOR, MIN, SEC; int maxHOR, maxMIN, minHOR, minMIN; int SensVal = 0; BMP085 dps = BMP085(); LiquidCrystal_I2C lcd(0x27,20,4); RTC_DS1307 RTC; void setup(void) { Wire.begin(); RTC.begin(); dps.init(); lcd.init(); lcd.backlight(); dps.getTemperature(&Temperature); dps.getPressure(&Pressure); TemperatureMAX = Temperature; TemperatureMIN = Temperature; delay(500); } void loop(void) { DO_EVERY(CLEAR_INTERVAL,{ lcd.clear(); ) }; DO_EVERY(READ_INTERVAL,{ DateTime now = RTC.now(); HOR = now.hour(); MIN = now.minute(); SEC = now.second(); dps.getTemperature(&Temperature); dps.getPressure(&Pressure); if (Temperature >= TemperatureMAX){ TemperatureMAX = Temperature; maxHOR = HOR; maxMIN = MIN; } if (Temperature <= TemperatureMIN){ TemperatureMIN = Temperature; minHOR = HOR; minMIN = MIN; } } ); DO_EVERY(LIGHT_INTERVAL,{ SensVal = analogRead(LIGHT_SENSOR); if (SensVal > BORDER_LIGHT_OFF) { lcd.noBacklight(); } else { lcd.backlight(); } } ); DO_EVERY(PRINT_INTERVAL,{ lcd.setCursor(0, 0); lcd.print("T: "); lcd.print(Temperature *0.1); lcd.print(" P: "); lcd.print(Pressure /133.3224); lcd.setCursor(0, 1); lcd.print("max T: "); lcd.print(TemperatureMAX *0.1); lcd.print(" > "); lcd.print(maxHOR); lcd.print(":"); lcd.print(maxMIN); lcd.setCursor(0, 2); lcd.print("min T: "); lcd.print(TemperatureMIN *0.1); lcd.print(" > "); lcd.print(minHOR); lcd.print(":"); lcd.print(minMIN); lcd.setCursor(0, 3); lcd.print("sens: "); lcd.print(SensVal); lcd.setCursor(15, 3); lcd.print(HOR); lcd.print(":"); lcd.print(MIN); } ); }