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));
  } 
}
....

, 👍2


2 ответа


Лучший ответ:

1

Если вы посмотрите на исходный код библиотеки, то станет ясно, почему 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() значимым, но пока это не так.

,

2

Этого больше не должно произойти.

На самом деле, если вы посмотрите последнюю версию исходного кода на 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;
}
,