Adafruit RTC begin() не возвращает false
Я программирую свой arduino с возможностью идти в ногу со временем с DS3231 от Adafruit. У меня еще нет модуля, но я пытаюсь выяснить остальную часть сборки без него.
Однако, похоже, что способ определения работы RTC не работает, так как он возвращает true даже без модуля.
Пример кода из библиотеки Adafruit RTC для использования этого модуля:
// Функции даты и времени с использованием DS3231 RTC, подключенного через I2C и Wire lib
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup () {
#ifndef ESP8266
while (!Serial); // для Leonardo/Micro/Zero
#endif
Serial.begin(9600);
delay(3000); // ожидание открытия консоли
if (! rtc.begin()) { // часть, которая терпит неудачу. begin() возвращает true, когда должен возвращать false
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// следующая строка устанавливает RTC на дату и время компиляции этого скетча
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Эта строка задает RTC с явной датой и временем, например:
// 21 января 2014 года в 3 часа ночи вы бы позвонили:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
}
....
@Snappawapa, 👍2
2 ответа
Лучший ответ:
Если вы посмотрите на исходный код библиотеки, то станет ясно, почему begin()
возвращает true.
От https://github.com/adafruit/RTClib/blob/1.2.0/RTClib.cpp#L434-L437:
boolean RTC_DS3231::begin(void) {
Wire.begin();
return true;
}
Я полагаю, что они планируют в конечном итоге сделать возвращаемое значение begin()
значимым, но пока это не так.
Этого больше не должно произойти.
На самом деле, если вы посмотрите последнюю версию исходного кода на GitHub (1.13.0), то увидите, что теперь разработчики реализовали также случай, когда метод возвращает false.
от https://github.com/adafruit/RTClib/blob/1.13.0/RTClib.cpp#L1537-L1543 :
boolean RTC_DS3231::begin(void) {
Wire.begin();
Wire.beginTransmission(DS3231_ADDRESS);
if (Wire.endTransmission() == 0)
return true;
return false;
}
- Разница между «time_t» и «DateTime»
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Почему Adafruit motor shield не крутит моторы?
- Статус выхода 1 ожидаемое первичное выражение перед ']' Arduino
- Библиотека времени Arduino и библиотеки RTC
- Библиотека программных материалов для плат SAMD
- Определение относительно точной скорости с помощью ИДУ
- Ошибка модуля часов реального Времени-DS3231