Убегает время на Tiny rtc ds1307

five_o
Offline
Зарегистрирован: 03.10.2013

Друзья, подключил к ардуине Tiny rtc ds1307 согласно примеру схемы подключения. 

Vcс – питание;  GND – земля;  SDA – А4;  SCL – А5; 

Модуль часов покупной.
Пробовал использовать поочередно разные библиотеки - <RTClib.h> и <ds1307.h>.
Заливаю пример скетча из соответствующей библиотеки. 
Время устанавливается, часы идут, но вот вопрос - как они идут. За секудну часы отсчитывают порядка 20 секунд. У меня складывается впечатление, что тут аппаратная проблема, может брак, может при пайке что-то запортил. Рассчитываю на ваше мнение.

 
ales2k
Offline
Зарегистрирован: 25.02.2013

Резисторы на шине есть?

Конденсаторы по питанию есть?

five_o
Offline
Зарегистрирован: 03.10.2013

Я извиняюсь, но не до конца понимаю, зачем и где они должны быть.

ales2k
Offline
Зарегистрирован: 25.02.2013
msng
Offline
Зарегистрирован: 07.06.2012

речь идет про подтяжку i2c, резисторы д.б. между sda и vcc, другой между scl и vcc, ну а конденсаторы по питанию (между vcc и gnd ). думаю дело в чем то другом. (на всех моих покупных модулях они были). а сама дунька нормально обрабатывает допустим команду delay(1000) ? останавливается на 1 секунду или меньше?

ps всё же думаю дело в модуле

five_o
Offline
Зарегистрирован: 03.10.2013

да, резисторы и конденсаторы на моем модуле присутствуют. 

ардуина нормально обрабатывает команды, при delay(1000) останавливается на 1 секунду как и положено,

ales2k
Offline
Зарегистрирован: 25.02.2013

Да может быть кварц. Но у меня есть именно Tiny rtc ds1307 без подтягивающих резисторов - он же Tiny. Зато американский с хорошим кварцем и вообще не убегает :)

ales2k
Offline
Зарегистрирован: 25.02.2013

Значит всетаки кварц битый - есть возможнось впаять другой? Лучше от старой материнки.

 

five_o
Offline
Зарегистрирован: 03.10.2013

Ок, спасибо за советы, вечером все прозвоню и попробую по возможности поменять кварц.
 
 

anneksiya81
Offline
Зарегистрирован: 17.12.2013

Добрый день.

в продолжение темы убегают вперед время.. существенно. примерно 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 минуты.

где искать ошибку?

 

maxi_10
Offline
Зарегистрирован: 05.01.2012

anneksiya81 пишет:

Добрый день.

в продолжение темы убегают вперед время.. существенно. примерно 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);
  }
  );
}

 

anneksiya81
Offline
Зарегистрирован: 17.12.2013

maxi_10 пишет:

anneksiya81 пишет:

Добрый день.

в продолжение темы убегают вперед время.. существенно. примерно 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);
  }
  );
}

 

 

DateTime dt3 (2009, 1, 2, 0, 0, 0);
RTC.adjust(dt3);