5 Max7219, бегущая строка, рандомное сообщение по нажатию кнопки
- Войдите на сайт для отправки комментариев
Пт, 11/03/2016 - 17:29
Всем доброго времени суток!
БУду благодарен, если кто-то поможет разобраться с проблемой. У меня 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++;
}
}
Гонял ваш скетч полчаса - все матрицы работают, не отключаются.
Я проверял раз 10, у меня отключается стабильно. Причем достаточно выключить-включить аккумулятор, как 5-я матрица опять включается (но опять на время). У меня еще была мысль, что это в настройках самого микроконтроллера дело, например малый объем внутренней памяти, куда он подгружает буквы. Где-то в сети нашел описание подобной проблемы и совет изменить объем этой памяти. ИЗменил SERIAL_RX_BUFFER_SIZE 256 в HardwareSerial.h. Кажется, период полноценной работы стал дольше, но все равно 5-я пропадает рано или поздно...
Все таки дело возможно в памяти Arduino, потому что когда я убираю из скетча #define BUF_SIZE 75 и ставлю SERIAL_RX_BUFFER_SIZE 256 и SERIAL_TX_BUFFER_SIZE 256 в HardwareSerial.h время полноценной работы увеличивается, но все равно через какое-то время 5-я матрица отключается.. ((
Все таки дело возможно в памяти Arduino, потому что когда я убираю из скетча #define BUF_SIZE 75 и ставлю SERIAL_RX_BUFFER_SIZE 256 и SERIAL_TX_BUFFER_SIZE 256 в HardwareSerial.h время полноценной работы увеличивается, но все равно через какое-то время 5-я матрица отключается.. ((
А каким боком тут HardwareSerial, если в скетче он нигде не используется?
А питание у светодиодных матриц и ардуино раздельное?
Очень может быть, что никаким боком. Я в ардуино новичок, просто гуглил свою проблему и мне показалось, что возможно это решит проблему . Оказалось что нет. Здесь написал потому что подумал, что возможно это имеет какое-то значение
А питание у светодиодных матриц и ардуино раздельное?
Нет, питание матриц идет через ардуино
[/quote]
А каким боком тут HardwareSerial, если в скетче он нигде не используется?
[/quote]
Очень может быть, что никаким боком. Я в ардуино новичок, просто гуглил свою проблему и мне показалось, что возможно это решит проблему . Оказалось что нет. Здесь написал потому что подумал, что возможно это имеет какое-то значение
А питание у светодиодных матриц и ардуино раздельное?
Нет, питание матриц идет через ардуино
Тогда значит проблема в питании.
Возможно что в какой то момент ток достигает предельного значения и происходит сбой
Вы бы ток потребления промониторили
А питание у светодиодных матриц и ардуино раздельное?
Нет, питание матриц идет через ардуино
Тогда значит проблема в питании.
Возможно что в какой то момент ток достигает предельного значения и происходит сбой
Вы бы ток потребления промониторили
Спасибо, попробую промониторить. Матрицы подключены на 5 в от ардуино. А нельзя эту проблему, если в питании дело, как-то через скетч попробовать решить?
Через скетч нельзя, а если поствить фильтрующие конденсаторы на паралельно каждому модулю, то можно и победить эту проблему. Главное что бы общий ток в пике не превышал 500мА
Промониторил ток - при включении матриц он падает почти до 4 В. Видимо дело действительно в этом. Запитаю матрицы напрямую - посмотрю что получится
Промониторил ток - при включении матриц он падает почти до 4 В. Видимо дело действительно в этом. Запитаю матрицы напрямую - посмотрю что получится
Ток не может упасть до 4 В, так как ток измеряется в Амперах.
да, конечно, напряжение. Оговорился
Если напряжение так просело, то пульсации будут достаточно большими
Попробуй внешний источник питания для светодиодного матричного дисплея использовать
Всем спасибо за помощь. Внешний источник питания для матриц - не через ардуино - решил проблему