DMD_STM32 - библиотека DMD матриц для СТМ32 и RP2040

Попробуйте с таким шаблоном

Задайте заполнение матрицы по 1 пикселю с интервалом 30-50мс и запишите видео что получится - хотя бы первые 5-6 строк

Не написали что за плата у Вас

Спасибо.
Только почему видео называется pt3?
Какой шаблон Вы использовали?

Извиняюсь, случайно сделал в коде pt3,щас pt2 отправлю

мда, китайцы не устают удивлять…
Судя по всему, использованы 16-битные драйвера, а поскольку 104 на 16 не делится - получается такая ерунда.
Единственное, что странно - почему строчка начинается не с краю?
Скажите, Вы там выше писали, что если указать размер 112х52, все работает нормально. На том видео, где буквы - не могу разглядеть - там строчка с края матрицы начнает ехать или тоже со сдвигом на 8 точек?

Если поставить 112x52 то начинает с краю, я так понимаю что отсчёт матрицы начинается справа на лево так как вход тоже с правой стороны.так как пикселей не хватает то получается перенос). Вы верно думаете, Я почитал даташит они 16 канальные то есть как раз их на плате 7 штук. Драйвер считает что пиксели есть а в реальности их нету.

Ясно
Такое у меня не предусмотрено, буду думать как исправить

#define RGB80x40_S10_pt3 4,80,40,10,3
так нормально заполняется.

Отлично
Проблема решена?

нет еще :slight_smile:

сработало, все нормально, спасибо!

1 лайк

Привет
Есть мысль как обойти пустые пиксели.
Готовы попробовать?

Здравствуйте,с радость.

Ок, через полчаса-час выложу код…

опечатался человек
. = ю

охххх
рука-лицо
Прошу прощения.

@craftish
извините за задежку
Что нужно сделать

  1. В файле DMD_Config.h библиотеки закомментируйте строчку 26
    #define RGB_DMA

  2. Вот этот вот кусок кода нужно вставить в скетч сразу после
    #include "DMD_RGB.h"

Спойлер
#define RGB104x52_S13_craft 4,104,52,13,59

template<int COL_DEPTH>
class DMD_RGB<RGB104x52_S13_craft, COL_DEPTH> : public DMD_RGB_BASE2<COL_DEPTH>
{
  public:
    DMD_RGB(uint8_t* mux_list, byte _pin_nOE, byte _pin_SCLK, uint8_t* pinlist,
            byte panelsWide, byte panelsHigh, bool d_buf = false) :
      DMD_RGB_BASE2<COL_DEPTH>(4, mux_list, _pin_nOE, _pin_SCLK, pinlist,
                               panelsWide, panelsHigh, d_buf, COL_DEPTH, 13, 104, 52)
    {
      this->fast_Hbyte = false;
      this->use_shift = false;
    }
    // Fast text shift is disabled for complex patterns, so we don't need the method
    void disableFastTextShift(bool shift) override {}

  protected:
    uint16_t get_base_addr(int16_t& x, int16_t& y) override {
      this->transform_XY(x, y);
      uint8_t pol_y = y % this->pol_displ;
      x += (y / this->DMD_PIXELS_DOWN) * this->WIDTH;
      uint16_t base_addr = (pol_y % this->nRows) * this->x_len +
                           (x / this->DMD_PIXELS_ACROSS) * this->multiplex * this->DMD_PIXELS_ACROSS +
                           x % this->DMD_PIXELS_ACROSS;
      if (pol_y < this->nRows)  base_addr += this->DMD_PIXELS_ACROSS;
      return base_addr;
    }

    void scan_dmd_p3() {

      volatile static uint8_t* ptr;
      ptr = this->buffptr;

#define PEE                    \
  *this->datasetreg = this->clk_clrmask;     \
  *this->datasetreg = this->clkmask << 16;

#if defined (DIRECT_OUTPUT)
#define pew                    \
  *this->datasetreg = this->clk_clrmask;     \
  *this->datasetreg = *ptr++;
#else
#define pew                    \
  *this->datasetreg = this->clk_clrmask;     \
  *this->datasetreg = expand[*ptr++];
#endif

      for (uint16_t uu = 0; uu < this->x_len; uu += 104)
      {

        pew pew pew pew pew pew pew pew
        pew pew pew pew pew pew pew pew

        pew pew pew pew pew pew pew pew
        pew pew pew pew pew pew pew pew

        pew pew pew pew pew pew pew pew
        pew pew pew pew pew pew pew pew

        PEE PEE PEE PEE pew pew pew pew
        pew pew pew pew PEE PEE PEE PEE

        pew pew pew pew pew pew pew pew
        pew pew pew pew pew pew pew pew

        pew pew pew pew pew pew pew pew
        pew pew pew pew pew pew pew pew

        pew pew pew pew pew pew pew pew
        pew pew pew pew pew pew pew pew

      }

      *this->datasetreg = this->clkmask << 16; // Set clock low
      this->buffptr += this->displ_len;

#undef pew

    }
};

И соответственно вызывать класс DMD тоже с этим патерном: RGB104x52_S13_craft

Теперь про точки - я не уверен что точно разглядел на видео, где строчка притормаживает на пустых пикселях, поэтому подобрал их примерно. Если не совпадет, попробуйте поменять расположение макросов PEE в последовательности в цикле ФОР в этом коде. Но общее число элементов должно сохранятся -104 шт pew и два набора PEE по 4шт

Специально зарегистрировался, чтобы просто выразить благодарность автору библиотеки. Спасибо!
https://youtu.be/vgt9HfM43A4

1 лайк

Подстава какая-то :slight_smile:
Спасибо за отзыв.

Если библиотека полезна - ставьте “звездочки” на гитхабе

1 лайк

Подскажите кто нибудь , пожалуйста. Задача следующая - несколько панелек соединены вместе. С парвого и левого крёв отобрано по 30 точек для номера и времени. Посередине появляется текст произвольной длины. Мне нужно его ограничеть именно серединой. Пусть будет например панель 160х20. Минус по краям 30*2. Итого в сотку засунуть мой текст.

Я попытался сделать так. Но у этого метода есть недостаток. Строки получаются произвольной длины. И время от времени появляется паразитный символ “^”. Так что данный метод не лучшее решение.

const char* truncateString(const char* name, int max_length, int symbols) {
  int name_length = strlen(name);

  // Проверяем, нужно ли обрезать строку
  if (name_length > max_length) {
    int new_length = max_length - symbols;
    if (new_length < 0) {
      new_length = 0;
    }

    // Выделяем память для новой строки
    char* truncated = (char*)malloc(new_length + 1);
    if (truncated == NULL) {
      // Ошибка выделения памяти, возвращаем исходную строку
      return name;
    }

    // Копируем символы из исходной строки в новую строку
    strncpy(truncated, name, new_length);
    truncated[new_length] = '\0'; // Устанавливаем нулевой символ

    // Добавляем символы в конце строки
    for (int i = 0; i < symbols; i++) {
      strcat(truncated, ".");
      //strcat(truncated, "\u2022"); // Добавляем символ Unicode для точки (•)
    }

    free(truncated); //Освобождаем память
    return truncated;
  }
  return name;

}

Вообще пытался по всякому. И часть экрана заливать, типа такого.

  int color = 0; // Черный цвет
  for (int y = height; y <= row_height - 1; y++) {
    for (int x = dmd.width() - custom_width; x <= dmd.width() - 1; x++) {
      dmd.drawPixel(x, y, color);
    }
  }

Может есть готовое решение?