Бегущая точка в Max7219

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
42
2
Прошу помощи. Код зависает. Перед зависанием может отработать несколько раз, но при этом не гасит предыдущую точку. Пытаюсь сделать фейерверк на матрице 64х16. Код dotsec и dotOnLine взят из библиотеки GyverMax7219. Демо-примеры работают отлично (кроме кривой Безье).

C++:
#include <GyverMAX7219.h>
MAX7219<8, 2, 5> mtrx; // 8 по горизонтали, 2 по вертикали
                       // CS - D5
const uint8_t wM = 64, hM = 16; // ширина и высота
uint32_t t1=millis();

void setup() {
    mtrx.begin();       // запускаем матрицу
    mtrx.setBright(3);  // яркость 0..15
    mtrx.clear();
    randomSeed(analogRead(0)); // запускаем генератор случайных чисел
}

void loop() {
  if (millis()-t1 > 100) {
    t1 = millis();
    fireworks();
    mtrx.update();
  }
}

void dotsec(int x, int y, uint8_t fill) {
    if (x < 0 || x >= wM || y < 0 || y >= hM) return;
    mtrx.dot(x, y, fill);
}

uint8_t xprev=0, yprev=0;
bool dotOnLine(int x0, int y0, int x1, int y1, uint8_t fill = 1) {
  static uint8_t x=x0, y=y0;
  int8_t sx = (x0 < x1) ? 1 : -1;
  int8_t sy = (y0 < y1) ? 1 : -1;
  int dx = abs(x1 - x0);
  int dy = abs(y1 - y0);
  int e1 = dx - dy;
  static int e2 = 0;
  dotsec(xprev, yprev, 0);
  if (x == x1 && y == y1) return true;
  dotsec(x, y, 1);
  e2 = e1 << 1;
  if (e2 > -dy) {
      e1 -= dy;
      xprev = x;
      x += sx;
  }
  if (e2 < dx) {
      e1 += dx;
      yprev = y;
      y += sy;
  }
  return false;
}

void fireworks() {
static bool fire=true;
static uint8_t x0, y0, x1, y1;
  if (fire) {
    x0 = random(wM); y0 = random(hM);
    x1 = random(wM); y1 = random(hM);
    fire = false;
    mtrx.clear();
  }
  if (dotOnLine(x0, y0, x1, y1)) fire = true;
}