RTC DS3231 и несовпадение бод

llaabbss
Offline
Зарегистрирован: 28.12.2017

Здравствуйте, форумчане.
 

Столкнулся с такой проблемой: при заливке абсолютно любого кода на разных библиотеках DS3231 выдает читаебельную информацию на других бодах, отличных от того, что я указываю в скетчах. "Рабочими" являются только два значения. Что я имею в виду:

Несмотря на то, что в скечте я явно указываю скорость данных

Serial.begin(115200);

в мониторе порта я могу получить читабельные данные только если перейду на скорость 74880. Почему так происходит? У меня есть два модуля: один в сборке, второй напаян на плату (именно этот ведет себя так "неправильно"). Я проверил разводку к этому модулю: есть отличие только в номинале подтягивающих резисторов на SDA и SCL. Вместо 4,3 кОм (как в правильно работающем) в "неправильном" модуле используются 10 кОм. Все остальное идентично.

Я даже проверил все скорости и что я на них получаю. Вот таблица скоростей (бод):

В скетче   Читабельные данные от DS3231   Примечание
=====================================================
300        -                              с 4800 - тишина
1200       -                              с 9600 - тишина
2400       -                              с 19200 - тишина
4800       -                              с 38400 - тишина
9600       -                              с 57600 - тишина
19200      -                              с 115200 - тишина
38400      -                              с 115200 - тишина
57600      38400                          с 500 тыс - тишина
74880      -                              с 500 тыс - тишина
115200     74880                          с 1 млн - тишина
230400     -                              с 2 млн - тишина
250000     -                              с 2 млн - тишина
1000000    -                              с 2 млн - тишина
2000000    -

Можно ли как-то согласовать эти боды (чтобы от этих RTC я читал их на той же скорости, что и от микроконтроллера к ПК)? Что-то типа setBaudRate(нужная_скорость)...

Пока под рукой нет резисторов номинала 4,3 кОм, поэтому перепаять не могу и подтердить, что все дело в резисторах. Может быть и сам модуль DS3231 бракованный...

sadman41
Offline
Зарегистрирован: 19.10.2016

Чего только не узнаешь на этом форуме...

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

Могу одно сказать, модуль часов ну точно не при делах.

llaabbss
Offline
Зарегистрирован: 28.12.2017

Могу добавить новый комментарий: модуль, который собран китайцами (с батарейкой и контактами), работает корректно на любых скоростях и эти скорости совпадают с бодами серийного порта между микроконтроллером и ПК!

Схема подключения выглядит так:

b707
Offline
Зарегистрирован: 26.05.2017

вангую, что человек подключил RTc к пинам 0 и 1...

llaabbss - схему подключения в студию. И код скетча тоже бы неплохо.

 

llaabbss
Offline
Зарегистрирован: 28.12.2017

Скетч любой. Абсолютно любой работающий.

b707
Offline
Зарегистрирован: 26.05.2017

что за ардуина и на какие пины подключен модуль?

llaabbss
Offline
Зарегистрирован: 28.12.2017

Два микроконтроллера: Uno (пины A4, A5), ESP-07 (пины 4, 5).

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

DS3231 работает по I2C (читай!!! что это такое) либо на 100кГц либо на 400 кГц, как настроишь.  К сериалу это вот вапще никакова отношения не имеет.  Если данные в сериал не идут, надо первым делом проверить, чтоб скорости Serial.begin(...)  и монитора порта (на компьютере!!!) совпадали. 

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

llaabbss, Вам же сказали

b707 пишет:

llaabbss - схему подключения в студию. И код скетча тоже бы неплохо.

Вы не дали ни того - ни другого. Ваше отмазка

llaabbss пишет:

Скетч любой. Абсолютно любой работающий.

не прокатывает. Любых скетчей не бывает. Давайте скетч (по-возможности покороче) и схему. Иначе, кроме флуда здесь ничего не будет. Пока то, что Вы пишете похоже на бред.

llaabbss
Offline
Зарегистрирован: 28.12.2017

#include <Wire.h>
#include <RtcDS3231.h>

RtcDS3231<TwoWire> rtcObject(Wire);

void setup() {

  Serial.begin(115200);
  rtcObject.Begin();

}

void loop() {

  RtcDateTime currentTime = rtcObject.GetDateTime();
  char str[15];   //declare a string as an array of chars

  sprintf(str, "%d/%d/%d %d:%d:%d",
          currentTime.Year(),   //get year method
          currentTime.Month(),  //get month method
          currentTime.Day(),    //get day method
          currentTime.Hour(),   //get hour method
          currentTime.Minute(), //get minute method
          currentTime.Second()  //get second method
  );

  Serial.println(str); //print the string to the serial port

  delay(1000); 

}

Пример взят вот отсюда

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

А если в строке 16 заменить 15 на 25? Попробуйте.

И кстати, дайте пожалуйста ссылку на то место, откуда Вы такую продвинутую библиотеку скачали.

llaabbss
Offline
Зарегистрирован: 28.12.2017

Рекомендованная схема подключения такая:

Фактическое подключение такое:

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

Ну, что поменяли 15 на 25?

sadman41
Offline
Зарегистрирован: 19.10.2016

Возьмите штатный пример из библиотеки, не бегайте по левым сайтам: https://github.com/Makuna/Rtc/blob/master/examples/DS3231_Simple/DS3231_Simple.ino

Всё с ним работает, никакие боды часы не сбивают.

llaabbss
Offline
Зарегистрирован: 28.12.2017

ЕвгенийП

OMG! Никогда бы не подумал, что проблема будет именно в этом!

Теперь все работает прекрасно на любых скоростях!

А библиотека взята отсюда:

Вопрос закрыт. Спасибо огромное за помощь!

sadman41
Offline
Зарегистрирован: 19.10.2016

llaabbss пишет:

ЕвгенийП

OMG! Никогда бы не подумал, что проблема будет именно в этом!

Ну, вы хоть поняли, в чем конкретно была проблема?

llaabbss
Offline
Зарегистрирован: 28.12.2017

На вывод результата не хватало места, и его незаконченность не могла быть правильно интерпретирована. Из-за этого и появлялась всякая гречка

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

Ну, вот, видите, а Вы говорили "любой скетч". Оказывается, не любой, а только тот, в котором явная ошибка.

Кстати, в строке 18 вместо %d/%d/%d %d:%d:%d" поставьте %04d/%02d/%02d %02d:%02d:%02d". Будет красиво выводить, типа 2017/02/09 ..., а не как сейчас 2017/2/9

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

llaabbss пишет:

На вывод результата не хватало места, и его незаконченность не могла быть правильно интерпретирована. Из-за этого и появлялась всякая гречка

Не совсем так. Результат выводился полностью, захватывая заодно кусок "свободной" памяти. А потом приходил Serial и начинал на этом же месте свои дела размещать. Вот они и дрались за одну и ту же память.

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

Брр, гадость какая. 

b707
Offline
Зарегистрирован: 26.05.2017

А как писали-то - "любой скетч!"

llaabbss пишет:

Скетч любой. Абсолютно любой работающий.

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

А лучше всего самому писать, а не пробиваться "падалью"

llaabbss
Offline
Зарегистрирован: 28.12.2017

Переделал в loop() код таким образом:


void loop() {
 
  RtcDateTime currentTime = rtcObject.GetDateTime();

  int sysYear = currentTime.Year();
  int sysMonth = currentTime.Month();
  int sysDay = currentTime.Day();
  int sysHours = currentTime.Hour();
  int sysMinutes = currentTime.Minute();
  int sysSeconds = currentTime.Second();

  Serial.println(String(sysYear) + "-" + String(sysMonth) + "-" + String(sysDay) + " " + String(sysHours) + ":" + String(sysMinutes) + ":" + String(sysSeconds));
  
  delay(1000);
 
}

И все продолжает работать правильно (на любой скорости). Хотя вчера не работало...

И я пробовал различные другие библиотеки. С ними тоже было все именно так. Может дело просто в USB кабеле?

 

По поводу написания свое собственного кода: до этих пор мне не требовалось работать с RTC. Сейчас же мне надо было проверить работает ли этот модуль на плате, и именно для этой проверки я решил загрузить в него быстрый сторонний код. Теперь вижу, что все работает и только теперь буду садиться за свой код, который будет только с нужным мне функционалом и понятно как работающим.

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

Во, блин. Было нормально, но с ошибкой. Ошибку поправили, вроде "жизнь наладилась", но Вы зачем-то решили уж совсем, простите, говнокод сделать :((((

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

И кстати, 14-ая строка, видимо для того, чтобы типа "секунды менялись"? А зачем им меняться. если секунды у Вас всё равно показывают цену на прошлогодний овёс? Т.е. секунды у Вас меняются с точностью +/- секунда по отношению к тому моменту, когда меняются секунды в часах?

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Кстати, в строке 18 вместо %d/%d/%d %d:%d:%d" поставьте %04d/%02d/%02d %02d:%02d:%02d". Будет красиво выводить, типа 2017/02/09 ..., а не как сейчас 2017/2/9

вот только что просматривал комменты к этой библиотеке - так там добрая половина вопросов про то, как выести "2017/02/09" вместо 2017/2/9 :) каких только решений не предлагают.

Самое крутое это вот так (использовал часть кода ТС для примера):

String monthname[] = {"00", “01″,”02″,”03″,”04″,”05″,”06″,”07″,”08″,”09″,”10″,”11″,”12”};

RtcDateTime currentTime = rtcObject.GetDateTime();

int sysYear = currentTime.Year();
int sysMonth = currentTime.Month();
int sysDay = currentTime.Day();

Serial.println("Today: "+ String(sysYear) + "-" + monthname[sysMonth] + "-" + String(sysDay);

 

llaabbss
Offline
Зарегистрирован: 28.12.2017

ЕвгенийП пишет:

Во, блин. Было нормально, но с ошибкой. Ошибку поправили, вроде "жизнь наладилась", но Вы зачем-то решили уж совсем, простите, говнокод сделать :((((

Чтобы проверить действительно ли от той ошибки все зависело ))

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

А чего тут проверять-то, если память распахивается? Та ошибка была абсолютно стопудовой. Могла быть ещё и другая, но ту это всё равно не отменяет.