5 Max7219, бегущая строка, рандомное сообщение по нажатию кнопки

nikolay_smirnov
Offline
Зарегистрирован: 11.03.2016

Всем доброго времени суток!

БУду благодарен, если кто-то поможет разобраться с проблемой. У меня 5 светодиодных матриц MAX7219 соединены в ряд. НА них в виде бегущей строки выводится рандомно одна из 5 фраз, это происходит по нажатию кнопки. ( То есть вся конструкция состоит из 5 соединенных матриц, кнопки, аккумулятора и Arduino  на плате). Вроде бы все работает, но только вот 5-я, последняя, матрица через какое-то время отключается. После того как снова загружаешь скетч или перезапускаешь Arduino, все пять работают, но опять же до определенного момента пока одна не отключается. Не могу понять в чем дело, в Arduino я новичок. Ниже весь скетч целиком. Заранее спасибо!

#include <MaxMatrix.h>
#include <avr/pgmspace.h>
#define  BUF_SIZE  75

PROGMEM const unsigned char CH[] = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};


int data = 12;    // DIN pin of MAX7219 module
int load = 10;    // CS pin of MAX7219 module
int clock = 11;  // CLK pin of MAX7219 module

int maxInUse = 5;

MaxMatrix m(data, load, clock, maxInUse); // define Library

byte buffer[10];

char string1[] = " Straight ";  // Scrolling Text
char string2[] = "Right";
char string3[] = " Left   ";
char string4[] = " Wait for 10 minutes  ";
char string5[] = " Drink 50 gr of vodka ";

int k = 0;
void setup() {
  pinMode(3, INPUT);
  digitalWrite(3,HIGH);
  m.init(); // module MAX7219
  m.setIntensity(5); // LED Intensity 0-15
}

void loop() {

  byte c;


  m.shiftLeft(false, true);
  if (digitalRead (3) == 0) {
    k = random (5);
    if (k == 0) {
      printStringWithShift(string1, 100);
    }
    if (k == 1) {
      printStringWithShift(string2, 100);
    }
    if (k == 2) {
      printStringWithShift(string3, 100);
    }
      if (k == 3) {
      printStringWithShift(string4, 100);
    }
     if (k == 4) {
      printStringWithShift(string5, 100);
    }
        //delay(2000);
      }
    }

    // Put extracted character on Display
    void printCharWithShift(char c, int shift_speed) {
      if (c < 32) return;
      c -= 32;
      memcpy_P(buffer, CH + 7 * c, 7);
      m.writeSprite(maxInUse* 8, 0, buffer);
      m.setColumn(maxInUse* 8 + buffer[0], 0);

      for (int i = 0; i < buffer[0] + 1; i++)
      {
        delay(shift_speed);
        m.shiftLeft(false, false);
      }
    }

    // Extract characters from Scrolling text
    void printStringWithShift(char* s, int shift_speed) {
      while (*s != 0) {
        printCharWithShift(*s, shift_speed);
        s++;
      }
    }

 

JasKo
Offline
Зарегистрирован: 21.11.2015

Гонял ваш скетч полчаса - все матрицы работают, не отключаются.

nikolay_smirnov
Offline
Зарегистрирован: 11.03.2016

Я проверял раз 10, у меня отключается стабильно. Причем достаточно выключить-включить аккумулятор, как 5-я матрица опять включается (но опять на время). У меня еще была мысль, что это в настройках самого микроконтроллера дело, например малый объем внутренней памяти, куда он подгружает буквы. Где-то в сети нашел описание подобной проблемы и совет изменить объем этой памяти. ИЗменил SERIAL_RX_BUFFER_SIZE 256 в HardwareSerial.h. Кажется, период полноценной работы стал дольше,  но все равно 5-я пропадает рано или поздно... 

nikolay_smirnov
Offline
Зарегистрирован: 11.03.2016

Все таки дело возможно в памяти Arduino, потому что когда я убираю из скетча #define  BUF_SIZE  75 и ставлю SERIAL_RX_BUFFER_SIZE 256 и SERIAL_TX_BUFFER_SIZE 256 в HardwareSerial.h время полноценной работы  увеличивается, но все равно через какое-то время 5-я матрица отключается.. ((

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

nikolay_smirnov пишет:

Все таки дело возможно в памяти Arduino, потому что когда я убираю из скетча #define  BUF_SIZE  75 и ставлю SERIAL_RX_BUFFER_SIZE 256 и SERIAL_TX_BUFFER_SIZE 256 в HardwareSerial.h время полноценной работы  увеличивается, но все равно через какое-то время 5-я матрица отключается.. ((

 

А каким боком тут HardwareSerial, если в скетче он нигде не используется?

duinor
Offline
Зарегистрирован: 16.01.2016

А питание у светодиодных матриц и ардуино раздельное?

nikolay_smirnov
Offline
Зарегистрирован: 11.03.2016

Очень может быть, что никаким боком. Я в ардуино новичок, просто гуглил свою проблему и мне показалось, что возможно это  решит проблему . Оказалось что нет. Здесь написал потому что подумал, что возможно это имеет какое-то значение

nikolay_smirnov
Offline
Зарегистрирован: 11.03.2016

duino.ru пишет:

А питание у светодиодных матриц и ардуино раздельное?

Нет, питание матриц идет через ардуино

nikolay_smirnov
Offline
Зарегистрирован: 11.03.2016

 

[/quote]

А каким боком тут HardwareSerial, если в скетче он нигде не используется?

[/quote]

Очень может быть, что никаким боком. Я в ардуино новичок, просто гуглил свою проблему и мне показалось, что возможно это  решит проблему . Оказалось что нет. Здесь написал потому что подумал, что возможно это имеет какое-то значение

duinor
Offline
Зарегистрирован: 16.01.2016

nikolay_smirnov пишет:

duino.ru пишет:

А питание у светодиодных матриц и ардуино раздельное?

Нет, питание матриц идет через ардуино

Тогда значит проблема в питании.

Возможно что в какой то момент ток достигает предельного значения и происходит сбой 

Вы бы ток потребления промониторили

nikolay_smirnov
Offline
Зарегистрирован: 11.03.2016

duino.ru пишет:

nikolay_smirnov пишет:

duino.ru пишет:

А питание у светодиодных матриц и ардуино раздельное?

Нет, питание матриц идет через ардуино

Тогда значит проблема в питании.

Возможно что в какой то момент ток достигает предельного значения и происходит сбой 

Вы бы ток потребления промониторили

Спасибо, попробую промониторить. Матрицы подключены на 5 в от ардуино. А нельзя эту проблему, если в питании дело, как-то через скетч попробовать решить?

duinor
Offline
Зарегистрирован: 16.01.2016

Через скетч нельзя, а если поствить фильтрующие конденсаторы на паралельно каждому модулю, то можно и победить эту проблему. Главное что бы общий ток в пике не превышал 500мА

nikolay_smirnov
Offline
Зарегистрирован: 11.03.2016

Промониторил ток - при включении матриц он падает почти до 4 В. Видимо дело действительно в этом. Запитаю матрицы напрямую  - посмотрю что получится

JasKo
Offline
Зарегистрирован: 21.11.2015

nikolay_smirnov пишет:

Промониторил ток - при включении матриц он падает почти до 4 В. Видимо дело действительно в этом. Запитаю матрицы напрямую  - посмотрю что получится

Ток не может упасть до 4 В, так как ток измеряется в Амперах.

nikolay_smirnov
Offline
Зарегистрирован: 11.03.2016

да, конечно, напряжение. Оговорился

duinor
Offline
Зарегистрирован: 16.01.2016

Если напряжение так просело, то пульсации будут достаточно большими

Попробуй внешний источник питания для светодиодного матричного дисплея использовать

nikolay_smirnov
Offline
Зарегистрирован: 11.03.2016

Всем спасибо за помощь. Внешний источник питания для матриц - не через ардуино - решил проблему