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 В, так как ток измеряется в Амперах.
да, конечно, напряжение. Оговорился
Если напряжение так просело, то пульсации будут достаточно большими
Попробуй внешний источник питания для светодиодного матричного дисплея использовать
Всем спасибо за помощь. Внешний источник питания для матриц - не через ардуино - решил проблему