Народ с Новым Годом!!! такая проблема собрал часы на (Real Time Clock - DS1307) и Четырёхразрядном семисегментном индикаторе Troyka-модулях от Амперки всю инфу и скетч взял с сайта Амперки что вполне естественно и предсказуемо только исключил из схемы четырех кнопочный Troyka-модуль и Troyka Slot Shield И вот кульминация скетч идущий с библиотекой "TroykaRTC" работает вроде нормально а вот когда подключаешь четырёхразрядный семисегментный индикатор то почему то индикатор часы показывает нормально а минуты показывает как секунды. Подскажите в чем может быть проблема!
Код (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); } } в какой его части?
Хотя скетч и вправду вороди должен без проблем работать а он сразу начал ругаться на отсутствие SPI библиотеки.
Ну а вы как хотели. В описании на четырёхразрядный семисегментный индикатор сказано "С контроллером модуль общается по протоколу SPI"
Если бы я выложил скетч идущий к библиотеке индикатора или взятый со страницы с описанием индикатора то другое дело но тут скетч проекта часов а не отдельной его детали и по идеи собрав схему и залив скетч схема должна заработать как предполагалось автором проекта то есть как говорят из "коробки"
@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(); ............
Без индикатора модуль нормально работает и индикатор без модуля тоже. скетчи использовал которые с библиотеками шли. Может косяк в каких нибудь конструктивных различиях между Iskra Neo и Arduino Uno ведь все примеры используют Iskra Neo а я на Arduino Uno собрал часы.
@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); }
Странно попробовал вывести сначала год потом число и месяц все отработало нормально потом вернул в коде вывод часа и минут все начало работать нормально!!
Код (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 не подскажете в чем проблема ????
По моему Амперка ошиблась - метод 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); поэтому происходит переполнение и неверно вычисляется год
Спасибо за ответ но оказалось дело в библиотеке QuadDisplay2.h Код (C++): void displayScore(int hour, int minute, bool blink = false); заменил в коде Код (C++): qd.displayScore(year, true); на Код (C++): qd.displayInt(year); и все.