Помогите с DS1302!

Тема в разделе "Arduino & Shields", создана пользователем HelSay, 7 ноя 2017.

  1. HelSay

    HelSay Нуб

    Я новичок. Хочу сделать часы на Arduino. Тут же столкнулся с проблемой. Взял скетч из примера, запустил и в мониторе порта вижу такую хрень: идёт Правильная Дата, Какая-то Непонятная дата, Правильная Дата, Какая-то Непонятная дата и тд.
    Подскажите как решить эту проблему!!!
    Вот код:
    Код (C++):
    // Example sketch for interfacing with the DS1302 timekeeping chip.
    //
    // Copyright (c) 2009, Matt Sparks
    // All rights reserved.
    //
    // http://quadpoint.org/projects/arduino-ds1302
    #include <stdio.h>
    #include <DS1302.h>

    namespace {

    // Set the appropriate digital I/O pin connections. These are the pin
    // assignments for the Arduino as well for as the DS1302 chip. See the DS1302
    // datasheet:
    //
    //   http://datasheets.maximintegrated.com/en/ds/DS1302.pdf
    const int kCePin   = 7;  // Chip Enable
    const int kIoPin   = 6;  // Input/Output
    const int kSclkPin = 5;  // Serial Clock

    // Create a DS1302 object.
    DS1302 rtc(kCePin, kIoPin, kSclkPin);

    String dayAsString(const Time::Day day) {
      switch (day) {
        case Time::kSunday: return "Sunday";
        case Time::kMonday: return "Monday";
        case Time::kTuesday: return "Tuesday";
        case Time::kWednesday: return "Wednesday";
        case Time::kThursday: return "Thursday";
        case Time::kFriday: return "Friday";
        case Time::kSaturday: return "Saturday";
      }
      return "(unknown day)";
    }

    void printTime() {
      // Get the current time and date from the chip.
      Time t = rtc.time();

      // Name the day of the week.
      const String day = dayAsString(t.day);

      // Format the time and date and insert into the temporary buffer.
      char buf[50];
      snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d",
               day.c_str(),
               t.yr, t.mon, t.date,
               t.hr, t.min, t.sec);

      // Print the formatted string to serial so we can see the time.
      Serial.println(buf);
    }

    }  // namespace

    void setup() {
      Serial.begin(9600);

      // Initialize a new chip by turning off write protection and clearing the
      // clock halt flag. These methods needn't always be called. See the DS1302
      // datasheet for details.
      rtc.writeProtect(false);
      rtc.halt(false);

      // Make a new time object to set the date and time.
      // Sunday, September 22, 2013 at 01:38:50.
      Time t(2017, 11, 7, 15, 45, 0, Time::kTuesday);

      // Set the time and date on the chip.
      rtc.time(t);
    }

    // Loop and print the time every second.
    void loop() {
      printTime();
      delay(1000);
    }
    Вот что в мониторе порта:
     

    Вложения:

  2. b707

    b707 Гуру

    а если задержку поставить не 1 сек, а. скажем, пять?
     
  3. HelSay

    HelSay Нуб

    Понял что вы хотите сделать, это работает, но мне нужно обновлять значение каждую секунду?
     
  4. DIYMan

    DIYMan Guest

    Вот тут квалификатор const - совершенно лишний.
     
  5. b707

    b707 Гуру

    Это, конечно, "костыль" - но раз работает, можно пользоваться. На экране обновляйте каждую секунду, а с RTC запрашивайте пореже - раз в пять минут или раз в час...
     
  6. HelSay

    HelSay Нуб

    Не понял
     
  7. HelSay

    HelSay Нуб

    Вот это не понял
     
  8. b707

    b707 Гуру

    В ардуине есть свои внутренние часы - функция миллис(). На коротких интервалах, до нескольких часов, их точность обычно вполне нормальная. Экран можно обновлять по миллис, а точность хода сверять с RTC раз в час.
     
  9. HelSay

    HelSay Нуб

    Понял, спасибо
     
  10. DetSimen

    DetSimen Guest

    Я специально для себя писал класс TSoftClock, чтоб часы лишний раз не дергать. Синхронизирую каждый час, кроме 0:00. Прекрасно работаеть.

    Код (C++):
    class TSoftClock
    {
    protected:
        byte fhour;
        byte fminutes;
        byte fseconds;
        char ftimestr[9];
    public:
        TSoftClock();                                                // пустой конструктор, устанавливает 0 часов 0 минут 0 секунд
        TSoftClock(byte ahour, byte aminutes, byte aseconds);        // конструктор с инициализацией начального времени
        TSoftClock(const char *atimestr);                            // конструктор. Принимает системный макрос __TIME__ - время компиляции

        void SetTime(byte ahour, byte aminutes, byte aseconds);        // первоначальная установка часов
        void SetTime(const char *timestr);                            // вызывать подставляя макрос __TIME__  - время компиляции

        char *GetTimeString(void);                                    // время в формате 00:00
        char *GetFullTimeString(void);                                // время в формате 00:00:00
     
        TSoftClock operator ++(int);                                // здесь секунды тикают, просто Clock++ и всё

        byte getHours(void) { return fhour; };                        // отдельно отдать часы
        byte getMinutes(void) { return fminutes; };                    // минуты
        byte getSeconds(void) { return fseconds; };                    // секунды

        void Syncro(DS3231 HardClock);                                // синхронизировать время с аппаратными часами.
    };

    using PSoftClock = TSoftClock *;

     
    Код тоже могу прислать, если надо
     
    Последнее редактирование модератором: 8 ноя 2017
    arkadyf нравится это.