DS1307RTC Выводит загадочную дату 165/165/2165. Какие возможны исправления?
Моя плата.
Я думаю, что я правильно подключил его (свет не горит, но плата есть).
Я прочитал первые несколько результатов 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
@remydib, 👍5
10 ответов
На вашем рисунке также показано другое устройство на макетной плате. Удалите это и убедитесь, что:
Земля 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));
Была та же проблема, однако, мой RTC был 1302 (а не 1307), и ваш, похоже, тоже, пожалуйста, проверьте. Если это 1302, используйте эту библиотеку: https://github.com/msparks/arduino-ds1302
Кроме того, убедитесь, что вы подключаете контакты следующим образом:
- Вывод Arduino 7 переходит в CLK
- Вывод Arduino 6 переходит в DAT
- Вывод Arduino 5 переходит на ПЕРВЫЙ
- Arduino 5+ переходит в VCC
- Arduino GND переходит в GND
Поместите в пустую настройку () следующую строку:
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 ЧАСА, МИНУТА, СЕКУНДА)
}
На DS3231 похоже, что устройство может быть несинхронизировано с микроконтроллером. Не уверен, что та же проблема с DS1307, я думаю, стоит попробовать. Мое полное решение по stackoverflow для того же вопроса
Интерфейс I2C доступен всякий раз, когда VCC или VBAT находятся на допустимом уровне. Если микроконтроллер, подключенный к DS3231, сбрасывается из-за потери VCC или другого события, возможно, что связь между микроконтроллером и DS3231 I2C может быть несинхронизирована, например, микроконтроллер сбрасывается при считывании данных с DS3231. Когда микроконтроллер сбрасывается, интерфейс DS3231 I2C может быть переведен в известное состояние путем переключения SCL до тех пор, пока SDA наблюдается на высоком уровне. В этот момент микроконтроллер должен понизить SDA при высоком уровне SCL, создавая условие ЗАПУСКА.
Я могу проверить, что 1302 не работает с библиотекой 1307. Очень разные фишки. На 1302 нет I2C. Я пытаюсь настроить автосинхронизацию с 1302, изучив, как это делает 1307... не имея большого успеха. Я уже делал это однажды, и это сводит меня с ума, что я не могу понять это снова.
У меня была та же проблема с "165". Очень прерывистый. Оказывается, я потреблял слишком много энергии от рельсов Arduino для схемы, которой я управлял. Я был ленив, не включив его самостоятельно, когда начинал. Ник Гэннон на arduino.cc показал, откуда взялось 165, и решил мою проблему. Он включил математику bcd.
https://forum.arduino.cc/index.php?topic=184908.0
У меня была та же самая проблема, и я обнаружил, что плата Teeny RTC 1307. Я обнаружил, что плата, которая у меня была, работала на 3,3 В. Однажды я переместил плату на вывод 3,3 В на своем Arduino Nano.
У меня была та же проблема 165/165.
Я меняю кристалл на 32 кГц, что решило мою проблему.
У меня была та же проблема.
Поставить в setup rtc.begin();
"rtc.begin уже находится в методе" настройки
операции., @Dave Newton
С Arduino Due проблема 165 периодически возникала из-за подделки DS3231 (предположительно совместимого с 1307). Пробовал переключиться на другой RTC, но это не помогло. Переход на Arduino Mega 2560, похоже, решил эту проблему. Mega 2560 намного медленнее, так что, может быть, это проблема с тактовой частотой? В любом случае, это было полезно для решения прерывистой проблемы.
Тем не менее, если вы всегда получаете 165:165, это означает, что ваш Arduino не взаимодействует с вашим RTC. Это другая проблема, и она не будет решена заменой Arduino.
- Преобразование в Unix Timestamp и обратно
- Разница между «time_t» и «DateTime»
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- RtcDateTime' не называет тип
- Библиотека времени Arduino и библиотеки RTC
- Не удалось выделить SSD1306 при добавлении константы
- Как получить текущую дату
- Странная проблема. Ардуино перестает работать через несколько часов. Мнения, пожалуйста
В лучшем случае, этот ответ чрезвычайно загадочен и труден для понимания. Можете ли вы объяснить, почему изменение кристалла решило проблему?, @MichaelT