2015-10-31 6 views
1

У меня есть модуль DS3231 RTC, и я пытаюсь прочесть его с помощью Arduino UNO через I2C. Я использую образец кода, предоставляемый библиотекой, но он, похоже, не работает.Я не могу заставить DS3231 RTC работать

Единственное, что я выйти из последовательного монитора заключается в следующем:

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

Это не C! Не добавляйте тег C для кода Arduino. – Olaf

ответ

0

Для тех, у кого есть эта проблема, просто попробуйте сменить батарею.

Я купил новый модуль DS3231, и он не работал с нуля. Я получаю странные данные и ноль для температуры. Когда мне удалось правильно прочитать дату, она не сохранилась. Я пробовал все библиотеки, которые я мог найти напрасно.

Я сменил аккумулятор, и теперь все работает.

+0

Похоже на мою проблему. Я не смогу попробовать это пару месяцев, но попытаюсь вернуться. –

-1

Использование: Serial.begin (9600);/другая скорость передачи вместо Serial.begin (115200);

+0

Как это поможет? –

0

С какими выводами вы подключаете его? У меня была такая же проблема, пока я не подключил SDA и SCL RTC к SDA и SCL Arduino соответственно. В зависимости от модели это штыри 20 и 21 на Mega2560, 19 и 18 на микросхеме.

0

Имея такую ​​же проблему, оказывается, что связь DS3231 может несинхронизироваться с микроконтроллером из-за разных Мероприятия. Похоже, что из этого исходит критический вывод, по крайней мере, здесь отладка с DS3231, подключенная к Edu8266 Arduino.

После datasheet спецификации:

I2C, интерфейс доступен, когда либо VCC или VBAT находится на допустимого уровня. Если микроконтроллер, подключенный к DS3231, сбрасывает из-за потери VCC или другого события, возможно, что микроконтроллер и DS231 I2C могут стать несинхронизированными, например, микроконтроллер сбрасывается при чтении данных из DS3231. Когда микроконтроллер сбрасывается, интерфейс DS3231 I2C может быть помещен в известное состояние путем переключения SCL до тех пор, пока не будет обнаружен высокий уровень SDA . В этот момент микроконтроллер должен вытащить SDA с низким уровнем SCL, создавая условие START.

И вдохновенный на своем официальном application note 3506

Использование ESP8266 и используя их I2C implementation. Вы можете получить функции макросов о том, как получить доступ к контактам SDA и SCL поразрядным образом. Вот одна реализованная функция сброса, основанная на official example for the 8051.

#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 вам нужно будет искать в реализации побитового манипулировать SDA и SCL на Arduino I2C core.

 Смежные вопросы

  • Нет связанных вопросов^_^