GyverSegment. Обсуждение библиотеки

_Vladimir

✩✩✩✩✩✩✩
11 Июл 2024
8
0
Доброго всем времени суток и обстановки!
Пытаюсь использовать библиотеку GyverSegment для своего дисплея. Конкретно класс Disp595Static. Отличие в том, что между сдвиговым и дисплеем у меня uln2803, дисплейчики на 12 вольтах. По факту, как и ожидается, получаю негативное изображение. попытался инвертировать DS, есть лишний элемент 74hc00, первая цифра норм выводится, вторая криво. Подскажите, кто как думает - правильный способ - программно фиксить, или копать в сторону железа?
Вот , к примеру, как выводится 5.5

0-02-05-f14a9f3ea34d8527a9e6af754891bf6603602bd7937bdae4353bef94f8e685d5_40783b48648fdce2.jpg
 

_Vladimir

✩✩✩✩✩✩✩
11 Июл 2024
8
0
да, дело в железе: интерфейс опторазвязанный, плюс длинная линия.
почти пофиксил установкой 0,47 мкф на линии интерфейса и заменил 74hc00 на 74hc132
иногда артефакты все равно проскакивают
Вопрос - DISPxxx_CLC_DELAY это длительность синхроимпульсов? до скольки ее можно увеличивать? просто увеличивая намного, снова появляются кракозябры.
а как бы в интерфейсе увеличить чуток задержку между ST_CP(т.е. между первой и второй цифрой ) может дело в этом?
 

bort707

★★★★★★✩
21 Сен 2020
3,243
945
По факту, как и ожидается, получаю негативное изображение. .... Подскажите, кто как думает - правильный способ - программно фиксить, или копать в сторону железа?
Конечно программно. Это элементарно решается в коде добавлением одной строчки.
Достаточно побитно инвертировать байты, отправляемые на дисплей функцией getCharCode(
 

Shar3

✩✩✩✩✩✩✩
27 Сен 2020
2
0
Всем добра!
Имею индикатор TM1637 с двоеточием.
Используя библиотеку Gyversegment, выбрал Disp1637Colon disp(DIO_PIN, CLK_PIN);
и пытаюсь включить двоеточие:
void colon(bool show);
Требуемого результата нет и с disp.update() и без.
Что я делаю не так?
P.S. С библиотекой TM1637.h все работает.
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
657
198
Что я делаю не так?
Не показываете полный короткий пример, который демонстрирует вашу проблему.

colon(bool show) должен сразу включать или выключать двоеточие.
Т.е. код ниже будет мигать двоеточием (для Disp1637Colon )
C++:
void loop() {
  disp.colon(false);
  delay(1000);
  disp.colon(true);
  delay(1000);
}
Но это не настройка, а разовое вкл или выкл точек. И после следующего print() может потребоваться снова вызывать colon(bool show)
Ошибка это, или так и было задумано - не известно. Т.к. в документации не написано.
 
Изменено:

_Vladimir

✩✩✩✩✩✩✩
11 Июл 2024
8
0
Достаточно побитно инвертировать байты, отправляемые на дисплей функцией getCharCode(
Ну, я так глубоко не полез, а убрал инверсию в методе update
Может это не совсем правильно...
Вообще , хотелось бы заиметь в этой библиотеке флаг "инвертировать", наверняка не у одного меня такая задача появилась.

ну, просто второй вариант железа сделал, а в нем уже нет возможности аппаратно инвертировать.
Так и последовал Вашему совету, но не до конца.
Кстати, а как попросить автора добавить все же флаг инверсии?
 

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
18
1
При использовании GPS-модуля Neo-6m + 6 led-индикаторов напрямую подключённых к плате Ардуино Нано (с динамической индикацией) выскакивает следующий артефакт: каждую секунду, когда Neo-6m отправляет пакет данных на индикаторе проскакивает рябь. Используется аппаратный UART. Проблема в прерывании UART, который забирает на себя время или...?
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
657
198
@Esteriman,
Не понятно, что такое "рябь" в случае сегментов. Если UART точно аппаратный, то он не должен заметно влиять на алгоритм. Возможно у вас при приеме есть куски кода выполняющиеся длительное время, и tick вызывается не так часто как требуется.
 
  • Лойс +1
Реакции: Esteriman

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
18
1
@Bruzzer, вот я и думаю, что обработка посылки от джи-пи-эс занимает много времени.
@bort707, код обычный, выкладываю.
На экране не очень хорошо видно, но можно заметить https://youtube.com/shorts/vRX9UAHMlvg

C++:
// An example of a clock design on a seven-segment LED indicator
// with GPS-modul NEO-6M
// Board: Arduino Nano
// Indicator: 8106BH, common anode, x6 pcs

#include <TinyGPSPlus.h>
#include <GyverSegment.h>

TinyGPSPlus gps;
uint8_t h = 0, m = 0, s = 0;
// segments ............a  b  c  d  e  f  g  h
const uint8_t segs[] = { 4, 5, 7, 8, 9, 3, 2, 6 };
const uint8_t digs[] = { 10, 11, 12, 13, A0, A1 };
DispBare<6, 1, 1> led6x(digs, segs);

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

void loop() {
  while (Serial.available() > 0) {
    if (gps.encode(Serial.read())) {
      if (gps.time.isValid()) {
        h = gps.time.hour();
        m = gps.time.minute();
        s = gps.time.second();
      }
    }
  }
  led6x.tick();
  timeView7Seg6Dig();
}

void timeView7Seg6Dig() {
  led6x.setCursor(0);
  led6xPrint(h);
  led6x.print(".");
  led6xPrint(m);
  led6x.print(".");
  led6xPrint(s);
  led6x.update();
}

void led6xPrint(int n) {
  if (n / 10 == 0) { led6x.print('0'); }
  led6x.print(n);
}
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,243
945
Замечания по коду - никакого контроля управления в ЛУП нет, какая функция захватила контроллер - та и выполняется.
Если от GPS идет вывод, то пока он не кончится - ничего другого выполнятся не будет.

Функция led6x.tick(); вызывается абы как, без всякого контроля времени. Если от GPS есть сообщение - экран застынет, а когда сообщений нет - тик вызывается много раз подряд. что тоже нафик не нужно.

Вывод времени на дисплей - функция timeView7Seg6Dig(); - тоже вызывается без оглядки на то, нужно это кому или нет. Зачем выводить время на дисплей чаще, чем раз в секунду? Ведь цифры то не меняются...
 

bort707

★★★★★★✩
21 Сен 2020
3,243
945
В данном случае я бы вызывал ТИК в прерывании по таймеру. Только почитайте документацию к библиотеке - для прерываний там отдельный метод предусмотрен.
А вывод времени привязать к получению этого времени от GPS - иначе зачем его обновлять на индикаторе, если время не изменилось?
 
  • Лойс +1
Реакции: Esteriman

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
18
1
Спасибо за подсказку. Переделал программу для таймера. Как советует сам Гайвер поставил 100 мкс, т.к. планирую ввести регулировку яркости.

C++:
// An example of a clock design on a seven-segment LED indicator
// with GPS-modul NEO-6M
// Board: Arduino Nano
// Indicator: 8106BH, common anode, x6 pcs

#include <TinyGPSPlus.h>
#include <GyverSegment.h>
#include <GyverTimers.h>

TinyGPSPlus gps;
uint8_t h = 0, m = 0, s = 0;
// segments ............a  b  c  d  e  f  g  h
const uint8_t segs[] = { 4, 5, 7, 8, 9, 3, 2, 6 };
const uint8_t digs[] = { 10, 11, 12, 13, A0, A1 };
DispBare<6, 1, 1> led6x(digs, segs);

void setup() {
  Serial.begin(9600);
  Timer2.setPeriod(100);
  Timer2.enableISR(CHANNEL_A);
}

void loop() {
  while (Serial.available() > 0) {
    if (gps.encode(Serial.read())) {
      if (gps.time.isValid()) {
        h = gps.time.hour();
        m = gps.time.minute();
        s = gps.time.second();
        timeView7Seg6Dig();
      }
    }
  }
}

ISR(TIMER2_A) {
  led6x.tickManual();
}

void timeView7Seg6Dig() {
  led6x.setCursor(0);
  led6xPrint(h);
  led6x.print(".");
  led6xPrint(m);
  led6x.print(".");
  led6xPrint(s);
  led6x.update();
}

void led6xPrint(int n) {
  if (n / 10 == 0) { led6x.print('0'); }
  led6x.print(n);
}
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
657
198
@Esteriman,
Когда будете добавлять регулировку яркости, учтите, что в tickManual() ее изначально нет, надо будет добавить по аналогии с tick()
 
  • Лойс +1
Реакции: Esteriman