Цифровые часы Arduino

Тема в разделе "Arduino & Shields", создана пользователем DimkaBel, 1 янв 2019.

  1. DimkaBel

    DimkaBel Нерд

    Народ с Новым Годом!!! такая проблема собрал часы на (Real Time Clock - DS1307) и Четырёхразрядном семисегментном индикаторе Troyka-модулях от Амперки всю инфу и скетч взял с сайта Амперки что вполне естественно и предсказуемо только исключил из схемы четырех кнопочный Troyka-модуль и Troyka Slot Shield
    И вот кульминация скетч идущий с библиотекой "TroykaRTC" работает вроде нормально а вот когда
    подключаешь четырёхразрядный семисегментный индикатор то почему то индикатор часы показывает нормально а минуты показывает как секунды.

    Подскажите в чем может быть проблема!
     
  2. ИгорьК

    ИгорьК Гуру

    Проблема в скетче.
     
  3. DimkaBel

    DimkaBel Нерд

    Код (C++):
    // библиотека для работы I²C
    #include <Wire.h>
    // библиотека для работы с часами реального времени
    #include "TroykaRTC.h"
    // Подключаем библиотеку для работы с дисплеем
    #include <QuadDisplay2.h>
    // создаём объект класса QuadDisplay и передаём номер пина CS
    QuadDisplay qd(10);
    // пины к которым подключены кнопки
    #define BUTTON_PIN_1 0
    #define BUTTON_PIN_2 1
    #define BUTTON_PIN_3 4
    #define BUTTON_PIN_4 5
    // создаём объект для работы с часами реального времени
    RTC clock;
    void setup()
    {
      // инициализация дисплея
      qd.begin();
      // инициализация часов
      clock.begin();
      // метод установки времени и даты в модуль вручную
      // clock.set(10,25,45,27,07,2005,THURSDAY);
      // метод установки времени и даты автоматически при компиляции
      clock.set(__TIMESTAMP__);
    }
    void loop()
    {
      // запрашиваем данные с часов
      clock.read();
      // считываем показания часов и минут в переменные
      int hour = clock.getHour();
      int minute = clock.getMinute();
      // выводим время на дисплей
      qd.displayScore(hour, minute, true);
      // считываем состояние пина
      int buttonState1 = digitalRead(BUTTON_PIN_1);
      int buttonState2 = digitalRead(BUTTON_PIN_2);
      int buttonState3 = digitalRead(BUTTON_PIN_3);
      int buttonState4 = digitalRead(BUTTON_PIN_4);
      // в зависимости от состояние кнопок
      // увеличиваем / уменьшаем часы и минуты
      if (!buttonState1) {
        clock.setHour(hour + 1);
        delay(300);
      } else if (!buttonState2) {
        clock.setHour(hour - 1);
        delay(300);
      } else if (!buttonState3) {
        clock.setMinute(minute - 1);
        delay(300);
      } else if (!buttonState4) {
        clock.setMinute(minute + 1);
        delay(300);
      }
    }
    в какой его части?
     
  4. DimkaBel

    DimkaBel Нерд

    Хотя скетч и вправду вороди должен без проблем работать а он сразу начал ругаться на отсутствие SPI библиотеки.
     
  5. a1000

    a1000 Гуру

    Ну а вы как хотели. В описании на четырёхразрядный семисегментный индикатор сказано
    "С контроллером модуль общается по протоколу SPI"
     
  6. DimkaBel

    DimkaBel Нерд

    Если бы я выложил скетч идущий к библиотеке индикатора или взятый со страницы с описанием индикатора то другое дело но тут скетч проекта часов а не отдельной его детали и по идеи собрав схему и залив скетч схема должна заработать как предполагалось автором проекта то есть как говорят из "коробки"
     
  7. ZAZ-965

    ZAZ-965 Гуру

    @DimkaBel, в четырёхкнопочной клавиатуре (Troyka-модуль) были подтягивающие резисторы. Вы на макетке их устанавливали? Если нет, включите встроенную подтяжку.
    Код (C++):
    void setup()
    {
     pinMode(BUTTON_PIN_1, INPUT_PULLUP);
     pinMode(BUTTON_PIN_2, INPUT_PULLUP);
     pinMode(BUTTON_PIN_3, INPUT_PULLUP);
     pinMode(BUTTON_PIN_4, INPUT_PULLUP);
    // инициализация дисплея
      qd.begin();
    ............
     
    Пушной звер нравится это.
  8. DimkaBel

    DimkaBel Нерд

    Резисторы разве не для того чтобы избавиться от дребезга кнопок??
     
  9. DetSimen

    DetSimen Guest

  10. DimkaBel

    DimkaBel Нерд

    в любом случае и с кнопками и без кнопок минуты бегут со скоростью секунд
     
  11. а часы тоже бегут?

    проверь модуль часов на других примерах.
     
  12. DimkaBel

    DimkaBel Нерд

    Без индикатора модуль нормально работает и индикатор без модуля тоже.
    скетчи использовал которые с библиотеками шли.

    Может косяк в каких нибудь конструктивных различиях между Iskra Neo и Arduino Uno ведь все примеры используют Iskra Neo а я на Arduino Uno собрал часы.
     
    Последнее редактирование: 1 янв 2019
  13. DimkaBel

    DimkaBel Нерд

    Че не кто не поможет проблему решить ???
     
  14. ZAZ-965

    ZAZ-965 Гуру

    @DimkaBel, если закомментировать этот код, часы бегут?
    Код (C++):
      if (!buttonState1) {
        clock.setHour(hour + 1);
        delay(300);
      } else if (!buttonState2) {
        clock.setHour(hour - 1);
        delay(300);
      } else if (!buttonState3) {
        clock.setMinute(minute - 1);
        delay(300);
      } else if (!buttonState4) {
        clock.setMinute(minute + 1);
        delay(300);
      }
     
  15. DimkaBel

    DimkaBel Нерд

    Да я вообще удалял из кода все связанное с кнопками.
     
  16. DimkaBel

    DimkaBel Нерд

    Странно попробовал вывести сначала год потом число и месяц все отработало нормально потом вернул в коде вывод часа и минут все начало работать нормально!!
     
  17. DimkaBel

    DimkaBel Нерд

    Код (C++):
    // библиотека для работы I²C
    #include <Wire.h>
    // библиотека для работы с часами реального времени
    #include "TroykaRTC.h"
    // Подключаем библиотеку для работы с дисплеем
    #include <QuadDisplay2.h>
    // создаём объект класса QuadDisplay и передаём номер пина CS
    QuadDisplay qd(10);
    RTC clock;
    void setup()
    {
      // инициализация дисплея
      qd.begin();
      // инициализация часов
      clock.begin();
      // метод установки времени и даты в модуль вручную
      clock.set(10,25,45,27,07,2005,THURSDAY);
      // метод установки времени и даты автоматически при компиляции
    // clock.set(__TIMESTAMP__);
    }
    void loop()
    {
      // запрашиваем данные с часов
      clock.read();
      // считываем показания часов и минут в переменные
      int year= clock.getYear();
     // выводим время на дисплей
      qd.displayScore(year, true);
    }
    почему то вместо 2005 года выводит 1901 не подскажете в чем проблема ????
     
  18. ZAZ-965

    ZAZ-965 Гуру

    По моему Амперка ошиблась - метод set принимает параметры
    Код (C++):
    void set(uint8_t hour, uint8_t minute, uint8_t second, uint16_t day, uint8_t month, uint8_t year, uint8_t weekDay);
    а должно быть
    Код (C++):
    void set(uint8_t hour, uint8_t minute, uint8_t second,  uint8_t day, uint8_t month, uint16_t year, uint8_t weekDay);
    поэтому происходит переполнение и неверно вычисляется год
     
    DetSimen нравится это.
  19. DimkaBel

    DimkaBel Нерд

    Спасибо за ответ но оказалось дело в библиотеке QuadDisplay2.h
    Код (C++):
    void displayScore(int hour, int minute, bool blink = false);
    заменил в коде
    Код (C++):
    qd.displayScore(year, true);
    на
    Код (C++):
    qd.displayInt(year);
    и все.
     
  20. DimkaBel

    DimkaBel Нерд

    Оказывается иногда полезно и в библиотеке покопаться!!!