Вопрос по работе с библиотекой RTClib
- Войдите на сайт для отправки комментариев
Пт, 27/11/2015 - 21:21
При работе с библиотекой RTClib, функция .second или .minute возвращает значения 1,2,3...59
при выводе времени на дисплей во избежании "съезжания" информации вместо 1 нужно выводить 01, вместо 2 нужно 02 и т.д.
Как мне корректо сделать вывод на экран, чтобы минуты и секунды корректно выводились?
Я делал через форматный вывод sprintf:
(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
При работе с библиотекой RTClib, функция .second или .minute возвращает значения 1,2,3...59
при выводе времени на дисплей во избежании "съезжания" информации вместо 1 нужно выводить 01, вместо 2 нужно 02 и т.д.
Как мне корректо сделать вывод на экран, чтобы минуты и секунды корректно выводились?
Например так:
if(minute < 10) Serial.print("0");
Serial.print(minute, DEC);
RZ3AMJ, библиотеки это зло :) Разработчики часов типа ds3231 и аналогичных специально разделили единицы и десятки у секунд, минут и часов для удобства их вывода. И хранят их раздельно в старшей и младшей половине байта. А библиотеки всё это объеденяют :\
Спасибо всем откликнувшимся, сейчас буду пробовать.
Имею 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); }