2013-06-11 7 views
2

эй У меня есть эта проблема, с которой я имел дело в течение последних нескольких дней. У меня есть способ обойти это, но я знаю, что это действительно плохой способ программирования, и я действительно надеюсь, что кто-то может предложить лучший способ сделать это.Arduino Real Time Timer Device

Я пытаюсь получить время от RTC (реального таймера) Я думаю, что это аббревиатура anyway ,,, Его использование DS 1307 IC ,,,,, каждый раз, когда я запускаю и запускаю программу под постоянная мощность, которую он отлично заряжает, но в тот момент, когда я удаляю USB-кабель примерно на 10 секунд, а затем снова подключаюсь, это даст мне эти забавные времена.

Что-то вроде года 2036 и 46 часов и 165 минут действительно просто мусор. Итак, я где-то читал, что на этот раз это всего лишь программный способ сказать, что с устройством нет связи. То, что я действительно не получаю, потому что он постоянно подключен, но эй, что он хочет.

Итак, вот базовый код, который я получил из примера, который пришел с библиотекой. Я думал, потому что нет соединения, просто выполняйте цикл while до тех пор, пока устройство не получит соединение, это хорошо работает, но для загрузки требуется примерно 10 секунд.

Часы реального времени имеет резервный аккумулятор, подключенный и с линиями SCL до A5 и A4 SDA

Как я говорю это работает, но занимает очень много времени, чтобы загрузить и дать мне правильное время.

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib 

#include <Wire.h> 
#include "RTClib.h" 

RTC_DS1307 RTC; 

void setup() { 
    Serial.begin(57600); 
    Wire.begin(); 
    RTC.begin(); 
Serial.println("RTC capturing time!"); 
while (! RTC.isrunning()) 
    { 
    Serial.println("RTC is NOT running!"); 
    Wire.begin(); 
    RTC.begin(); 
    } 
Serial.println("RTC IS running!"); 
// following line sets the RTC to the date & time this sketch was compiled 
// RTC.adjust(DateTime(__DATE__, __TIME__)); 
} 


void loop() { 

DateTime now = RTC.now(); 
Serial.print(now.year(), DEC); 
Serial.print('/'); 
Serial.print(now.month(), DEC); 
Serial.print('/'); 
Serial.print(now.day(), DEC); 
Serial.print(' '); 
Serial.print(now.hour(), DEC); 
Serial.print(':'); 
Serial.print(now.minute(), DEC); 
Serial.print(':'); 
Serial.print(now.second(), DEC); 
Serial.println(); 

Serial.println(); 
delay(1000); 
} 

Выход выглядит так, как будто с LOT больше RTC не работает!

RTC is NOT running! 
RTC is NOT running! 
RTC is NOT running! 
RTC is NOT running! 
RTC is NOT running! 
RTC is NOT running! 
RTC is NOT running! 
RTC is NOT running! 
RTC is NOT running! 
RTC is NOT running! 
RTC is NOT running! 
RTC IS running! 
2013/6/11 22:22:0 

2013/6/11 22:22:2 

2013/6/11 22:22:3 

2013/6/11 22:22:4 

2013/6/11 22:22:5 

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

Пожалуйста, дайте мне знать, если кто-нибудь знает, как лучше решить мою проблему. Я действительно смущен, почему это произойдет.

+1

Код https://github.com/adafruit/RTClib/blob/master/RTClib.cpp#L164 не проверяет, доступны ли какие-либо данные, поэтому, если RTC не был запущен, тогда 'Wire.read() 'будет возвращать -1.Он преобразуется в 0xff при передаче как uint8_t в 'bcd2bin', который также не проверяет ошибочные входы, а просто вычисляет' 0xff - 6 * (0xff >> 4) 'который равен' 255-6 * 15 => 165'. Следовательно, время даты заполняется 165 и другими плохими значениями, если RTC не готов. –

ответ

1

Попробуйте этот код ...

void setup() { 
    Serial.begin(57600); 
    Wire.begin(); 
    RTC.begin(); 
    Serial.println("RTC capturing time!"); 

    while (!RTC.isrunning()) 
    { 
    // do not really need this, remove after testing 
    Serial.println("RTC is NOT running!"); 

    delay(10); 

    } 
    Serial.println("RTC IS running!"); 
    // following line sets the RTC to the date & time this sketch was compiled 
    // RTC.adjust(DateTime(__DATE__, __TIME__)); 
} 
+0

Пробовал с задержкой, но не повезло, это просто закончилось тем, что заняло больше времени. – Spider999

+1

Вы запустили код в виде представленного или просто добавили задержку (10)? В вашем исходном коде у вас были Wire.begin() и RTC.begin() внутри цикла while, и так много было начато. – user2019047

+0

Кроме того, вы уверены, что чип часов питается при отключении USB-кабеля? И вы должны установить часы при запуске, а затем выполнить процедуру в цикле, где вы установите часы с правильным временем. И, пожалуйста, покажите код так же, как и при запуске. Вывод не соответствует указанному вами коду. – user2019047

0

Вы должны выяснить, как вы питания RTC, когда USB отключен. Сначала вы должны проверить, действительно ли аккумулятор хорош. Тогда вам нужно убедиться, что Arduino замечает, что RTC питается от батареи. Это связано с тем, что RTC полностью отключит I2C, пока питание от батареи -> I2C необходимо повторно инициализировать, когда питание будет восстановлено. Дело в том, что ваша библиотека DS1307 может не учитывать это.

У вас вызывает сомнения, что вам необходимо проанализировать исходный код вашей библиотеки и прочитать техническое описание вашего чипа DS1307.

Другое дело в том, что техническое описание говорит

устройство переключается от батареи к VCC, когда VCC больше, чем VBAT + 0.2В и распознает входные сигналы, когда VCC больше, чем 1,25 х VBAT

Вы когда-нибудь измеряли VBAT и VCC при запуске?

+0

У меня всегда есть резервная батарея, и это хорошо, но я не имел понятия об этом, останавливая I2C после потери питания после отключения питания основного USB-устройства. Даже с этими знаниями не Wire.begin(); и RTC.begin(); снова запустите соединение I2C? или я ошибаюсь здесь? Есть ли вероятность узнать о библиотеке, которая будет иметь такой тип функциональности? Я не могу быть первым, кто хочет это сделать, ну, я не знаю :) – Spider999

+0

Я только что взял показания, и я обнаружил, что Vbat сидит на 3.06V, а Vcc - на 5.03V. Так на самом деле моя проблема заключается в том, что строки I2C не вовремя вовремя? но напряжения находятся в допустимых пределах. хорошо, я не знаю, как начать с библиотеки, но что вы думаете о снижении напряжения Vbat? просто поставив резистор в ряд, который может заставить устройство переключаться быстрее? – Spider999

+0

Нет, вы выяснили, что это, вероятно, НЕ является причиной проблемы. Таким образом, вы устранили одну из возможных причин. Вы копали исходный код библиотеки? –