Вопрос по работе с библиотекой RTClib

RZ3AMJ
Offline
Зарегистрирован: 13.09.2015

При работе с библиотекой RTClib, функция .second или .minute возвращает значения 1,2,3...59

при выводе времени на дисплей во избежании "съезжания" информации вместо 1 нужно выводить 01, вместо 2 нужно 02 и т.д.

Как мне корректо сделать вывод на экран, чтобы минуты и секунды корректно выводились?

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Я делал через форматный вывод sprintf:

#include <stdio.h>
//
char str3[14];
//
sprintf(str3, "%03d %02d %02d %02d", Day, Hour, Minute, Second);
//
lcd8544_putstr(2,24,str3,1);

(Day, Hour, Minute, Second - целочисленные переменные, значение которым было присвоено ранее)

http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/13/sprintf.htm

www.softtime.ru/bookphp/gl3_6.php

 

arduinec
Offline
Зарегистрирован: 01.09.2015

RZ3AMJ пишет:

При работе с библиотекой RTClib, функция .second или .minute возвращает значения 1,2,3...59

при выводе времени на дисплей во избежании "съезжания" информации вместо 1 нужно выводить 01, вместо 2 нужно 02 и т.д.

Как мне корректо сделать вывод на экран, чтобы минуты и секунды корректно выводились?

Например так:

if(minute < 10) Serial.print("0");
Serial.print(minute, DEC);
 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

RZ3AMJ, библиотеки это зло :)  Разработчики часов типа ds3231 и аналогичных специально разделили единицы и десятки у секунд, минут и часов для удобства их вывода. И хранят их раздельно в старшей и младшей половине байта.  А библиотеки всё это  объеденяют :\

RZ3AMJ
Offline
Зарегистрирован: 13.09.2015

Спасибо всем откликнувшимся, сейчас буду пробовать.

Valerich-tex
Offline
Зарегистрирован: 10.08.2019


Имею lcd, ds3231 и 2 кнопки, банальный код в виде>

Почему ардуино не записывает новое значение времени в rtc, при чем дата устанавливается (спецом сентябрь поставл, для проверки, все идет кроме времени) и еще, почему дни недели стали выводиться цифрами, а не буквами то есть сейчас у меня горит 328 постоянно на lcd, хотя раньше, до того как перевел отслеживание времени в отдельную функцию все показывало четко  



#include <Wire.h>
#include <SPI.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

#include <RTClib.h> //adafruit
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
//DateTime now // datetime считывает время с модуля и выводит на команды


#include <GyverButton.h>
GButton butt2(10);
GButton butt1(5);


unsigned long zad;
bool mode = 0; //0-показ времени, 1-настройка времени
boolean blinkFlag, newTimeFlag;
int mins, hrs, weeek, ddd, mmm, yyy;
int znach; //для отслеживаня изменений при нажатии на клавишу, сейчас не видно чтобы часы менялись 

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  rtc.begin();
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  //команда для прошивки времени, не забыть отключить ее на финальной прошивке
  
  /*DateTime now = rtc.now();
  mins = now.minute();
  hrs = now.hour();
  weeek = daysOfTheWeek[now.dayOfTheWeek()];
  ddd = now.day();
  mmm = now.month();
  yyy = now.year();*/
}
void loop() {
  DateTime now = rtc.now(); // datetime считывает время с модуля и выводит на команды
  mins = now.minute();
  hrs = now.hour();
  weeek = daysOfTheWeek[now.dayOfTheWeek()];
  ddd = now.day();
  mmm = now.month();
  yyy = now.year();
  
  butt1.tick();
  butt2.tick();
  
  if (mode == 0) {
   func_time(); //отслеживание времени 
   lcd.setCursor(1, 0);
   lcd.print ("time");
  }  
  
  if (butt2.isHolded()) {
    mode ++;
    if (mode >= 2) mode = 0; 
      }
   
  if(mode==1) {
      lcd.setCursor(1, 0);
      lcd.print ("sett"); //отслеживание переходад в установку времени 
      func_time();    //работает. но как-то с запазданием что ли
      settings();
      lcd.setCursor(2, 2);
      lcd.print (znach);
      DateTime(setTime());
    }

}
void settings() {
  butt1.tick();
  butt2.tick();
  
  if (mode == 1) {
  
    if (!newTimeFlag) newTimeFlag = true;
    if (butt1.isClick() || butt1.isStep()) {
      mins ++;
      znach ++;
      if (mins > 59) {
        mins = 0;
        hrs ++;
        if (hrs> 23) hrs = 0;        
      }
    }
    if (butt2.isClick()/* || butt2.isStep()*/ ) {
      mins --;
      znach --;
      if (mins < 0) {
        mins = 59;
        hrs --;
        if (hrs < 0) hrs = 23;        
      }
    }
      if (millis() - zad > 30000) { //если прошло 30 сек возвращать в мод 0 и установить новое время 
      zad = millis();
      mode = 0;
      newTimeFlag = false;
      rtc.adjust(DateTime(2019, 9, 29, hrs,  mins, 0)); // прописывается только дата????????????? 
    }
  }
}

void func_time() {
 lcd.setCursor(0, 1);
    if (hrs < 10) {
      lcd.print("0");
      lcd.print(hrs);
    }
    else if (hrs >= 10) {
      lcd.print(hrs);
    }
    lcd.print(":");
    if (mins < 10) {
      lcd.print("0");
      lcd.print(mins);
    }
    else if (mins >= 10) {
      lcd.print(mins);
    }
    lcd.setCursor(6, 1);
    lcd.print(weeek); //где буквы? ведь у меня четко заданы дни недели в начале кода

    lcd.setCursor(10, 1);
    if (ddd < 10) {
      lcd.print("0");
      lcd.print( ddd, DEC);
    }
    else if (ddd >= 10) {
      lcd.print( ddd, DEC);
    }
    lcd.print ("/");
    if (mmm < 10) {
      lcd.print("0");
      lcd.print( mmm, DEC);
    }
    else if (mmm >= 10) {
      lcd.print( mmm, DEC);
    }
    lcd.print("/");
    lcd.print(yyy);
  }