Часы реального времени - ошибка с подключением?

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

  1. alex-prog

    alex-prog Гик

    Здравствуйте.

    Хочу добавить часы реального времени. Прочитал, что можно использовать микросхему DS1307+.

    Нашёл её распиновку, но "+" для подключения батарейки есть (V Bat), а минуса нет...

    Получается, GND (земля или минус), будет общим контактом, как для GND с платы Arduino, так и для минуса батарейки?
     
  2. ZAZ-965

    ZAZ-965 Гуру

  3. alex-prog

    alex-prog Гик

    Понятно, значит земля общая.... А то, уже перемудрить боялся.
     
  4. alex-prog

    alex-prog Гик

    Подключил микросхему таким образом:
    [​IMG]

    И написал код:
    Код (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(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);

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

    //
    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
    }
    }

    void loop()
    {
    //
    clock.getTime();
    //
    t = clock.second;
    //
    if (t != l) printTime();
    }

    /*Function: Display time on the serial monitor*/
    void printTime()
    {
    //
    l = t;

    //
    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(" ");
    }
    Так же, добавил две кнопки на 12-ый и 13-ый цифровые пины. Далее открываю монитор порта, нажимаю кнопку, связанную 13-ым пином, устанавливаю дату (21:30:56 12/07/2016), часы вроде работают. Потом закрываю монитор, и открываю его опять,
    нажимаю кнопку, связанную 12-ым пином, чтобы пропустить установку, и ничего :(

    Подскажите, в чём я ошибся?
     
  5. alex-prog

    alex-prog Гик

    Эх:

    Код (C++):
    //
    if (needSet) {
    //
    Serial.println("Input hh:mm:ss dd/mm/yyyy:");
    //
    clock.begin();
    а для счастья надо:
    Код (C++):

    //
    clock.begin();
    //
    if (needSet) {
    //
    Serial.println("Input hh:mm:ss dd/mm/yyyy:");
     
     
  6. 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(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
    }
    //
    l = 100;
    }

    void loop()
    {
    //
    clock.getTime();
    //
    t = clock.second;
    //
    if (t != l) printTime();
    }

    /*Function: Display time on the serial monitor*/
    void printTime()
    {
    //
    l = t;

    //
    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(" ");
    }
     
  7. Radius

    Radius Гик

    Странно, что они без кварца вообще работают. Часовой кварц (32.768 кГц) обязателен.
     
    alex-prog нравится это.
  8. alex-prog

    alex-prog Гик

    Radius, а что им мешает работать без кварца? Насколько помню, в интегральных схемах (микроконтроллерах) есть свой кварц. Понятно, что импульсы будут с другой частоты, так как использовать только его не достаточно...
     
  9. Radius

    Radius Гик

    Вы посмотрите DataSheet на эту микросхему (DS1307), там однозначно написано, что к выводам 1 и 2 должен быть подключен кварцевый резонатор с частотой 32,768 кГц и нагрузочной емкостью 12,5 пФ, либо на вывод 1 нужно подать внешнюю частоту 32,768 кГц.Только в этом случае часы будут работать правильно.
     
  10. alex-prog

    alex-prog Гик

    Radius, я не спорю с этим.
     
  11. ZAZ-965

    ZAZ-965 Гуру

    В микроконтроллерах есть внутренний RC генератор (Internal Calibrated Oscillator).
     
    alex-prog нравится это.
  12. alex-prog

    alex-prog Гик

    ZAZ-965, точно :)