Почему у меня 7 сегмент не обновляется каждую секунду как в программе?

Я использовал библиотеку sevseg.h для записи чисел в мой четырехзначный семисегментный сегмент. Дисплей должен каждую секунду обновлять текущее время с момента запуска программы. Это мой код до сих пор:

#include <SevSeg.h>

SevSeg sevseg;

void setup() {
    byte numDigits = 4;
    byte digitPins[] = {5, 4, 3, 2};
    byte segmentPins[] = {13, 12, 11, 10, 9, 8, 7, 6};
    sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
    sevseg.setBrightness(50);
    sevseg.setNumber(0000, -1);
}

void loop() {
    unsigned long timer = millis();
    for (int i = 0; i < 500; i++) {
        sevseg.setNumber(timer/1000, -1);
        sevseg.refreshDisplay();
        delay(2);
    }
}

Поскольку задержка равна 2, цикл for повторяется 500 раз, что дает 1000 мс или 1 секунду. Текущая секунда записывается на дисплей. По какой-то причине дисплей обновляется каждые 5 или 6 секунд. Почему это происходит? Как это можно исправить, чтобы мой дисплей превратился в своего рода секундомер?

, 👍1


2 ответа


-1

На странице SevSeg.h Arduino написано:

Ваша программа должна многократно запускать функцию refreshDisplay(), чтобы показать число.

Я думаю, проблема в этом. Вы звоните только один раз, а затем ваш номер меняется.

Кроме того, вы говорите, что он должен обновляться через одну секунду, но я думаю, что в вашем коде он обновляется каждые 2 миллисекунды (ВАУ).

Я предлагаю вам добавить delay() на одну секунду, а затем несколько раз вызвать sevseg.refreshDisplay(); в for петля. Вам также необходимо изменить способ измерения числа нет. секунд истекло.

т.е. попробуйте что-то вроде этого:

#include <SevSeg.h>
SevSeg sevseg;
void setup() {
  byte numDigits = 4;
  byte digitPins[] = {5, 4, 3, 2};
  byte segmentPins[] = {13, 12, 11, 10, 9, 8, 7, 6};
  sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
  sevseg.setBrightness(50);
  sevseg.setNumber(0000, -1);
}
unsigned long timerGlobal = millis();
void loop() {
  delay(1000);
  sevseg.setNumber( (timerGlobal - millis())/1000, -1)
  for (int i = 0; i < 50; i++) {
    sevseg.refreshDisplay();
  }
}
,

Если я правильно думаю, значение таймера изменяется только тогда, когда цикл void запускается снова, поэтому, даже если число устанавливается несколько раз, оно остается одним и тем же. RefreshDisplay также вызывается 500 раз в секунду, так как таймер остается неизменным в течение секунды. Добавление больших задержек, таких как 1000, не работает, поскольку прерывает постоянное обновление дисплея. После запуска вашего кода я получил - - - - отображение на дисплее. После изменения некоторого кода экран остается выключенным в течение 1000 мс и остается включенным только в течение нескольких мс., @shurup

ну, я могу ошибаться, так как я не тестировал свой код на оборудовании. Но, я думаю, я бы работал. Можете ли вы попробовать изменить это 50 на какое-то большое число в цикле for. Это может помочь. В любом случае. Извини., @ARK

Использование задержки - ужасное предложение. Из [документации SevSeg](https://github.com/DeanIsMe/SevSeg#displaying): «_любые задержки, вносимые другими функциями, будут производить нежелательные эффекты на дисплее_», что вполне очевидно, если подумать., @Edgar Bonet


2

Этот код устранил проблему:

  #include <SevSeg.h>
  SevSeg sevseg;

  void setup() {
    byte numDigits = 4;
    byte digitPins[] = {5, 4, 3, 2};
    byte segmentPins[] = {13, 12, 11, 10, 9, 8, 7, 6};
    sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
    sevseg.setBrightness(50);
    sevseg.setNumber(0000, -1);
  }

  void loop() {
    unsigned long timerGlobal = millis();
    sevseg.setNumber(timerGlobal/1000, -1);
    sevseg.refreshDisplay();
  }

При этом задержки не нужны. миллис делится на 1000, и на дисплее отображается целое число секунд. Оказалось намного проще, чем я думал раньше.

,