Какая библиотека поддерживает и DS1307 и DS3231?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а то надоело разводить зоопарк конфликтующих библиотек.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

можно и без библиотек обойтись, например ds3231 кусок кода

void readDS3231time(byte * second, byte * minute, byte * hour, byte * dayOfWeek, byte * dayOfMonth, byte * month, byte * year) {
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 7);
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) {
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
float readTemperature() {
  float tempr = 0;
  Wire.beginTransmission(0x68);
  Wire.write(0x11);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 2);
  while (2 <= Wire.available()) {
    tempr = (((Wire.read() << 8) | Wire.read()) >> 6) * 0.25;
  }
  return tempr;
}
byte decToBcd(byte val) {
  return ( (val / 10 * 16) + (val % 10) );
}
byte bcdToDec(byte val) {
  return ( (val / 16 * 10) + (val % 16) );
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что, разводить зоопарк схожих по функциональности микросхем лучше? Может с этого начать?

std
Offline
Зарегистрирован: 05.01.2012

Tomasina, RTClib.

bwn
Offline
Зарегистрирован: 25.08.2014

Наверно все таки чистый Wire. RTC библиотеки полный функционал 3231 не поддерживают. Если нужны только часы, тогда да.
Я себе только 3231 оставил + ионистор. Ни особого ухода времени, ни обвязки никакой не надо.
Специально сходил посмотрел, где то 3 минуты отстали месяцев за 11 - год.

Joiner
Offline
Зарегистрирован: 04.09.2014

bwn пишет:

Наверно все таки чистый Wire. RTC библиотеки полный функционал 3231 не поддерживают. Если нужны только часы, тогда да.
Я себе только 3231 оставил + ионистор. Ни особого ухода времени, ни обвязки никакой не надо.
Специально сходил посмотрел, где то 3 минуты отстали месяцев за 11 - год.

Атомные часы отстали от моих DS3231 за 20 дней на 1 секунду. По подсчетам разница за год будет 19 сек! Поразительно!

dhog1
Offline
Зарегистрирован: 01.03.2016

С часами вообще интересные вещи происходят.

Вот _если_бы_  могли иметь "внутри" MCU некое сердце с частотой 1 Гц,  зачем нам, поручик, вообще часы? Ведь _если_ "выставить" начальное значение, например число секунд от 1 января 1970 года до момента запуска таких часов (UNIX timestamp), то реальное время всегда узнаем.

Это делает стандартная библиотека time.h, которая подхватывается gcc компилятором. Можно самому написать перевод числа секунд в текущее время, это несложно (ну посмотреть в реализации "RTC" различных библиотек ардуино). Важно опереться на "поставщика" секунд.

"Поставщиком" секунд может быть "часовой" кварц 32.678 кГц на ножках TOSC микропроцессора (тактирует асинхронный таймер MCU), может быть схема (модуль) DS3231 (или DS1307) через игнорируемую многими ножку "32kHz" (ну или даже другую, связанную с "будильником" ножку "INT/SQW", поставляющую 1 Гц). Логично думать, что этот "поставщик" секунд тактирует и "часы" DS3231 (DS1307).

Тут есть скользкий момент, связанный с температурной компенсацией, которую производят "часы" DS3231. Обтекаемо об этом ниже.

Меня вдохновил на этот текст комментарий Joiner, который (IMHO) остроумно отозвался о точности атомных часов. Ну и если серьезно, от моих китайских DS3231 за 30 (примерно) дней атомные часы убегают на 1-2 секунд (если Инет не врет). В домашних условиях использую DS3231 больше двух лет.

В приложении так и не понял для себя, нужно ли (и как часто) синхронизировать "часы" (DS3231) с программным счетчиком секунд. Тупо делаю это, т.с. "на всякий случай".

Tomasina

Располагая таким ценным инструментом, как поддерживаемый в актуальном состоянии счетчик секунд, вопрос о библиотеках не стоит. Ну т.е. вы сами напишете необходимый функционал - таймеры, будильники, что там еще.

bwn
Offline
Зарегистрирован: 25.08.2014

Joiner пишет:

bwn пишет:

Наверно все таки чистый Wire. RTC библиотеки полный функционал 3231 не поддерживают. Если нужны только часы, тогда да.
Я себе только 3231 оставил + ионистор. Ни особого ухода времени, ни обвязки никакой не надо.
Специально сходил посмотрел, где то 3 минуты отстали месяцев за 11 - год.

Атомные часы отстали от моих DS3231 за 20 дней на 1 секунду. По подсчетам разница за год будет 19 сек! Поразительно!

Опровергать не буду, т.к. атомных в том месте близко нет, а сверял с наручными, по которым и устанавливал.))))  Кстати и температурный разбег зима-лето там весьма значительный.

Joiner
Offline
Зарегистрирован: 04.09.2014

Не понимаю, зачем синхронизировать обращение к часам по внутреннему генератору, ну как там говорят про прерывания.... В часиках в регистрах хранится отсчитанное часами время, и когда бы я у них его ни спросил, т.е. обратился, они покажут точное время, и не имеет значение как я буду спрашивать, раз в час, раз в минуту, раз в секунду. У меня в скетче примерно раз в секунду (previos_millis-current_millis). И пусть у микропроцессора счетчик секунд может не такой точный, но секундная стрелочка перемещается так как надо, ни где не задерживается и ни где не перескакивает. Но в каких-то случаях прерывания будут самое то....

Может я не прав, но мне так кажется. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Joiner пишет:

Не понимаю, зачем синхронизировать обращение к часам по внутреннему генератору, ну как там говорят про прерывания.... В часиках в регистрах хранится отсчитанное часами время, и когда бы я у них его ни спросил, т.е. обратился, они покажут точное время, и не имеет значение как я буду спрашивать, раз в час, раз в минуту, раз в секунду. У меня в скетче примерно раз в секунду (previos_millis-current_millis). И пусть у микропроцессора счетчик секунд может не такой точный, но секундная стрелочка перемещается так как надо, ни где не задерживается и ни где не перескакивает. Но в каких-то случаях прерывания будут самое то....

Может я не прав, но мне так кажется. 

Не прав. Часы умеют выдавать прерывание при переходе секунды (минуты). Поэтому, если работать по этому прерыванию, то Вы обновляете показания именно при изменении таковых в самих часах. А если просто оправшивать, как Вы, то Вы обновляете показания раз в секунду, но не при переходе секнды, а когда придётся. В итоге Вы привносите погрешность в среднем в полескнды просто за счёт неаккуратного показа.  Особенно это проявляется, если Вы не показываете секунды, а только минуты (и опрашиваете раз в минуту, соответсвенно). Там поргешность в среднем полминуты будет. А если сидеть на прерывании, то такой проблемы нет - перескочила минута в часах и у Вас в паоказе в тот же момент.