我有一个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);}
答案 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);