1

Тема: RTClock

#include <RTClock.h>

RTClock rtclock (RTCSEL_LSE, 32768); 
time_t tt, tt1;
tm_t mtt;
const char * delim = " :";
char s[128]; 
const char * weekdays[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
const char * months[] = {"Dummy", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
byte sec_time;


void setup(){
  Serial.begin(9600);
  ParseBuildTimestamp(mtt);  //  Unix время, отсчет от 00:00:00 1 января 1970
  tt = rtclock.makeTime(mtt) + 25; // +25 сек ко времени, для коррекции времени загрузки скетча
  rtclock.setTime(tt); 
  tt1 = tt;
}

void loop(){
    tt1 = tt;
    rtclock.breakTime(rtclock.now(), mtt);
    if(mtt.second!=sec_time){   
   // sprintf(s, "RTC timestamp: %s %u %u, %s, %02u:%02u:%02u\n",months[mtt.month], mtt.day, mtt.year+1970, weekdays[mtt.weekday], mtt.hour, mtt.minute, mtt.second);
   // Serial.println(s);
    Serial.print(mtt.month);Serial.print(" ");
    Serial.print(mtt.day);Serial.print(" ");
    Serial.print(mtt.year+1970);Serial.print(" ");
    Serial.print(mtt.weekday);Serial.print(" ");
    Serial.print(mtt.hour);Serial.print(" ");
    Serial.print(mtt.minute);Serial.print(" ");
    Serial.print(mtt.second);Serial.println(" ");
    sec_time = mtt.second;
  }
}

uint8_t str2month(const char * d){uint8_t i = 13;while ( (--i) && strcmp(months[i], d)!=0 );return i;}

void ParseBuildTimestamp(tm_t & mt){
    sprintf(s, "Timestamp: %s, %s\n", __DATE__, __TIME__);// Формат времени: "Dec  8 2017, 22:57:54"
    Serial.print(s);
    char * token = strtok(s, delim); // get first token
    // walk through tokens
    while( token != NULL ) {
        uint8_t m = str2month((const char*)token);
        if ( m>0 ) {
            mt.month = m;
            token = strtok(NULL, delim); // get next token
            mt.day = atoi(token);
            token = strtok(NULL, delim); // get next token
            mt.year = atoi(token) - 1970;
            token = strtok(NULL, delim); // get next token
            mt.hour = atoi(token);
            token = strtok(NULL, delim); // get next token
            mt.minute = atoi(token);
            token = strtok(NULL, delim); // get next token
            mt.second = atoi(token);
        }
        token = strtok(NULL, delim);
    }
}

2

Re: RTClock

#include <RTClock.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h> // http://rcl-radio.ru/wp-content/uploads/2019/12/liquidcrystali2c-9.zip
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

RTClock rtclock (RTCSEL_LSE, 32700); // внешний кварц 32768 Гц (коррекция погрешности кварца)
time_t tt, tt1;
tm_t mtt;
const char * delim = " :";
char s[128]; 
const char * weekdays[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
const char * months[] = {"Dummy", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
byte sec_time;


void setup(){
  Serial.begin(9600);
  lcd.init();                     
  lcd.backlight();// Включаем подсветку дисплея
  ParseBuildTimestamp(mtt);  //  Unix время, отсчет от 00:00:00 1 января 1970
  tt = rtclock.makeTime(mtt) + 25; // +25 сек ко времени, для коррекции времени загрузки скетча
  rtclock.setTime(tt); 
  tt1 = tt;
}

void loop(){
    tt1 = tt;
    rtclock.breakTime(rtclock.now(), mtt);
    if(mtt.second!=sec_time){   
    sprintf(s, "RTC timestamp: %s %u %u, %s, %02u:%02u:%02u\n",months[mtt.month], mtt.day, mtt.year+1970, weekdays[mtt.weekday], mtt.hour, mtt.minute, mtt.second);
    Serial.println(s);
    sec_time = mtt.second;
    lcd.setCursor(4, 0);
    lcd.print(mtt.hour/10);lcd.print(mtt.hour%10);lcd.print(":");lcd.print(mtt.minute/10);lcd.print(mtt.minute%10);lcd.print(":");lcd.print(mtt.second/10);lcd.print(mtt.second%10);
    lcd.setCursor(0, 1);
    if(mtt.day<10){lcd.print(" ");}lcd.print(mtt.day);lcd.print(" ");lcd.print(months[mtt.month]);lcd.print(" ");lcd.print(mtt.year+1970);lcd.print(" ");lcd.print(weekdays[mtt.weekday]);
  }
}

uint8_t str2month(const char * d){uint8_t i = 13;while ( (--i) && strcmp(months[i], d)!=0 );return i;}

void ParseBuildTimestamp(tm_t & mt){
    sprintf(s, "Timestamp: %s, %s\n", __DATE__, __TIME__);// Формат времени: "Dec  8 2017, 22:57:54"
    Serial.print(s);
    char * token = strtok(s, delim); // get first token
    // walk through tokens
    while( token != NULL ) {
        uint8_t m = str2month((const char*)token);
        if ( m>0 ) {
            mt.month = m;
            token = strtok(NULL, delim); // get next token
            mt.day = atoi(token);
            token = strtok(NULL, delim); // get next token
            mt.year = atoi(token) - 1970;
            token = strtok(NULL, delim); // get next token
            mt.hour = atoi(token);
            token = strtok(NULL, delim); // get next token
            mt.minute = atoi(token);
            token = strtok(NULL, delim); // get next token
            mt.second = atoi(token);
        }
        token = strtok(NULL, delim);
    }
}

3

Re: RTClock

Привет. В чем отличие ? Загрузил с основной страницы работает.

4

Re: RTClock

Какая возможность изменять время ? Только прошивка ?

5

Re: RTClock

Какая возможность изменять время ? Только прошивка ?

Время устанавливается по времени компиляции

6

Re: RTClock

При отключении питания время сбрасывается! Батарейку подключил.

7

Re: RTClock

Померьте напряжение на батарейке.

8

Re: RTClock

С батарейкой все в порядке! Проверил питание на контакте "VBAT" контроллера - все приходит!

9

Re: RTClock

RTC модули рассчитаны для питания от аккумулятора, батарейки ставить нельзя, на нее подается ток зарядки через диод который стоит на плате модуля часов. если напряжение на батарейке превышает 3в , возможна некорректная работа модуля часов.

10

Re: RTClock

напишите название модуля часов

11

Re: RTClock

У меня не модуль часов! Я пытаюсь завести встроенный в STM32F103C8T6 RTS.

12

Re: RTClock

Ведь Ваш скетч на на это и расчитан!

13

Re: RTClock

Для установки текущего времени раскомментируйте строку:

rtclock.setTime(tt);

После заливки скетча, закомментируйте эту строчку и по новой залейте скетч:

// rtclock.setTime(tt);

так делали?

14

Re: RTClock

Да, конечно! Если не раскомментировать, то при перезагрузке устанавливается время полученное при компиляции.

15

Re: RTClock

попробуйте переставить перемычку которое активирует режим программирования

16

Re: RTClock

Обе в нуле стоят.

17

Re: RTClock

ParseBuildTimestamp(mtt);  //  Unix время, отсчет от 00:00:00 1 января 1970
  tt = rtclock.makeTime(mtt) + 25; // +25 сек ко времени, для коррекции времени загрузки скетча
  rtclock.setTime(tt);



//  ParseBuildTimestamp(mtt);  //  Unix время, отсчет от 00:00:00 1 января 1970
//  tt = rtclock.makeTime(mtt) + 25; // +25 сек ко времени, для коррекции времени загрузки скетча
// rtclock.setTime(tt);

если так не получится, то смогу проверить у себя только вечером

18

Re: RTClock

Все по нулям!

19

Re: RTClock

Проверил.
У меня все работает, прошил stm32, подключил батарейку, снова прошил закоментировав // rtclock.setTime(tt);
Переставил программную перемычку

Убрал питание и снова подал

http://forum.rcl-radio.ru/uploads/images/2022/07/2a8426264261c0c37201719b6a9ddbdc.png

Несколько раз убирал питание, ждал пару минут перед подачей питания (выдергивал USB-TTL программатор от USB) ход часов не нарушился.

http://forum.rcl-radio.ru/uploads/images/2022/07/ee361e97af25fb9cb3583a7e162a091c.png

20

Re: RTClock

А у меня не работает!!! К сожалению другого контроллера нет...

21

Re: RTClock

Если происходит сброс времени в мониторе порта все равно должно быть время Unix -  1 января 1970 года, по нулям не должно быть.

22

Re: RTClock

Так и есть.

23

Re: RTClock

Заказал ещё одну плату. Получу - отпишусь.

24

Re: RTClock

Перемычку после прошивки переставляйте не отключая питания.