RTC DS1302, DS1307 и DS3231 инициализация с помощью ESP8266
ฝัง
- เผยแพร่เมื่อ 30 ก.ค. 2016
- Модули часов реального времени (RTC) DS1302, DS1307 и DS3231 и их инициализация с помощью NTP клиента на ESP8266.
Даташиты на микросхемы DS:
datasheets.maximintegrated.com...
datasheets.maximintegrated.com...
datasheets.maximintegrated.co...
Скетч:
drive.google.com/file/d/0B7Yh... - วิทยาศาสตร์และเทคโนโลยี
Спасибо за информацию по батарейке на модуле DS3231. В 2 часа ночи увидел ваше видео, пошёл замерил - так и есть. Тогда же всё и исправил. Спасибо ещё раз.
Спасибо за труд, посмотрел до конца.
На 1307 есть ещё ОЗУ, запитаное от батарейки. В некоторых случаях очень удобно. Мне, например, надо было знать сколько времени не было питания. Для этого я в это "батарейной" ОЗУ каждую секунду пишу текущее время, а при старте проверяю время в ОЗУ и в часах. Во флеш каждую секунду писать проблематично. В 3231 такой памяти нет ( была ещё микросхема mk41t56 - в ней, если не путаю, есть программная подстройка точности хода.
Спасибо, ценная информация для новичка !
Отличное видео! Спасибо!
Здравствуйте Alex Morozov. Подскажите пожалуйста, возможно ли приведенный скетч сделать отдельно для каждого модуля? Просто я не очень хорошо разбираюсь в программировании и мне сложно разобраться какие фрагменты скетча к каким модулям относятся. Просто я планирую использовать модуль RTC DS1302 совместно с другим устройством на ардуино Wemos D1 mini. Поэтому мне необходимо чтобы прошивка занимала как можно меньше объема памяти Ардуино. Еще в данном видео вы выводите информацию в монитор порта, что и в каких строках скетча необходимо изменить чтобы выводить индикацию на индикатор TM1637 подключенного к определенным выводам Ардуино?
Еще для стабильности работы модуля RTC DS1302 необходимо в цепь минуса питания добавить резистор на 10 килоОм или выход модуля подключать к аналоговым выводам модуля Ардуино. ( про это много раз писали в интернете).
Спасибо.
Огромное спасибо за видео и за библиотеку, сделал на её основе свои LED-часы. Кстати говоря, у меня модуль DS1307 и он отлично работает с ESP-12 без конвертера уровней. Наоборот, сначала подключил его через конвертер, но вместо времени выводились какие-то левые значения вперемешку со значком собаки). Перепроверил - всё подключено правильно. Убрал конвертер, подключил напрямую и всё заработало).
Вы DS1307 от 5 В запитали? Хорошо бы проверить осциллографом уровень логической единицы на SDA при чтении из модуля, а то ногу ESP поджарить можно. Или вам повезло и ваш RTC заработал на 3.3 В (что по даташиту и моему опыту не должно быть)?
Да, DS1307 запитан от 5В. Осциллографа нет, проверить уровни не могу. Может для ESP это плохо по питанию, но через конвертер не вышло) В общем, посмотрим, сгорит - будем дальше думать, но пока ESP несколько дней работает стабильно и не греется вообще.
как по отдельности считать часы и минуты, просто хочу использовать в своём проекте, у меня DS1302.
С esp32 работать будут библиотеки? Как раз искал способ синхронизации часов при подключении к интернету. 😉👍
Чтобы DS1307 работал от 3.3в и без конвертера уровней, замените 3в батарейку на 2*ААА аккумулятора (1.2в+1.2в). В даташите указано, что при 1.25*Vbat модуль засыпает. При 3в батарее он заснёт при питании менее 3.75 вольта, а в моем случае при 3в.
От 2.2 батарейки время сброситься, поэтому цепь подзаряда можно оставить. Либо заряжать аккумуляторы раз в год. Я использую севшие батарейки, ток потребления от них 0.2мкА, и то когда отсутствует питание DS1307.
Привет, подскажите делали ли вы урок по работе с пзу у esp. Хочу в проекте настройки сохранять после перезагрузки
Урок не делал, я не учитель. :)
А так все "умные реле" не зависимо от платформы (Mega или ESP8266) сохраняют и восстанавливают свои параметры еще с первых версий. Более-менее отдельно эта технология рассмотрена в ролике th-cam.com/video/b1CzBbgMV40/w-d-xo.html
Спасибо за видео-урок! Очень познавательно. Вот только выложенную Вами библиотеку (Скетч) по ссылке, в описании под видео, скачать не получается. Пишет: "Не удалось найти запрошенный URL на этом сервере", хотя сам zip-файл просмотреть можно. Возможно его как-то от Вас заполучить?
Библиотеку скачал. Как у себя, так и на видео, после заливки скетча в модуль DS3231, я не увидел в мониторе порта отображения дня недели.
Alex, подскажи - есть ли возможность подключить один модуль реального времени к двум (трем, четырем) ардуинам сразу?
Как вы себе это представляете? На шине I2C слейвов может быть несколько, а мастер один.
вай нот? соедени ардуины меж собобой например через softserial.h и передавай что хочешь.
только если это уно, скорсть 9600
Инфа норм ;)
А сколько байт тратится на таблицы виртуальных функций в классах? И в какой памяти эти таблицы расположены?
Каждый указатель занимает 4 байта. В последнем на данный момент пакете поддержки ESP8266 для Arduino IDE (2.4.1) VTABLE перенесли во флешь-память вроде как.
А так конечно нужно делать всего 2 виртуальные функции get и set с беззнаковым длинным целым аргументом (UNIXTIME), а все остальные реализовывать через них как обычные методы, но это будет неэффективное решение в плане скорости выполнения, зато экономичное по расходу памяти.
Здравствуйте, спасибо за разъяснения. Вопрос: есть модуль 1302, но он не хочет работать, всегда выдает одну и туже дату:
RTC epoch = 946684800
The RTC date and time is 01.01.2000 00:00:00
Если установить время, то это же время и выдается постоянно, т. е. отсчет не идет. Пробовал большинство библиотек для этого модуля, но ничего не помогло, хотя в протеусе они работают. Походу китайцы брак впихнули, только я не могу понять это чипу хана или кварцу. Ставил на 16МГц (других нет ))) ), изменений нет. Подскажите, если знаете, как саму 1302 проверить на работоспособность?
К сожалению, как проверить DS1302 не знаю. Менять кварц 32kHz на 16MHz явно не поможет. Раз ответ от микросхемы есть - значит скорее всего она рабочая. Тогда кварц мертвый. Возьмите его от старой материнской платы, там должен на RTC стоять как раз на 32kHz. На китайские кварцы с дешевых модулей нареканий много.
Ок, спасибо, на 32КГц нет у меня. Я, в принципе, уже 1307 и 3231 заказал, а пока 1302 мучаю. Пойду кварц выпаивать )
А вы точно в регистре секунд старший бит не устанавливаете случайно? Это Clock Halt, он должен быть 0, чтобы часы начали идти.
1307 не сильно лучше 1302, только что I2C, зато от 3.3 B не работает. А вот 3231 - совсем другое дело. И точнее и удобнее.
в даташите вот что написано: The MSB
(Bit 7) must be a logic 1. If it is 0, writes to the DS1302 will be disabled.
Может подскажете как определить? В библиотеке же должен он устанавливаться?
Вы говорите о старшем бите в контрольном регистре, а я говорю о старшем бите в секундном регистре.
Библиотеки должны бит CH сбрасывать. Но я на всякий случай уточнил, вдруг вы руками регистры устанавливаете.
У меня следующий вопрос. Как я могу исправить, чтобы занять время, включая зимнее или летнее время с функцией Web-адрес google.com:80 в этом коде:
void getTime()
{
WiFiClient client;
if (!client.connect("www.google.com", 80)) {
Serial.println("connection to google failed");
return;
}
client.print(String("GET / HTTP/1.1
") +
String("Host: www.google.com
") +
String("Connection: close
"));
int repeatCounter = 0;
while (!client.available() && repeatCounter < 10) {
delay(500);
//Serial.println(".");
repeatCounter++;
}
String line;
client.setNoDelay(false);
while(client.connected() && client.available()) {
line = client.readStringUntil('
');
line.toUpperCase();
if (line.startsWith("DATE: ")) {
date = " "+line.substring(6, 22);
h = line.substring(23, 25).toInt();
m = line.substring(26, 28).toInt();
s = line.substring(29, 31).toInt();
localMillisAtUpdate = millis();
localEpoc = (h * 60 * 60 + m * 60 + s);
}
}
client.stop();
}
// =======================================================================
void updateTime()
{
long curEpoch = localEpoc + ((millis() - localMillisAtUpdate) / 1000);
long epoch = round(curEpoch + 3600 * utcOffset + 86400L) % 86400L;
h = ((epoch % 86400L) / 3600) % 24;
m = (epoch % 3600) / 60;
s = epoch % 60;
}
// =======================================================================
или как заменить его с кодом NTP Client, что эта проблема решается? И еще один вопрос. Могу ли я на существующие часы RTC3231 добавить этот модуль, чтобы периодически обновлять часы времени? Только для летнего и зимнего времени. В противном случае он практически не нуждается в проверке, так точно.
Зимнее и летнее время как и тайм-зона - это исключительно локальная настройка и никак ее кроме задания вручную самому не применить, не зависимо от источника получения точного времени (NTP серверы или HTTP ответ).
Время переводится в последнее воскресенье март/октябрь (?) в 4 часа утра. В этих месяцах 31 день. Соотвественно нужно запомнить флаг что время УЖЕ переведено осенью назад, высчитать число 31-7, знать день недели и применять в 4 часа утра [часовой пояс] + [летнее время] или [часовой пояс] + [0]
В модуле DS3231 есть еще датчик температуры....
Это не совсем датчик, а устройство для внутренней термокалибровки. Точность его сомнительна. Но да, как факт есть. И как работать с ним описано в даташите.
Изменение timeZone не меняет показание часов
Что пишет в сериал?
sending NTP packet...
packet received, length=48
Seconds since Jan 1 1900 = 3723463140
Unix time = 1514474340
The UTC time is 15:19:00
RTC epoch = 2309275169
The RTC date and time is @5.85.20@5 45:@5:@5
Updating RTC ( epoch difference is 794790029)
Но возможно проблема в том, что модуль не видится сканером шины
(только сейчас обнаружил) .Решаю сейчас.Спасибо за оперативность.
Сканер на arduino видит два адреса 0х57 и 0х68
Речь идет о DS3231? 0x68 - это адрес часов, другой адрес EEPROM. Если правильный дефайн раскомментирован в .ino-файле, то все должно работать. Если, конечно, сам модуль часов рабочий.
Про пилу на 32кГц, вы загнули, конечно. 😂 Там чистый меандр! А дальше смотреть не интересно стало!
Звук говно? Че за?