Добрый! Господа, кто подскажет, как разделить время, получаемое с часов реального времени DS1307 на часы, минуты и секунды отдельно? Хочу вместо времени в формате ЧЧ:ММ:СС видеть ЧЧ:ММ разделенные мигающим двоеточием. Если я правильно понял, стандартная библиотека TroykaRTC может выводить время только в формате ЧЧ:ММ:СС, дату ДД.ММ.ГГГГ и название дня недели полностью. Вот стандартный пример с сайта Амперки для работы с часами, чтобы было понятно о чём речь: Код (C++): // библиотека для работы I²C #include <Wire.h> // библиотека для работы с часами реального времени #include "TroykaRTC.h" // размер массива для времени #define LEN_TIME 12 // размер массива для даты #define LEN_DATE 12 // размер массива для дня недели #define LEN_DOW 12 // создаём объект для работы с часами реального времени RTC clock; // массив для хранения текущего времени char time[LEN_TIME]; // массив для хранения текущей даты char date[LEN_DATE]; // массив для хранения текущего дня недели char weekDay[LEN_DOW]; void setup() { // открываем последовательный порт Serial.begin(9600); // инициализация часов clock.begin(); // метод установки времени и даты в модуль вручную // clock.set(10,25,45,27,07,2005,THURSDAY); // метод установки времени и даты автоматически при компиляции clock.set(__TIMESTAMP__); // что бы время менялось при прошивки или сбросе питания // закоментируйте оба метода clock.set(); } void loop() { // запрашиваем данные с часов clock.read(); // сохраняем текущее время, дату и день недели в переменные clock.getTimeStamp(time, date, weekDay); // выводим в serial порт текущее время, дату и день недели Serial.print(time); Serial.print("\t"); Serial.print(date); Serial.print("\t"); Serial.println(weekDay); // ждём одну секунду delay(1000); }
Яркий пример! Как нельзя программировать. Если у Амперки базовые примеры такие, то в библиотеку даже смотреть не хочется. Но всё-таки посмотри, там должны быть функции выковыривания отдельно часов, отдельно минут и т.д. А то, что в LOOP прописано, это ересь.
---8<--- uint8_t getSecond() const { return _second; } uint8_t getMinute() const { return _minute; } uint8_t getHour() const { return _hour; } uint8_t getWeekDay() const { return _weekDay; } uint8_t getDay() const { return _day; } uint8_t getMonth() const { return _month; } uint16_t getYear() const { return _year; } uint32_t getUnixTime(); --->8--- И собирай, что тебе надо.
да ладно вам - обычный быдлокод. Зато новичкам понятен. Конечно, обновлять отдельно секунды, минуты. часы и дату - каждое в свое время - было бы правильнее - но сколько мороки...
Угу, работают с RTC, но секунды проматывают конским делаем. А если такое дети увидят? Это же травма на всю жизнь.
Хм... Видимо, мне лучше использовать библиотеку Groove - RTC DS1307? Этот код из примера выглядит адекватней? Тут хотя бы внутри loop ни delay, ни setTime не видно. Спойлер: Пример Groove Код (C++): /****************************************************************************/ // Function: Set time and get the time from RTC chip(DS1307) and display // it on the serial monitor. // Hardware: Grove - RTC // Arduino IDE: Arduino-1.0 // Author: FrankieChu // Date: Jan 19,2013 // Version: v1.0 // by www.seeedstudio.com // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // /****************************************************************************/ #include <Wire.h> #include "DS1307.h" DS1307 clock;//define a object of DS1307 class void setup() { Serial.begin(9600); clock.begin(); clock.fillByYMD(2013,1,19);//Jan 19,2013 clock.fillByHMS(15,28,30);//15:28 30" clock.fillDayOfWeek(SAT);//Saturday clock.setTime();//write time to the RTC chip } void loop() { printTime(); } /*Function: Display time on the serial monitor*/ void printTime() { clock.getTime(); Serial.print(clock.hour, DEC); Serial.print(":"); Serial.print(clock.minute, DEC); Serial.print(":"); Serial.print(clock.second, DEC); Serial.print(" "); Serial.print(clock.month, DEC); Serial.print("/"); Serial.print(clock.dayOfMonth, DEC); Serial.print("/"); Serial.print(clock.year+2000, DEC); Serial.print(" "); Serial.print(clock.dayOfMonth); Serial.print("*"); switch (clock.dayOfWeek)// Friendly printout the weekday { case MON: Serial.print("MON"); break; case TUE: Serial.print("TUE"); break; case WED: Serial.print("WED"); break; case THU: Serial.print("THU"); break; case FRI: Serial.print("FRI"); break; case SAT: Serial.print("SAT"); break; case SUN: Serial.print("SUN"); break; } Serial.println(" "); }