我无法让DS3231 RTC正常工作

时间:2015-10-31 18:08:37

标签: arduino i2c arduino-ide real-time-clock

我有一个DS3231 RTC模块,我正在尝试使用我的Arduino UNO通过I2C读取它的时间。我正在使用随库提供的示例代码,但它似乎不起作用。

我从串行监视器中得到的唯一一件事是:

20165-85-165 25:165:165 Temperature=254

我和另一个RTC模块也得到了同样的东西,而我的猜测(可能不是这样)是因为它们可能已经溢出但是似乎没有复位引脚。

#include <DS3231.h>
#include <Wire.h>

DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;

byte year, month, date, DoW, hour, minute, second;

void setup() {
    // Start the I2C interface
    Wire.begin();
  #define oneTime
  #ifdef oneTime
    Clock.setSecond(50);//Set the second 
    Clock.setMinute(59);//Set the minute 
    Clock.setHour(11);  //Set the hour 
    Clock.setDoW(5);    //Set the day of the week
    Clock.setDate(31);  //Set the date of the month
    Clock.setMonth(5);  //Set the month of the year
    Clock.setYear(13);  //Set the year (Last two digits of the year)
  #endif
        // Start the serial interface
    Serial.begin(115200);

}
void ReadDS3231()
{
  int second,minute,hour,date,month,year,temperature; 
  second=Clock.getSecond();
  minute=Clock.getMinute();
  hour=Clock.getHour(h12, PM);
  date=Clock.getDate();
  month=Clock.getMonth(Century);
  year=Clock.getYear();

  temperature=Clock.getTemperature();

  Serial.print("20");
  Serial.print(year,DEC);
  Serial.print('-');
  Serial.print(month,DEC);
  Serial.print('-');
  Serial.print(date,DEC);
  Serial.print(' ');
  Serial.print(hour,DEC);
  Serial.print(':');
  Serial.print(minute,DEC);
  Serial.print(':');
  Serial.print(second,DEC);
  Serial.print('\n');
  Serial.print("Temperature=");
  Serial.print(temperature); 
  Serial.print('\n');
}
void loop() {ReadDS3231();delay(1000);}

4 个答案:

答案 0 :(得分:1)

对于有此问题的任何人,只需尝试更换电池。

我买了一个新的DS3231模块,它从零开始就没有工作。我得到了奇怪的数据,而且温度为零。当我设法正确阅读日期它没有被保留。我尝试了所有我无法找到的图书馆。

我更换了电池,现在一切正常。

答案 1 :(得分:0)

你将它连接到哪些引脚?在将RTC的SDA和SCL分别连接到Arduino的SDA和SCL之前,我遇到了同样的问题。根据型号,这些是Mega2560上的引脚20和21,19和18上的Micro ....

答案 2 :(得分:0)

这里遇到同样的问题,结果是由于不同的事件,DS3231通信可能与微控制器不同步。好像神秘的输出来自于此,至少在这里使用连接到ESP8266 Arduino的DS3231进行调试。

遵循datasheet规范:

  

只要VCC或VBAT处于a,就可以访问I2C接口   有效等级。如果连接到DS3231的微控制器复位   由于VCC或其他事件的丢失,有可能是   微控制器和DS3231可以成为I2C通信   不同步的,例如,微控制器在读取数据时重置   来自DS3231。当微控制器复位时,DS3231 I2C   通过切换SCL直到SDA,可以将接口置于已知状态   被观察到处于高水平。那时微控制器   当SCL为高电平时,应将SDA拉低,产生START条件。

并启发他们的官方application note 3506

使用ESP8266并使用他们的I2C implementation。您可以获得有关如何按位访问SDA和SCL引脚的宏功能。这是一个基于official example for the 8051实现的重置功能。<​​/ p>

#define SDA_LOW()   (GPES = (1 << SDA))
#define SDA_HIGH()  (GPEC = (1 << SDA)) 
#define SCL_LOW()   (GPES = (1 << SCL))
#define SCL_HIGH()  (GPEC = (1 << SCL))
#define SDA_READ()  ((GPI & (1 << SDA)) != 0)

void resetRTC() {

  pinMode(SDA, INPUT_PULLUP);
  pinMode(SCL, INPUT_PULLUP);
  do {
    SDA_HIGH();
    SCL_HIGH();
    if (SDA_READ()) {
      SDA_LOW();
      SDA_HIGH();
    }
    SCL_LOW();
  } while (SDA_READ() == 0);

}

这工作正常,似乎解决了问题

更简单的解决方案是调用Wire.status(),它似乎也有效。

Wire.status();

我不确定是否适用于所有情况。此方法正在检查状态,并且在一种情况下,它调用twi_write_start(),它与上面的函数resetRTC()有一些相似之处。

如果您想为该ATMEL Arduino实现类似的功能,您需要查看在Arduino I2C core.上操作SDA和SCL的按位实现

答案 3 :(得分:-1)

使用:Serial.begin(9600); /另一个波特率而不是Serial.begin(115200);