DS1307RTC Выводит загадочную дату 165/165/2165. Какие возможны исправления?

rtc

Моя плата.

Arduino Board

Я думаю, что я правильно подключил его (свет не горит, но плата есть).

Я прочитал первые несколько результатов Google безрезультатно.

Мой пример кода для тестирования чипа:

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {
  while (!Serial); // for Leonardo/Micro/Zero

  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
    }

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(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();

Serial.print(" since midnight 1/1/1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");

// calculate a date which is 7 days and 30 seconds into the future
DateTime future (now + TimeSpan(7,12,30,6));

Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();

Serial.println();
delay(3000);
}

Последовательный выход:

`RTC is NOT running!
2165/165/165 (Tuesday) 165:165:85
 since midnight 1/1/1970 = 1551138385s = 17952d
 now + 7d + 30s: 2019/3/5 12:16:31

2165/165/165 (Tuesday) 165:165:85    
 since midnight 1/1/1970 = 1551138385s = 17952d
 now + 7d + 30s: 2019/3/5 12:16:31

2165/165/165 (Tuesday) 165:165:85
 since midnight 1/1/1970 = 1551138385s = 17952d
 now + 7d + 30s: 2019/3/5 12:16:31

2165/165/165 (Tuesday) 165:165:85
 since midnight 1/1/1970 = 1551138385s = 17952d
 now + 7d + 30s: 2019/3/5 12:16:31

2165/165/165 (Tuesday) 165:165:85
 since midnight 1/1/1970 = 1551138385s = 17952d
 now + 7d + 30s: 2019/3/5 12:16:31

2165/165/165 (Tuesday) 165:165:85
 since midnight 1/1/1970 = 1551138385s = 17952d
 now + 7d + 30s: 2019/3/5 12:16:31

2165/165/165 (Tuesday) 165:165:85
 since midnight 1/1/1970 = 1551138385s = 17952d
 now + 7d + 30s: 2019/3/5 12:16:31

2165/165/165 (Tuesday) 165:165:85
 since midnight 1/1/1970 = 1551138385s = 17952d
 now + 7d + 30s: 2019/3/5 12:16:31

2165/165/165 (Tuesday) 165:165:85
 since midnight 1/1/1970 = 1551138385s = 17952d
 now + 7d + 30s: 2019/3/5 12:16:31

2165/165/165 (Tuesday) 165:165:85
 since midnight 1/1/1970 = 1551138385s = 17952d
 now + 7d + 30s: 2019/3/5 12:16:31

2165/165/165 (Tuesday) 165:165:85
 since midnight 1/1/1970 = 1551138385s = 17952d
 now + 7d + 30s: 2019/3/5 12:16:31

, 👍5


10 ответов


2

На вашем рисунке также показано другое устройство на макетной плате. Удалите это и убедитесь, что:

Земля UNO --> Земля 1307>

Uno 5 вОльт --> 1307 +5 В>

Uno A4 --> Данные 1307>

Uno A5 --> Часы 1307>

Если на 1307 есть светодиодный индикатор питания, он должен гореть.

Если это все еще не работает, то в коде прокомментируйте эту строку:

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

и раскомментируйте эту строку, чтобы установить 1307 с определенной отметкой времени:

// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
,

3

Была та же проблема, однако, мой RTC был 1302 (а не 1307), и ваш, похоже, тоже, пожалуйста, проверьте. Если это 1302, используйте эту библиотеку: https://github.com/msparks/arduino-ds1302

Кроме того, убедитесь, что вы подключаете контакты следующим образом:

  1. Вывод Arduino 7 переходит в CLK
  2. Вывод Arduino 6 переходит в DAT
  3. Вывод Arduino 5 переходит на ПЕРВЫЙ
  4. Arduino 5+ переходит в VCC
  5. Arduino GND переходит в GND
,

2

Поместите в пустую настройку () следующую строку:

Wire.begin();

(Предполагая, что библиотека проводов была включена.) Это настроит соединение I2C между ведущим устройством (Arduino) и ведомым устройством (RTC).

Для более общего использования используется синтаксис: Wire.begin(адрес);

Полный код:

void setup () {
  Wire.begin();
  Serial.begin(9600);
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // РАСКОММЕНТИРУЙТЕ, ЧТОБЫ УСТАНОВИТЬ ВРЕМЯ И ДАТУ ДЛЯ ЭТОГО ПРИ КОМПИЛЯЦИИ.
  //rtc.adjust(DateTime(2017, 8, 31, 14, 45, 14 )); // РАСКОММЕНТИРУЙТЕ, ЧТОБЫ УСТАНОВИТЬ ВРЕМЯ И ДАТУ ВРУЧНУЮ. (ГОД, МЕСЯЦ, ДЕНЬ, 24 ЧАСА, МИНУТА, СЕКУНДА) 


}
,

2

На DS3231 похоже, что устройство может быть несинхронизировано с микроконтроллером. Не уверен, что та же проблема с DS1307, я думаю, стоит попробовать. Мое полное решение по stackoverflow для того же вопроса

Интерфейс I2C доступен всякий раз, когда VCC или VBAT находятся на допустимом уровне. Если микроконтроллер, подключенный к DS3231, сбрасывается из-за потери VCC или другого события, возможно, что связь между микроконтроллером и DS3231 I2C может быть несинхронизирована, например, микроконтроллер сбрасывается при считывании данных с DS3231. Когда микроконтроллер сбрасывается, интерфейс DS3231 I2C может быть переведен в известное состояние путем переключения SCL до тех пор, пока SDA наблюдается на высоком уровне. В этот момент микроконтроллер должен понизить SDA при высоком уровне SCL, создавая условие ЗАПУСКА.

,

0

Я могу проверить, что 1302 не работает с библиотекой 1307. Очень разные фишки. На 1302 нет I2C. Я пытаюсь настроить автосинхронизацию с 1302, изучив, как это делает 1307... не имея большого успеха. Я уже делал это однажды, и это сводит меня с ума, что я не могу понять это снова.

,

2

У меня была та же проблема с "165". Очень прерывистый. Оказывается, я потреблял слишком много энергии от рельсов Arduino для схемы, которой я управлял. Я был ленив, не включив его самостоятельно, когда начинал. Ник Гэннон на arduino.cc показал, откуда взялось 165, и решил мою проблему. Он включил математику bcd.
https://forum.arduino.cc/index.php?topic=184908.0

,

0

У меня была та же самая проблема, и я обнаружил, что плата Teeny RTC 1307. Я обнаружил, что плата, которая у меня была, работала на 3,3 В. Однажды я переместил плату на вывод 3,3 В на своем Arduino Nano.

,

-1

У меня была та же проблема 165/165.

Я меняю кристалл на 32 кГц, что решило мою проблему.

,

В лучшем случае, этот ответ чрезвычайно загадочен и труден для понимания. Можете ли вы объяснить, почему изменение кристалла решило проблему?, @MichaelT


0

У меня была та же проблема. Поставить в setup rtc.begin();

,

"rtc.begin уже находится в методе" настройки операции., @Dave Newton


1

С Arduino Due проблема 165 периодически возникала из-за подделки DS3231 (предположительно совместимого с 1307). Пробовал переключиться на другой RTC, но это не помогло. Переход на Arduino Mega 2560, похоже, решил эту проблему. Mega 2560 намного медленнее, так что, может быть, это проблема с тактовой частотой? В любом случае, это было полезно для решения прерывистой проблемы.

Тем не менее, если вы всегда получаете 165:165, это означает, что ваш Arduino не взаимодействует с вашим RTC. Это другая проблема, и она не будет решена заменой Arduino.

,