Часы Nixie Clock не отсчитывают время

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

  1. ussora

    ussora Нуб

    Здравствуйте, я собрал часы Nixie Clock по гайду на вики амперки, все исходники и т.д брал опять же с вики, и естественно программный код взял оттуда же. Но есть одна большая проблема, часы не отсчитывают время, я могу настраивать часы и минуты, могу настраивать подсветку, но они не идут, как думаете в чем может быть проблема? Помогите пожалуйста, уже всю голову сломал...
    3UlJ7M3pwkY.jpg nSy8FwtzurY.jpg
    Код (C++):
    // библиотека для работы с адресными светодиодами
    #include <Adafruit_NeoPixel.h>
    // библиотека для работы I²C
    #include <Wire.h>
    // библиотека для работы с часами реального времени
    #include "TroykaRTC.h"
    // библиотека для работы с кнопками
    #include "TroykaButton.h"

    // инициализируем подключенную кнопку
    TroykaButton button(10);

    // номер пина, к которому подключена RGB-матрица
    #define MATRIX_PIN 11

    // количество светодиодов в матрице
    #define LED_COUNT 40

    // инициализация цепочки светодиодов подсветки цифр
    Adafruit_NeoPixel matrix = Adafruit_NeoPixel(LED_COUNT, MATRIX_PIN, NEO_GRB + NEO_KHZ800);

    // инициализация светодиода разграничителя
    Adafruit_NeoPixel dot = Adafruit_NeoPixel(1, 12, NEO_GRB + NEO_KHZ800);

    // размер массива для времени
    #define LEN_TIME 12
    // размер массива для даты
    #define LEN_DATE 12
    // размер массива для дня недели
    #define LEN_DOW 12

    // создаём объект для работы с часами реального времени
    RTC clock;

    // переменные для мигания
    int ledState = 0;
    unsigned long previousMillis = 0;
    unsigned long currentMillis ;

    // массив для хранения текущего времени
    char time[LEN_TIME];
    // массив для хранения текущей даты
    char date[LEN_DATE];
    // массив для хранения текущего дня недели
    char weekDay[LEN_DOW];

    int hour;
    int minute;

    int one;
    int two;
    int three;
    int four;

    int displaysettings=0;

    int red=150;
    int green=200;
    int blue= 50;


    void setup()
    {
    // инициализация
    button.begin();
    matrix.begin();
    dot.begin();
    clock.begin();

    // метод установки времени и даты в модуль вручную
    // clock.set(hour,minute,0,27,07,2005,THURSDAY);
    // метод установки времени и даты автоматически при компиляции
    clock.set(__TIMESTAMP__);
    // что бы время не менялось при прошивки или сбросе питания
    // закоментируйте оба метода clock.set();

    pinMode(10, INPUT_PULLUP);
    }

    void loop()
    {
    // считываем состояние кнопки
    button.read();
    // запрашиваем данные с часов
    clock.read();



    // считаем нажатия чтоб переходить из режима в режим
    if (button.justPressed()){
    displaysettings = displaysettings + 1;
    }

    if(displaysettings==0){
    // сохраняем текущее время
    hour = clock.getHour();
    minute = clock.getMinute();
    }

    if(displaysettings == 1){
    // присваиваем значение считываемое с потенциометра
    hour = map (analogRead(A0),2, 1020, 0, 23);
    clock.set(hour,minute,0,27,07,2005,THURSDAY);
    }

    if(displaysettings == 2){
    // присваиваем значение считываемое с потенциометра
    minute = map (analogRead(A0), 2, 1018, 0, 59);
    clock.set(hour,minute,0,27,07,2005,THURSDAY);
    }

    if(displaysettings == 3){
    // присваиваем значение считываемое с потенциометра
    red = map (analogRead(A0),0, 1023, 0, 255);
    }

    if(displaysettings == 4){
    // присваиваем значение считываемое с потенциометра
    green = map (analogRead(A0),0, 1023, 0, 255);
    }

    if(displaysettings == 5){
    // присваиваем значение считываемое с потенциометра
    blue = map (analogRead(A0),0, 1023, 0, 255);
    }

    if(displaysettings == 6){
    displaysettings = 0;
    }

    // делим минуты и часы на разряды
    one = hour / 10;
    two = hour % 10;
    three = minute / 10;
    four = minute % 10;

    matrix.clear();

    // зажигаем нужные светодиоды
    matrix.setPixelColor(four, red, green, blue);
    matrix.setPixelColor(three + 10, red, green, blue);
    matrix.setPixelColor(two + 20, red, green, blue);
    matrix.setPixelColor(one + 30, red, green, blue);
    matrix.show();

    // ждём одну секунду
    delay(10);

    // мигание разделителя
    blinking();
    }

    void blinking(){
    if (millis() - previousMillis >= 1000) {
    previousMillis = millis();
    if (ledState == 0) {
    ledState = 1;
    dot.setPixelColor(0, red, green, blue);
    } else {
    ledState = 0;
    dot.setPixelColor(0, 0, 0, 0);
    }
    dot.show();
    }
    }
     
    Последнее редактирование: 1 июл 2019
  2. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

    Приведите тему в порядок и правильно оформите
     
  3. ussora

    ussora Нуб

    Извините, забыл правила прочитать, так теперь же правильно?
     
  4. Asper Daffy

    Asper Daffy Иксперд

    – Какие странные у вас часы, – сказала Алиса, с большим интересом наблюдавшая за манипуляциями Зайца. – Показывают число, а который час – не показывают!
    – А с какой стати? – буркнул Шляпник. – Разве часы обязаны всё показывать?
    (Льюис Кэрролл)
     
    BAR__MEN, DetSimen и parovoZZ нравится это.
  5. Daniil

    Daniil Гуру

    Чтобы вам помочь нужно иметь часы на руках.
    Допускаю, что амперка могла выложить неработающий проект, но вероятность этого мала. Значит, у вас что-то не работает (брак модуля), либо вы где-то ошиблись при сборке.
    Отлаживать удаленно сложно. Пробовали все запускать до сборки?
     
  6. ussora

    ussora Нуб

    Собрано все вроде правильно, просто потому что сам процесс достаточно легкий, все модули после покупки были проверены, кроме часов реального времени, возможно дело в них, просто я не знаю как их можно проверить.
     
  7. Daniil

    Daniil Гуру

    На этот модуль есть примеры, можно ими побаловаться.
     
  8. b707

    b707 Гуру

    на некоторых RTC модулях, говорят. есть контакт, который надо замкнуть, чтобы часы шли (отсчитывали время).
     
  9. ussora

    ussora Нуб

    Спасибо за примеры, обязательно попробую
     
  10. ussora

    ussora Нуб

    Было бы интересно узнать, какие именно контакты надо замкнуть,
     
  11. Asper Daffy

    Asper Daffy Иксперд

    Что у тебя за микросхема часов? DSxxx? Какая?
     
  12. ussora

    ussora Нуб

    DS1307
     
  13. DetSimen

    DetSimen Спамовредитель Модератор

    http://cxem.net/mc/mc168.php

    Цытато оттудова:
    Кстати, следует учесть, что при первом запуске DS1307 (например, при подключении батареи резервного питания) микросхема будет возвращать в секундах значение 80, это означает, что часы остановлены. Для их запуска запишите в секунды значение 1. Если DS1307 при чтении любых данных возвращает значение 255 или 168 это означает что, микросхема неправильно подключена, либо отсутствует батарея резервного питания.
     
    Asper Daffy нравится это.
  14. ussora

    ussora Нуб

    Код (C++):
    // библиотека для работы с адресными светодиодами
    #include <Adafruit_NeoPixel.h>
    // библиотека для работы I²C
    #include <Wire.h>
    // библиотека для работы с часами реального времени
    #include "TroykaRTC.h"
    // библиотека для работы с кнопками
    #include "TroykaButton.h"
    // инициализируем подключенную кнопку
    TroykaButton button(10);
    // номер пина, к которому подключена RGB-матрица
    #define MATRIX_PIN    11
    // количество светодиодов в матрице
    #define LED_COUNT 40
    // инициализация цепочки светодиодов подсветки цифр
    Adafruit_NeoPixel matrix = Adafruit_NeoPixel(LED_COUNT, MATRIX_PIN, NEO_GRB + NEO_KHZ800);
    // инициализация светодиода разграничителя
    Adafruit_NeoPixel dot = Adafruit_NeoPixel(1, 12, NEO_GRB + NEO_KHZ800);
    // размер массива для времени
    #define LEN_TIME 12
    // размер массива для даты
    #define LEN_DATE 12
    // размер массива для дня недели
    #define LEN_DOW 12
    // создаём объект для работы с часами реального времени
    RTC clock;
    // переменные для мигания
    int ledState = 0;
    unsigned long previousMillis = 0;
    unsigned long currentMillis ;
    // массив для хранения текущего времени
    char time[LEN_TIME];
    // массив для хранения текущей даты
    char date[LEN_DATE];
    // массив для хранения текущего дня недели
    char weekDay[LEN_DOW];
    int hour;
    int minute;
    int one;
    int two;
    int three;
    int four;
    int displaysettings=0;
    int red=150;
    int green=200;
    int blue= 50;
    void setup()
    {
    // инициализация
      button.begin();
      matrix.begin();
      dot.begin();
      clock.begin();
      // метод установки времени и даты в модуль вручную
      // clock.set(hour,minute,0,27,07,2005,THURSDAY);  
      // метод установки времени и даты автоматически при компиляции
      clock.set(__TIMESTAMP__);
      // что бы время не менялось при прошивки или сбросе питания
      // закоментируйте оба метода clock.set();
      pinMode(10, INPUT_PULLUP);
    }
    void loop()
    {
      // считываем состояние кнопки
      button.read();
      // запрашиваем данные с часов
      clock.read();
      // считаем нажатия чтоб переходить из режима в режим
      if (button.justPressed()){
        displaysettings = displaysettings + 1;
      }
      if(displaysettings==0){
        // сохраняем текущее время
        hour = clock.getHour();
        minute = clock.getMinute();
      }
      if(displaysettings == 1){
        // присваиваем значение считываемое с потенциометра
        hour = map (analogRead(A0),2, 1020, 0, 23);
        clock.set(hour,minute,0,27,07,2005,THURSDAY);
      }
      if(displaysettings == 2){
        // присваиваем значение считываемое с потенциометра
        minute = map (analogRead(A0), 2, 1018, 0, 59);
        clock.set(hour,minute,0,27,07,2005,THURSDAY);
      }
      if(displaysettings == 3){
        // присваиваем значение считываемое с потенциометра
        red = map (analogRead(A0),0, 1023, 0, 255);
      }
      if(displaysettings == 4){
        // присваиваем значение считываемое с потенциометра
        green = map (analogRead(A0),0, 1023, 0, 255);
      }
      if(displaysettings == 5){
        // присваиваем значение считываемое с потенциометра
        blue = map (analogRead(A0),0, 1023, 0, 255);
      }
      if(displaysettings == 6){
        displaysettings = 0;
      }
      // делим минуты и часы на разряды
      one = hour / 10;
      two = hour % 10;
      three = minute / 10;
      four = minute % 10;
      matrix.clear();
      // зажигаем нужные светодиоды
      matrix.setPixelColor(four, red, green, blue);
      matrix.setPixelColor(three + 10,  red, green, blue);
      matrix.setPixelColor(two + 20,  red, green, blue);
      matrix.setPixelColor(one + 30,  red, green, blue);
      matrix.show();
      // ждём одну секунду
      delay(10);
      // мигание разделителя
      blinking();
    }
    void blinking(){
      if (millis() - previousMillis >= 1000) {
        previousMillis = millis();
        if (ledState == 0) {
          ledState = 1;
          dot.setPixelColor(0, red, green, blue);
        } else {
          ledState = 0;
          dot.setPixelColor(0, 0, 0, 0);
          }
         dot.show();
        }
    }
    Могли бы вы подсказать пожалуйста, как это сделать в коде, просто я больше по железячкам разбираюсь, а в C++ не очень
     
  15. DetSimen

    DetSimen Спамовредитель Модератор

    а в русских буквах понимаешь, которые тут написаны?

    // метод установки времени и даты в модуль вручную
    // clock.set(hour,minute,0,27,07,2005,THURSDAY);
    // метод установки времени и даты автоматически при компиляции
    clock.set(__TIMESTAMP__);
    // что бы время не менялось при прошивки или сбросе питания
    // закоментируйте оба метода clock.set();
     
    Airbus нравится это.
  16. ussora

    ussora Нуб

    В этом то и проблема, что я не понимаю, что означают эти комментарии
     
  17. DetSimen

    DetSimen Спамовредитель Модератор

    Тогда, прежде чем взяться за такой проект, надо изучить матчасть. Я, к щастью, не преподаватель.
     
    Asper Daffy нравится это.
  18. b707

    b707 Гуру

    блин, нафига же вы такие тогда лезете в программирование?

    В отрывке, процитированном Котом -вторую строчку раскомментируй и запиши так:
    clock.set(10,30,1,03,07,2019,WEDNESDAY);
    четвертую закомментируй
     
  19. Airbus

    Airbus Радиохулиган Модератор

    Лучше в авте.
    clock.set();