DS1307: время то отстаёт, то спешит

Тема в разделе "Arduino & Shields", создана пользователем alex-prog, 31 июл 2016.

Метки:
  1. alex-prog

    alex-prog Гик

    Продолжая тему, с подключением разобрался, добавил кварц, и немного передал код:
    Код (C++):

    #include <Wire.h>
    //
    #include "DS1307.h"

    //
    DS1307 clock;//define a object of DS1307 class

    //
    char c, l, t;
    //
    String timeData;
    //
    boolean needSet, click;
    //
    byte hour, minute,
    //
         second, day, month, halfYear;

    //
    int year;

    char getInt(
      //
      String buf, int startIndex) {
    //
    return int(buf[startIndex] - '0') * 10 + int(buf[startIndex + 1]) - '0';
    }

    void setup()
    {
    //
    pinMode(2, INPUT);
    //
    pinMode(12, INPUT);
    //
    pinMode(13, INPUT);

    //
    Serial.begin(9600);

    //
    click = false;

    //
    Serial.println("Need set time?");

    //
    while (!click) {
    //
    click = digitalRead(13);

    //
    if (click) needSet = true; else click = digitalRead(12);
    }

    //
    timeData = "";

    //
    Serial.println(needSet);

    //
    clock.begin();

    //
    if (needSet) {
    //
    Serial.println("Input hh:mm:ss dd/mm/yyyy:");

    //
    l = 0;

    //
    while (l < 19) {
    //
    while (Serial.available() > 0) {
    //
    c = Serial.read();
    //
    if (c != '\n')
    //
    timeData += c;
    //
    l++;
       }
      }

    //
    Serial.println(timeData);

    //
    hour = getInt(timeData, 0);
    //
    minute = getInt(timeData, 3);
    //
    second = getInt(timeData, 6);

    //
    day = getInt(timeData, 9);
    //
    month = getInt(timeData, 12);
    //
    halfYear = getInt(timeData, 15);
    //
    year = halfYear * 100;
    //
    halfYear = getInt(timeData, 17);
    //
    year += halfYear;

    //
    clock.fillByHMS(hour, minute, second);
    //
    clock.fillByYMD(year, month, day);
    //clock.fillDayOfWeek(SAT); //Saturday
    //
    clock.setTime();//write time to the RTC chip
    }

    //
    clock.getTime();
    //
    printTime();
    }

    void loop()
    {
    //
    if (digitalRead(2)) {
    //
    clock.getTime();
    //
    printTime();
    //
    delay(1000);
    }
    }

    /*Function: Display time on the serial monitor*/
    void printTime()
    {
    //
    Serial.print(clock.hour, DEC);
    //
    Serial.print(":");
    //
    Serial.print(clock.minute, DEC);
    //
    Serial.print(":");
    //
    Serial.print(clock.second, DEC);
    //
    Serial.print("  ");

    //
    Serial.print(clock.dayOfMonth, DEC);
    //
    Serial.print("/");
    //
    Serial.print(clock.month, DEC);
    //
    Serial.print("/");
    //
    Serial.print(clock.year + 2000, DEC);
    //
    Serial.println(" ");
    }
     

    Добавил 3-ю кнопку, при нажатии которой в Монитор порта отправляется время с микросхемы.

    Далее, делаю тест: устанавливаю время, отключаю Arduino от компьютера, и оставляю проект на сутки, в итоге, часы отстают на 20 минут. Не закрывая монитор порта, запрашиваю время, по нажатию на кнопку, и замечаю, что часы начинают идти быстрее: за 10 секунд, они ускоряются на одну секунду.

    Почему такое может быть?
     
  2. DIYMan

    DIYMan Guest

    Ответ: DS1307. Выкиньте это и юзайте DS3231 - счастье будет безгранично.
     
  3. alex-prog

    alex-prog Гик

    DIYMan, не ужели он такой не хороший? Зачем тогда их выпускают... Честно, думаю что сам что-то не так сделал. Может в коде что-то неправильно, или подключение нужно переделать?
     
  4. DIYMan

    DIYMan Guest

    Зачем выпускают Жигули-классику? Говно ведь, но - выпускают ;) Реально говорю - выбросьте и забудьте, тем более что DS3231 в виде готового модуля, да ещё с EEPROM на борту - на али как буханка хлеба стОит. Оно вам надо - секс с извращениями?
     
  5. alex-prog

    alex-prog Гик

    DIYMan, спорить с Вами не буду, так как плотно с ними не работал, но всё же, исправить до правильного варианта очень хочется. Не в этом ли суть работы человека ;)

    Опять же, даже если буду брать DS3231, то без всяких плат, чисто микросхему. Зачем лишние косяки себе тащить, а там, ИМХО, они вполне вероятны...

    Далее, если всё же, кто-то будет заинтересован в решении, просьба проверить код и подключение, оно практически как в данной теме, всего одну кнопку добавил, по коду будет понятно, думаю :)
     
  6. если DS1307 не из китая и с нормальным кварцем, то вполне прилично работает
    а те квадратные модули полный шлак.
     
  7. alex-prog

    alex-prog Гик

    Просто интегральная микросхема и кварцевый резонатор (32768 Гц, 12.5pF, 20 ppm):
    ds1307.png quartz.png

    Пушной звер, тоже думаю что я что-то сам перемудрил ;) Вопрос только, что?