Разбить время на часы, минуты, секунды

Тема в разделе "Arduino & Shields", создана пользователем iddqd, 12 фев 2019 в 01:44.

Метки:
  1. iddqd

    iddqd Нуб

    Добрый!
    Господа, кто подскажет, как разделить время, получаемое с часов реального времени 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);
        }
    [​IMG]
     
  2. ratman

    ratman Нерд

    Яркий пример! Как нельзя программировать.
    Если у Амперки базовые примеры такие, то в библиотеку даже смотреть не хочется.

    Но всё-таки посмотри, там должны быть функции выковыривания отдельно часов, отдельно минут и т.д.
    А то, что в LOOP прописано, это ересь. ;)
     
  3. ratman

    ratman Нерд

    ---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---
    И собирай, что тебе надо.
     
  4. b707

    b707 Гуру

    да ладно вам - обычный быдлокод. Зато новичкам понятен.
    Конечно, обновлять отдельно секунды, минуты. часы и дату - каждое в свое время - было бы правильнее - но сколько мороки...
     
    DetSimen нравится это.
  5. parovoZZ

    parovoZZ Гуру

    канеш - надо по-быренькому, пока идея не зачахла.
     
  6. ratman

    ratman Нерд

    Угу, работают с RTC, но секунды проматывают конским делаем. А если такое дети увидят? Это же травма на всю жизнь.
     
  7. iddqd

    iddqd Нуб

    Хм... Видимо, мне лучше использовать библиотеку Groove - RTC DS1307? Этот код из примера выглядит адекватней? Тут хотя бы внутри loop ни delay, ни setTime не видно.

    Код (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(" ");
    }
     
    Последнее редактирование: 12 фев 2019 в 19:16
  8. parovoZZ

    parovoZZ Гуру

    там и без библиотеки все хорошо вытаскивается.