RTC DS1302 (Модуль часов реального времени)
- Войдите на сайт для отправки комментариев
Пнд, 22/01/2018 - 16:36
Здравствуйте.
При подключении RTC к ардуино возникла проблема - RTC никак не хочет устанавливать и запоминать время. Менял код, библиотеки, подключение к ардуино - все попусту, выводится 00-00-2000, 00:00:00, DEC, и даже секунды не "идут", монитор порта выводит каждую секунду одно и то же число. Если же отсоединить два или три вывода от цифровых пинов, в мониторе порта выходит 45-25-2099, 45:85:85, SAT (одним словом, белиберда какая - то). В интернете есть аналогичная проблема, но там столкнувшийся с проблемой сам писал библиотеку, я же использовал готовую, и пример из нее. Что это может быть?
Скетч:
// Бибилиотека разработана для RTC модуля http://iarduino.ru/shop/Expansion-payments/chasy-realnogo-vremeni-rtc-tr... // Данный пример устанавливает на модуле заданное время #include <iarduino_RTC.h> iarduino_RTC time(RTC_DS1302, 1, 2, 3); // подключаем RTC модуль на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT // подключаем RTC модуль на базе чипа DS3231, используется аппаратная шина I2C void setup() { delay(300); Serial.begin(9600); time.begin(); time.settime(0,51,21,27,10,15,2); // 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник } void loop(){ if(millis()%1000==0){ // если прошла 1 секунда Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс } }
поиграться с другими библиотеками не пробовали ?
Да, библиотека с официального сайта ардуино. Но там намудрили, простых примеров нет. Пробовал залить что - то - попросту не загружает, выдает ошибку.
Только что еще одну опробовал - то же самое
ну и что что с официального сайта.
баблиотек разных для часов куча.
Ну одну official и две iarduino_RTC. Не помогает
Вообще-то не плохо знать к чему подключал и правильно ли. Возможно нужно подключить библиотеку "Wire.h"
Иван_123, судя по коду в первом сообщении, вы подключаете RTC к ногам 1, 2, 3, при этом используя Сериал-порт. А вы в курсе, что Сериал использует ноги 0 и1? - если у вас в программе используется Serial - к ногам контроллера 0 и1 ничего подключать нельзя
Вы постоянно сбрасываете часы. Уйдите с пина 1 и никогла не трогайте ни грязными руками, ни чистыми (пин 0 - тоже).
.
Окей, поясню: какие только пины не пробовал. Подключал к 3, 4, 5; к 10, 11, 12; 10, 12, 13. Менял код соответственно. Ничего не меняется
Этот код - просто пример из библы, и кстати интересно кто такой пример написал.
Вообще-то не плохо знать к чему подключал и правильно ли. Возможно нужно подключить библиотеку "Wire.h"
пробовал различные комбинации пинов. В интернете куча схем и скетчей для подключения RTC, нигде Wire не используют
Уберите 1, 2, 3 - вы постоянно ресетите модуль сериал портом, как вам написали выше.
Конструктор у библиотеки такой: iarduino_RTC (uint8_t,uint8_t=SS,uint8_t=SCK,uint8_t=MOSI);
Т.е. по умолчанию ожидает увидеть часы на след.пинах: SS, SCK, MOSI.
Посмотрите по картинке распиновки _вашей_ ардуины где у нее эти ноги. Или найдите их вот так: Serial.println(MOSI); ...
Вообще-то не плохо знать к чему подключал и правильно ли. Возможно нужно подключить библиотеку "Wire.h"
пробовал различные комбинации пинов. В интернете куча схем и скетчей для подключения RTC, нигде Wire не используют
Вот пример:
[code] #include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val) { return( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return( (val/16*10) + (val%16) ); } void setup() { Wire.begin(); Serial.begin(9600); // set the initial time here: // DS3231 seconds, minutes, hours, day, date, month, year setDS3231time(00,47,18,1,15,1,18); } void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) { // sets time and date data to DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set next input to start at the seconds register Wire.write(decToBcd(second)); // set seconds Wire.write(decToBcd(minute)); // set minutes Wire.write(decToBcd(hour)); // set hours 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(); } void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set DS3231 register pointer to 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes of data from DS3231 starting from register 00h *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 displayTime() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // send it to the serial monitor Serial.print(hour, DEC); // convert the byte variable to a decimal number when displayed Serial.print(":"); if (minute<10) { Serial.print("0"); } Serial.print(minute, DEC); Serial.print(":"); if (second<10) { Serial.print("0"); } Serial.print(second, DEC); Serial.print(" "); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year, DEC); Serial.print(" Day of week: "); switch(dayOfWeek){ case 1: Serial.println("Sunday"); break; case 2: Serial.println("Monday"); break; case 3: Serial.println("Tuesday"); break; case 4: Serial.println("Wednesday"); break; case 5: Serial.println("Thursday"); break; case 6: Serial.println("Friday"); break; case 7: Serial.println("Saturday"); break; } } void loop() { displayTime(); // display the real-time clock data on the Serial Monitor, delay(1000); // every second } [/code]Это реально рабочий код.
Это реально рабочий код.
Только есть одна проблема DS1302 - не I2C.
Это реально рабочий код.
Только есть одна проблема DS1302 - не I2C.
Блин, точно, извиняюсь.
Нет идей?... Может, неисправен DS1302? Или это маловероятно?
Уберите 1, 2, 3 - вы постоянно ресетите модуль сериал портом, как вам написали выше.
Конструктор у библиотеки такой: iarduino_RTC (uint8_t,uint8_t=SS,uint8_t=SCK,uint8_t=MOSI);
Т.е. по умолчанию ожидает увидеть часы на след.пинах: SS, SCK, MOSI.
Посмотрите по картинке распиновки _вашей_ ардуины где у нее эти ноги. Или найдите их вот так: Serial.println(MOSI); ...
А вот интересно, что это за SS, SCK, MOSI. На моем RTC выходы CLK, DAT и RST, что к чему подключать? На различных сайтах разные версии подключения.
И еще, какую библиотеку то брать? Есть одна с официального сайта ардуино; есть универсальная Iarduino_RTC для всех типов RTC, которую почти на всех сайтах с описанием подключения RTC советуют
Т.е. по умолчанию ожидает увидеть часы на след.пинах: SS, SCK, MOSI.
А вот интересно, что это за SS, SCK, MOSI. На моем RTC выходы CLK, DAT и RST, что к чему подключать? На различных сайтах разные версии подключения.
1, 2, 3 куда подключали? Вот в той же последовательности и SS, SCK, MOSI.
Не факт что я 123 правильно подключал)
Вот выдержка из библиотечного файла:
Эххх...
Подключение: RST - 10, DAT - 11, CLK - 13
Как вариант, для проверки работоспособности модуля взять скетч вот отсюда и залить не изменяя: https://playground.arduino.cc/Main/DS1302
Пины там другие, но в дефайнах отмечены.
Может, модуль неисправен?
Хорошо , попробую
Мда. Как то так. Изменил в коде только пины
В этом случае я бессилен. Начинайте прозванивать ноги модулю и провода, если не имеете иных средств диагностики (например анализатора, чтобы посмотреть, дёргает в принципе модуль ногами или нет). У меня такое было (не с часами правда) - на чипе ногу забыли припаять к плате.
Хех. Я то думал я дурак, а эта болезнь с часами оказалась патологией, эпидемией.
Блин а может быть проблема в том что на модуле кварц, допустим, непропаян? Или то, что я взял батарейку CR2025 вместо CR2032?
Я не пойму чем DS3231 хуже? Тем более это последняя разработка. У меня двое часов на этой микрохе - проблем никаких не было. Точность отличная.
Блин а может быть проблема в том что на модуле кварц, допустим, непропаян? Или то, что я взял батарейку CR2025 вместо CR2032?
Причем здесь батарейка? Батарейка - это автономность. А вот кварц имеет смысл проверить.
Я не пойму чем DS3231 хуже? Тем более это последняя разработка. У меня двое часов на этой микрохе - проблем никаких не было. Точность отличная.
DS3231 у меня есть). Согласен, сразу заработало как только включил. Но это не мой модуль(. Брал на время. Поэтому пытаюсь завести тот модуль который был в наборе ардуино. Ну, если ничего не поможет с 1302, закажу 3231.
Долго мучился с такой же проблемой. На просторах интернета нашел библиотеку DS1302RTC. Можно здесь оставлять файлы, не знаю . Ссылка на скачивание https://drive.google.com/open?id=1uPGQjQKTPknnW9WThLQe9tiihFeUOXE9
Таже проблема, часы не включаются. микросхема DS1302 1705C2 +163AN микросхем 3 штуки картина не менятся. при этом, вставляю в эти часы микросхему DS1302 0136A4 619AA все работает.
dub,а Вы это, запустите скетч,который включает часы. А потом уже скетч при котором часы работают.
А Вы думаете я этого не делал? ставлю библиотеку, пробую все примеры и т.д. кстати вторую микросхему и останавливал и снова запускал. большое подозрение что требуется принципиально новая библиотека.
Пробовал библиотеки; DS1302, DS1302RTC, RTC, iarduino_RTC, arduino-ds1302-master . и еще какую то, точно не помню.
Столкнулся с такой же проблемой. В наличии две платы UNO3 обе китайские аналогии, три (модуля DS1302 покупал вместе) и один модуль HYM1302 (надпись на DIP корпусе) шел в комплекте с набором ардуино.
Так вот три модуля DS1302 (надпись на DIP корпусе) не запускаются, а тот что из комплекта вообще проблем не знал? все сразу запустилось и заработало. На разных платах ардуино пробовал заметил интересную особеность с питанием +5 V рабочий модуль (HYM1302) время начинает показывать с 00:00:00 (время идет как таймер),выключаю UNO, перетыкаю на +3V (без других манипуляций) включаю UNO время показывает как надо (14:52:11). Установку и настройку времени делел через программу FLPROG встроеной утилитой(программой) (если правильно все понял то там используют библиотеку iarduino_RTC).
Время смотрел на дисплее 1602,если надо могу схемку выложить
Достал микросхему HYM1302 заменил её на микруху DS1302 с не рабочего модуля (потенциально, запустить пока не могу) подаю питание и на дисплее вижу 00:00:00 время идет как таймер. Взял пример из библиотеки iarduino_RTC gettime, поменял пины на свои, прошил уно, включил монитор порта, там веселые надписи 00-00-2000, 00:00:00, Dec
. Подозреваю все же неисправность именно микрух DS1302 1705с2+163AN.
Кстати пробовал еще так со старой материнки кварц 32768п рипоял его напрямую к ногам микрухи (2 и 3ноги) корпус на землю (4 нога) попробывал нифига или кварц убил или схему добил или просто руки кривые но ничего нового не произошло. Буду искать кондеры на 6 пФ и резисторы добавить может поможет.
Кстати вставил HYM1302 в модуль откуда достал DS1302 все сразу заработало...похоже все же проблема в микрухе.
Всем привет!
Я бы посоветовал выкинуть все DS1302, но если других нет, то просто поставьте резистор на 4,7-10 кОм между выводами GND Ваших часов и выводом GND Arduino. Еще один способ - подключить питание к часам не от вывода 5V а от вывода 3V3 Arduino.
Но все же лучше выкинуть DS1302 и не жалеть об этом, так как точность их хода иногда достигает ±5 мин в неделю. Песочные часы точнее будут!
Всем привет!
Я бы посоветовал выкинуть все DS1302, но если других нет, то просто поставьте резистор на 4,7-10 кОм между выводами GND Ваших часов и выводом GND Arduino. Еще один способ - подключить питание к часам не от вывода 5V а от вывода 3V3 Arduino.
Но все же лучше выкинуть DS1302 и не жалеть об этом, так как точность их хода иногда достигает ±5 мин в неделю. Песочные часы точнее будут!
Добрый день. Какой модуль реального времени посоветуте? Я пробывал несколько китайских модулей, но все спешат на 5-10 в месяц. Лучше взять один раз нормальный модуль, чем перебирать разные китайские некорректно рабочие.
Заранее благодарен.
DS3231, лучше вряд-ли отыщете.
можно еще за PCF8583 паматреть, у ей вся мощь Филипса за спиной, но там самому паять надо
PCF8563, лежит в коробке, на тесте работала, точность не измерял.
https://ru.aliexpress.com/item/1PCS-PCF8563-PCF8563T-8563-IIC-Real-Time-...
Проблемма в кварце.
Замена на выпаянный из материнки сильно помогает.
Модуль DS1302 в итоге оказался действительно не на I2C или SPI, а на некой 3-wire шине.
Делал очередной псевдо-астротаймер для цветочной подсветки и в итоге всё завелось.
Вот код:
#include <iarduino_RTC.h> // iarduino_RTC для работы с модулями реального времени iarduino_RTC time(RTC_DS1302, 8, 6, 7); // Объект time для модуля DS1302, к выводам RST, CLK, DAT #define RELAY 4 // Выход управления реле нагрузки int H; // часы в 24-часовом формате от 0 до 23 int i; // минуты от 0 до 59 int y; // год без века от 0 до 99 int on = 17; // вкл в 24-часовом формате от 0 до 23 int off = 23; // выкл в 24-часовом формате от 0 до 23 void setup(){ time.begin(); Serial.begin(9600); pinMode(RELAY, OUTPUT); //time.settime(0,59,21,0,0,0); // отладка включения if (time.year == 0) { // если часы сбросились Serial.setTimeout(10000); // таймаут на ввод Serial.println("hours: 0-23"); H = Serial.parseInt(); Serial.println("minutes: 0-59"); i = Serial.parseInt(); Serial.println("year: 0-99"); y = Serial.parseInt(); time.settime(0,i,H,-1,-1,y); } else {digitalWrite(RELAY, HIGH); delay(3000);} Serial.print("Time and year = "); Serial.println(time.gettime("H:i Y")); time.period(1); Serial.end(); } void loop(){ if(millis()%(60000)==0){ time.gettime(); if (time.Hours>=on&&time.Hours<off ) digitalWrite(RELAY, HIGH); else digitalWrite(RELAY, LOW); } }АЛГОРИТМ:
Если часы не установлены спросит в UART часы, минуты и год.
Иначе Включит нагрузку на 3 сек и перейдёт в рабочий режим.
Раз в минуту смотрит который час и переключает нагрузку по условию.
ОПИСАНИЯ ПАРАМЕТРОВ ФУНКЦИЙ:
/* ОПИСАНИЯ ПАРАМЕТРОВ ФУНКЦИЙ: * iarduino_RTC time(название модуля [, вывод SS/RST [, вывод CLK [, вывод DAT]]]); если модуль работает на шине I2C или SPI, то достаточно указать 1 параметр, например: iarduino_RTC time(RTC_DS3231); если модуль работает на шине SPI, а аппаратный вывод SS занят, то номер назначенного вывода SS для модуля указывается вторым параметром, например: iarduino_RTC time(RTC_DS1305,22); если модуль работает на трехпроводной шине, то указываются номера всех выводов, например: iarduino_RTC time(RTC_DS1302, 1, 2, 3); // RST, CLK, DAT Для работы с модулями, в библиотеке реализованы 5 функций: инициировать модуль begin(); указать время settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]); получить время gettime("строка с параметрами"); мигать времем blinktime(0-не_мигать / 1-мигают_сек / 2-мигают_мин / 3-мигают_час / 4-мигают_дни / 5-мигают_мес / 6-мигает_год / 7-мигают_дни_недели / 8-мигает_полдень) разгрузить шину period (минуты); Функция begin(): функция инициирует модуль: проверяет регистры модуля, запускает генератор модуля и т.д. Функция settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]): записывает время в модуль год указывается без учёта века, в формате 0-99 часы указываются в 24-часовом формате, от 0 до 23 день недели указывается в виде числа: 0-воскресенье, 1-понедельник, 2-вторник ..., 6-суббота если предыдущий параметр надо оставить без изменений, то можно указать отрицательное или заведомо большее значение пример: time.settime(-1, 10); установит 10 минут, а секунды, часы и дату, оставит без изменений пример: time.settime(0, 5, 13); установит 13 часов, 5 минут, 0 секунд, а дату оставит без изменений пример: time.settime(-1, -1, -1, 9, 2, 17); установит дату 09.02.2017 , а время и день недели оставит без изменений Функция gettime("строка с параметрами"): функция получает и выводит строку заменяя описанные ниже символы на текущее время пример: time.gettime("d-m-Y, H:i:s, D"); ответит строкой "01-10-2015, 14:00:05, Thu" пример: time.gettime("s"); ответит строкой "05" указанные символы идентичны символам для функции date() в PHP s секунды от 00 до 59 (два знака) i минуты от 00 до 59 (два знака) h часы в 12-часовом формате от 01 до 12 (два знака) H часы в 24-часовом формате от 00 до 23 (два знака) d день месяца от 01 до 31 (два знака) w день недели от 0 до 6 (один знак: 0-воскресенье, 6-суббота) D день недели наименование от Mon до Sun (три знака: Mon Tue Wed Thu Fri Sat Sun) m месяц от 01 до 12 (два знака) M месяц наименование от Jan до Dec (три знака: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) Y год от 2000 до 2099 (четыре знака) y год от 00 до 99 (два знака) a полдень am или pm (два знака, в нижнем регистре) A полдень AM или PM (два знака, в верхнем регистре) если требуется получить время в виде цифр, то можно вызвать функцию gettime() без параметра, после чего получить время из переменных пример: time.gettime(); Serial.print(time.Hours); Serial.print(":"); // Вывод часов Serial.print(time.minutes); Serial.print(":"); // Вывод минут Serial.print(time.seconds); Serial.println(""); // Вывод секунд seconds секунды 0-59 minutes минуты 0-59 hours часы 1-12 Hours часы 0-23 midday полдень 0-1 (0-am, 1-pm) day день месяца 1-31 weekday день недели 0-6 (0-воскресенье, 6-суббота) month месяц 1-12 year год 0-99 Функция blinktime(параметр [, частота ]): указывает функции gettime мигать одним из параметров времени (заменять параметр пробелами) функция может быть полезна, для отображения на дисплее, устанавливаемого параметра времени например при установке минут, они начинают мигать, и Вам понятно, что именно Вы устанавливаете первым аргументом функции указывается параметр в виде числа от 0 до 8 0 не мигать 1 мигают сек 2 мигают мин 3 мигают час 4 мигают дни 5 мигают мес 6 мигает год 7 мигают дни недели 8 мигает полдень второй аргумент функции является необязательным, он указвает частоту миганий в Гц, по умолчанию 1Гц пример: time.blinktime(6); // при выводе на дисплеё будет мигать год с частотой по умолчанию 1Гц пример: time.blinktime(6, 2); // при выводе на дисплеё будет мигать год с частотой 2Гц Функция period(минуты): устанавливает минимальный период обращения к модулю в минутах (от 0 до 255) функция может быть полезна, если шина сильно нагружена, на ней имеются несколько устройств пример: time.period(10); // теперь каждые 10 минут к модулю может быть отправлен только 1 запрос на получение времени ответом на все остальные запросы будет результат последнего полученного от модуля времени + время прошедшее с этого запроса */Модуль DS1302 в итоге оказался действительно не на I2C или SPI, а на некой 3-wire шине.
Сначала нужно испробовать все варианты, а затем прочесть инструкцию. Как обычно.