Внезапный сбой в работе модулей max7219

Собрал цепочку из трех модулей 7-сегментников max7219.
Тестовый скетч:

//UNO
//Подключение библиотеки max7219
#include <LedControl.h>
//создаём объект класса LedControl (din,clk,cs,X) X - количество модулей. Провода: din-оранжевый, clk-зеленый, cs-желтый, vcc-коричневый, gnd-красный 
LedControl lc_test = LedControl(11, 9, 10, 3);

void setup() 
{
  pinMode (9, OUTPUT); 
  pinMode (10, OUTPUT); 
  pinMode (11, OUTPUT); 
  //Инициализация max7219
  lc_test.shutdown(0, false); //Выводим из спящего режима
  lc_test.setIntensity(0, 4); //Яркость дисплея на 4. Всего возможных режимов яркости от 0 до 15
  lc_test.clearDisplay(0);    //Очистить дисплей
  lc_test.shutdown(1, false); //Выводим из спящего режима
  lc_test.setIntensity(1, 4); //Яркость дисплея на 4. Всего возможных режимов яркости от 0 до 15
  lc_test.clearDisplay(1);    //Очистить дисплей
  lc_test.shutdown(2, false); //Выводим из спящего режима
  lc_test.setIntensity(2, 4); //Яркость дисплея на 4. Всего возможных режимов яркости от 0 до 15
  lc_test.clearDisplay(2);    //Очистить дисплей
}
void loop() 
{
  lc_test.setDigit(0, 7, 0, true);
  delay(500);
  lc_test.setDigit(0, 6, 1, true);
  delay(500);
  lc_test.setDigit(0, 5, 2, true);
  delay(500);
  lc_test.setDigit(0, 4, 3, true);
  delay(500);
  lc_test.setDigit(0, 3, 4, true);
  delay(500);
  lc_test.setDigit(0, 2, 5, true);
  delay(500);
  lc_test.setDigit(0, 1, 6, true);
  delay(500);
  lc_test.setDigit(0, 0, 7, true);
  delay(500);
  lc_test.clearDisplay(0);    //Очистить дисплей

  lc_test.setDigit(1, 7, 8, true);
  delay(500);
  lc_test.setDigit(1, 6, 9, true);
  delay(500);
  lc_test.setDigit(1, 5, 0, true);
  delay(500);
  lc_test.setDigit(1, 4, 1, true);
  delay(500);
  lc_test.setDigit(1, 3, 2, true);
  delay(500);
  lc_test.setDigit(1, 2, 3, true);
  delay(500);
  lc_test.setDigit(1, 1, 4, true);
  delay(500);
  lc_test.setDigit(1, 0, 5, true);
  delay(500);
  lc_test.clearDisplay(1);    //Очистить дисплей

  lc_test.setDigit(2, 7, 6, true);
  delay(500);
  lc_test.setDigit(2, 6, 7, true);
  delay(500);
  lc_test.setDigit(2, 5, 8, true);
  delay(500);
  lc_test.setDigit(2, 4, 9, true);
  delay(500);
  lc_test.setDigit(2, 3, 0, true);
  delay(500);
  lc_test.setDigit(2, 2, 1, true);
  delay(500);
  lc_test.setDigit(2, 1, 2, true);
  delay(500);
  lc_test.setDigit(2, 0, 3, true);
  delay(500);
  lc_test.clearDisplay(2);    //Очистить дисплей
}

После нормальной отработки нескольких циклов (количество их непредсказуемо - от 2 до 8) модули начинают быстро мигать. Повторная загрузка скетча (или просто подача питания) дает ту же ситуацию: несколько циклов нормального перебирания 7-сегментников, потом снова мигание. Друзья, где копать?
Заранее спасибо!

С какой частотой? Все одновременно или по очереди?
Ссылка на библиотеку?

Делайте вывод в сериал и смотрите, в каком месте и после чего начинает сбоить

Частота, думаю (глаз ее видит) 10-15Гц (но боюсь ошибиться). Мигают все одновременно. Библа LedControl, вытащена из Гитхаба. Надо сказать, что эта же библиотека на других устройствах работает без нареканий.

Что надо выводить в сериал, чтобы определиться?

Что угодно, хоть цифры по порядку. Главное - знать, в каком месте кода что выводится.

Скетч с монитором:

//UNO
int n;
//Подключение библиотеки max7219
#include <LedControl.h>
//создаём объект класса LedControl (din,clk,cs,X) X - количество модулей. Провода: din-оранжевый, clk-зеленый, cs-желтый, vcc-коричневый, gnd-красный 
LedControl lc_test = LedControl(11, 9, 10, 3);

void setup() 
{
  Serial.begin(115200);
  pinMode (9, OUTPUT); 
  pinMode (10, OUTPUT); 
  pinMode (11, OUTPUT); 
  //Инициализация max7219
  lc_test.shutdown(0, false); //Выводим из спящего режима
  lc_test.setIntensity(0, 4); //Яркость дисплея на 4. Всего возможных режимов яркости от 0 до 15
  lc_test.clearDisplay(0);    //Очистить дисплей
  lc_test.shutdown(1, false); //Выводим из спящего режима
  lc_test.setIntensity(1, 4); //Яркость дисплея на 4. Всего возможных режимов яркости от 0 до 15
  lc_test.clearDisplay(1);    //Очистить дисплей
  lc_test.shutdown(2, false); //Выводим из спящего режима
  lc_test.setIntensity(2, 4); //Яркость дисплея на 4. Всего возможных режимов яркости от 0 до 15
  lc_test.clearDisplay(2);    //Очистить дисплей
}
void loop() 
{
  lc_test.setDigit(0, 7, 0, true);
  delay(500);
  lc_test.setDigit(0, 6, 1, true);
  delay(500);
  lc_test.setDigit(0, 5, 2, true);
  delay(500);
  lc_test.setDigit(0, 4, 3, true);
  delay(500);
  lc_test.setDigit(0, 3, 4, true);
  delay(500);
  lc_test.setDigit(0, 2, 5, true);
  delay(500);
  lc_test.setDigit(0, 1, 6, true);
  delay(500);
  lc_test.setDigit(0, 0, 7, true);
  delay(500);
  lc_test.clearDisplay(0);    //Очистить дисплей

  lc_test.setDigit(1, 7, 8, true);
  delay(500);
  lc_test.setDigit(1, 6, 9, true);
  delay(500);
  lc_test.setDigit(1, 5, 0, true);
  delay(500);
  lc_test.setDigit(1, 4, 1, true);
  delay(500);
  lc_test.setDigit(1, 3, 2, true);
  delay(500);
  lc_test.setDigit(1, 2, 3, true);
  delay(500);
  lc_test.setDigit(1, 1, 4, true);
  delay(500);
  lc_test.setDigit(1, 0, 5, true);
  delay(500);
  lc_test.clearDisplay(1);    //Очистить дисплей

  lc_test.setDigit(2, 7, 6, true);
  delay(500);
  lc_test.setDigit(2, 6, 7, true);
  delay(500);
  lc_test.setDigit(2, 5, 8, true);
  delay(500);
  lc_test.setDigit(2, 4, 9, true);
  delay(500);
  lc_test.setDigit(2, 3, 0, true);
  delay(500);
  lc_test.setDigit(2, 2, 1, true);
  delay(500);
  lc_test.setDigit(2, 1, 2, true);
  delay(500);
  lc_test.setDigit(2, 0, 3, true);
  delay(500);
  lc_test.clearDisplay(2);    //Очистить дисплей
  n++;
  Serial.println(n);
}
  

Судя по показаниям монитора, вдруг начинают игнорироваться делэи.

А от чего это всё питается?

1 лайк

От USB пока.

Т.е. в сериале начинает бешенно увеличиваться число?

Да, бешено :slight_smile:

В скетче я проблемы не вижу, возможно косяк в библиотеке ))

Схожу на гитхаб, может, новенькая какая вышла…

Нет, последний релиз - девять лет назад

Уже посмотрел, да, старый релиз. Странно другое. На прочих устройствах эта же библа работает…

Кто знает, где у вас в этот раз память коцнуло ))
LedControl - довольно неоптимальная библиотека в плане расхода памяти. Я, кажется, уже говорил вам, что делал на ее основе свою, таки попробуйте:

Работать с семисегментниками там тоже можно, см. примеры

Спасибо, попробую.

Для начала попробовал заменить плату. Второй Уны в доме нет. Поставил вместо Уно Мегу. Работает штатно, никаких траблов в течение 15 минут. Была дохлая в чем-то Уно?

А может у меги памяти больше? ))

Ну, неужели Уно такой простенький скетч не осиливает? Или делэи память жрут как волки?