Бегущая строка на светодиодных матрицах
- Войдите на сайт для отправки комментариев
Пт, 30/01/2015 - 14:58
Добрый день!
Стоит задача: организовать вывод текстовой информации на светодиодную бегущую строку.
В принципе, работает. Но выводит только английский текст. Уже вторую неделю ломаю голову как "прикрутить" кириллицу.
Текст программы:
(на авторство абсолютно не претендую)
int x;
int y;
int latchPin1 = 5; //Arduino pin connected to blue 12 RCLK of 74HC595
int clockPin1 = 6; //Arduino pin connected to green 11 SRCLK of 74HC595
int dataPin1 = 7; //Arduino pin connected to violet 14 SER of 74HC595
//-- Rows (Positive Anodes) --
int latchPin2 = 9; //Arduino pin connected to yellow Latch 12 RCLK of 74HC595
int clockPin2 = 10; //Arduino pin connected to white Clock 11 SRCLK of 74HC595
int dataPin2 = 8; //Arduino pin connected to grey Data 14 SER of 74HC595
//=== B I T M A P ===
//Bits in this array represents one LED of the matrix
// 8 is # of rows, 7 is # of LED matrix we have
byte bitmap[8][8]; // Change the 7 to however many matrices you want to use.
int numZones = sizeof(bitmap) / 8; // I will refer to each group of 8 columns (represented by one matrix) as a Zone.
int maxZoneIndex = numZones-1;
int numCols = numZones * 8;
//=== F O N T ===
// Font courtesy of aspro648
byte alphabets[][5] = {
{0,0,0,0,0}, // ПРОБЕЛ ASCII 32
{0,0,253,0,0}, // ! ASCII 33
{0,96,0,96,0}, // " ASCII 34
{20,127,20,127,20}, // # ASCII 35
{36,42,127,42,18}, // $ ASCII 36
{17,2,4,8,17}, // % ASCII 37
{54,73,85,34,5}, // & ASCII 38
{0,0,104,112,0}, // ' ASCII 39
{28,34,65}, // ( ASCII 40
{65,34,28}, // ) ASCII 41
{20,8,62,8,20}, // * ASCII 42
{8,8,62,8,8}, // + ASCII 43
{0,0,5,6,0}, // , ASCII 44
{8,8,8,8,8}, // - ASCII 45
{0,0,1,0,0}, // . ASCII 46
{1,2,4,8,16}, // / ASCII 47
{62,69,73,81,62}, // 0 ASCII 48
{0,33,127,1,0}, // 1 ASCII 49
{33,67,69,73,49}, // 2 ASCII 50
{66,65,81,105,70}, // 3 ASCII 51
{12,20,36,127,4}, // 4 ASCII 52
{113,81,81,81,78}, // 5 ASCII 53
{30,41,73,73,6}, // 6 ASCII 54
{64,64,79,80,96}, // 7 ASCII 55
{54,73,73,73,54}, // 8 ASCII 56
{48,73,73,74,60}, // 9 ASCII 57
{0,0,54,54,0}, // : ASCII 58
{0,0,53,54,0}, // ; ASCII 59
{0,8,20,34,65}, // < ASCII 60
{20,20,20,20,20}, // = ASCII 61
{0,65,34,20,8}, // > ASCII 62
{32,64,69,72,48}, // ? ASCII 63
{38,73,77,65,62}, // @ ASCII 64
{31,36,68,36,31}, // A ASCII 65
{127,73,73,73,54}, // B ASCII 66
{62,65,65,65,34}, // C ASCII 67
{127,65,65,34,28}, // D ASCII 68
{127,73,73,65,65}, // E ASCII 69
{127,72,72,72,64}, // F ASCII 70
{62,65,65,69,38}, // G ASCII 71
{127,8,8,8,127}, // H ASCII 72
{0,65,127,65,0}, // I ASCII 73
{2,1,1,1,126}, // J ASCII 74
{127,8,20,34,65}, // K ASCII 75
{127,1,1,1,1}, // L ASCII 76
{127,32,16,32,127}, // M ASCII 77
{127,32,16,8,127}, // N ASCII 78
{62,65,65,65,62}, // O ASCII 79
{127,72,72,72,48}, // P ASCII 80
{62,65,69,66,61}, // Q ASCII 81
{127,72,76,74,49}, // R ASCII 82
{50,73,73,73,38}, // S ASCII 83
{64,64,127,64,64}, // T ASCII 84
{126,1,1,1,126}, // U ASCII 85
{124,2,1,2,124}, // V ASCII 86
{126,1,6,1,126}, // W ASCII 87
{99,20,8,20,99}, // X ASCII 88
{96,16,15,16,96}, // Y ASCII 89
{67,69,73,81,97}, // Z ASCII 90
{0,127,65,65,0}, // [ ASCII 91
{0,0,0,0,0}, // \ ASCII 92
{0,65,65,127,0}, // ] ASCII 93
{16,32,64,32,16}, // ^ ASCII 94
{1,1,1,1,1}, // _ ASCII 95
{0,64,32,16,0}, // ` ASCII 96
{2,21,21,21,15}, // a ASCII 97
{127,5,9,9,6}, // b ASCII 98
{14,17,17,17,0}, // c ASCII 99
{6,9,9,5,127}, // d ASCII 100
{14,21,21,21,12}, // e ASCII 101
{8,63,72,64,32}, // f ASCII 102
{24,37,37,37,62}, // g ASCII 103
{127,8,16,16,15}, // h ASCII 104
{0,0,47,0,0}, // i ASCII 105
{2,1,17,94,0}, // j ASCII 106
{127,4,10,17,0}, // k ASCII 107
{0,65,127,1,0}, // l ASCII 108
{31,16,12,16,31}, // m ASCII 109
{31,8,16,16,15}, // n ASCII 110
{14,17,17,17,14}, // o ASCII 111
{31,20,20,20,8}, // p ASCII 112
{8,20,20,12,31}, // q ASCII 113
{31,8,16,16,8}, // r ASCII 114
{9,21,21,21,18}, // s ASCII 115
{16,126,17,1,2}, // t ASCII 116
{30,1,1,2,31}, // u ASCII 117
{28,2,1,2,28}, // v ASCII 118
{30,1,6,1,30}, // w ASCII 119
{17,10,4,10,17}, // x ASCII 120
{24,5,5,5,30}, // y ASCII 121
{17,19,21,25,17}, // z ASCII 122
{0,0,8,54,65}, // { ASCII 123
{0,0,127,0,0}, // | ASCII 124
{65,54,8,0,0}, // } ASCII 125
{ 62, 80, 144, 144, 254}, //А 126
{ 254, 146, 146, 146, 12}, //Б 127
{ 254, 146, 146, 146, 108}, //В
{ 254, 128, 128, 128, 128}, //Г
{ 3, 126, 130, 130, 255}, //Д
{ 254, 146, 146, 146, 130}, //Е
{ 238, 16, 254, 16, 238}, //Ж
{ 68, 146, 146, 146, 108}, //З
{ 254, 4, 8, 16, 254}, //И
{ 254, 4, 136, 16, 254}, //Й
{ 254, 16, 40, 68, 130}, //К
{ 62, 64, 128, 128, 254}, //Л
{ 254, 64, 32, 64, 254}, //М
{ 254, 16, 16, 16, 254}, //Н
{ 124, 130, 130, 130, 124}, //О
{ 254, 128, 128, 128, 254}, //П
{ 254, 144, 144, 144, 96}, //Р
{ 124, 130, 130, 130, 68}, //С
{ 128, 128, 254, 128, 128}, //Т
{ 224, 18, 18, 18, 252}, //У
{ 96, 144, 254, 144, 96}, //Ф
{ 198, 40, 16, 40, 198}, //Х
{ 252, 2, 2, 2, 255}, //Ц
{ 224, 16, 16, 16, 254}, //Ч
{ 254, 2, 30, 2, 254}, //Ш
{ 254, 2, 30, 2, 255}, //Щ
{ 128, 254, 18, 18, 12}, //Ъ
{ 254, 18, 18, 12, 254}, //Ы
{ 0, 254, 18, 18, 12}, //Ь
{ 68, 146, 146, 146, 124}, //Э
{ 254, 16, 124, 130, 124}, //Ю
{ 98, 148, 152, 144, 254}, //Я
{ 4, 42, 42, 42, 30}, //а
{ 60, 98, 162, 162, 156}, //б
{ 62, 42, 42, 20, 0}, //в
{ 62, 32, 32, 32, 32}, //г
{ 3, 14, 50, 34, 63}, //д
{ 28, 42, 42, 42, 16}, //е
{ 62, 8, 62, 8, 62}, //ж ASCII -26
{ 20, 34, 42, 42, 20}, //з ASCII -25
{ 62, 4, 8, 16, 62}, //и ASCII -24
{ 62, 4, 72, 16, 62}, //й ASCII -23
{ 62, 8, 8, 20, 34}, //к ASCII -22
{ 14, 16, 32, 32, 62}, //л ASCII -21
{ 62, 16, 8, 16, 62}, //м ASCII -20
{ 62, 8, 8, 8, 62}, //н ASCII -19
{ 28, 34, 34, 34, 28}, //о ASCII -18
{ 62, 32, 32, 32, 62}, //п ASCII -17
{ 63, 34, 34, 34, 28}, //р ASCII -16
{ 28, 34, 34, 34, 20}, //с ASCII -15
{ 32, 32, 62, 32, 32}, //т ASCII -14
{ 57, 5, 5, 5, 62}, //у ASCII -13
{ 24, 36, 62, 36, 24}, //ф ASCII -12
{ 34, 20, 8, 20, 34}, //х ASCII -11
{ 62, 2, 2, 62, 3}, //ц ASCII -10
{ 48, 8, 8, 8, 62}, //ч ASCII -9
{ 62, 2, 14, 2, 62}, //ш ASCII -8
{ 62, 2, 14, 2, 63}, //щ ASCII -7
{ 32, 62, 10, 10, 4}, //ъ ASCII -6
{ 62, 10, 10, 4, 62}, //ы ASCII -5
{ 62, 10, 10, 10, 4}, //ь ASCII -4
{ 20, 34, 42, 42, 28}, //э ASCII -3
{62,8,28,34,28}, // ю ASCII -2
{18,42,44,40,62}, // я ASCII -1
};
//=== S E T U P ===
void setup() {
Serial.begin(9600);
pinMode(latchPin1, OUTPUT);
pinMode(clockPin1, OUTPUT);
pinMode(dataPin1, OUTPUT);
pinMode(latchPin2, OUTPUT);
pinMode(clockPin2, OUTPUT);
pinMode(dataPin2, OUTPUT);
//-- Clear bitmap --
for (int row = 0; row < 8; row++) {
for (int zone = 0; zone <= maxZoneIndex; zone++) {
bitmap[row][zone] = 0;
}
}
}
//=== F U N C T I O N S ===
// This routine takes whatever we've setup in the bitmap array and display it on the matrix
void RefreshDisplay()
{
for (int row = 0; row < 8; row++) {
int rowbit = 1 << row;
digitalWrite(latchPin2, LOW); //Hold latchPin LOW for as long as we're transmitting data
shiftOut(dataPin2, clockPin2, MSBFIRST, rowbit); //Transmit data
//-- Start sending column bytes --
digitalWrite(latchPin1, LOW); //Hold latchPin LOW for as long as we're transmitting data
//-- Shift out to each matrix (zone is 8 columns represented by one matrix)
for (int zone = maxZoneIndex; zone >= 0; zone--) {
shiftOut(dataPin1, clockPin1, MSBFIRST, bitmap[row][zone]);
}
//-- Done sending Column bytes, flip both latches at once to eliminate flicker
digitalWrite(latchPin1, HIGH); //Return the latch pin high to signal chip that it no longer needs to listen for information
digitalWrite(latchPin2, HIGH); //Return the latch pin high to signal chip that it no longer needs to listen for information
//-- Wait a little bit to let humans see what we've pushed out onto the matrix --
// delayMicroseconds(200);
}
}
// Converts row and colum to actual bitmap bit and turn it off/on
void Plot(int col, int row, bool isOn)
{
int zone = col / 8;
int colBitIndex = col % 8;
byte colBit = 1 << colBitIndex;
if (isOn)
bitmap[row][zone] = bitmap[row][zone] | colBit;
else
bitmap[row][zone] = bitmap[row][zone] & (~colBit);
}
// Plot each character of the message one column at a time, updated the display, shift bitmap left.
void AlphabetSoup()
{
char msg[] = "абв ";
// char msg[] = "1 abcdefghijklmnopqrstuvwxyz 2 abcdefghijklmnopqrstuvwxyz 3 abcdefghijklmnopqrstuvwxyz 4 abcdefghijklmnopqrstuvwxyz 5 abcdefghijklmnopqrstuvwxyz 6 abcdefghijklmnopqrstuvwxyz 7 abcdefghijklmnopqrstuvwxyz 8 abcdefghijklmnopqrstuvwxyz 9 abcdefghijklmnopqrstuvwxyz 10 abcdefghijklmnopqrstuvwxyz ";
// char msg[] = {"А "};
for (int charIndex=0; charIndex < (sizeof(msg)-1); charIndex++)
{
int alphabetIndex = msg[charIndex]-32;
// if (alphabetIndex<0) alphabetIndex=0;
Serial.println(alphabetIndex); //************************************************
//-- Draw one character of the message --
// Each character is only 5 columns wide, but I loop two more times to create 2 pixel space betwen characters
for (int col = 0; col < 6; col++)
{
for (int row = 0; row < 8; row++)
{
// Set the pixel to what the alphabet say for columns 0 thru 4, but always leave columns 5 and 6 blank.
bool isOn = 0;
if (col<5) {
isOn = bitRead( alphabets[alphabetIndex][col], 7-row ) == 1;}
Plot( numCols-1, row, isOn); // We ALWAYS draw on the rightmost column, the shift loop below will scroll it leftward.
// Plot( numCols-1, row, !isOn); // отображение символов на залитом фоне
}
//-- The more times you repeat this loop, the slower we would scroll --
for (int refreshCount=0; refreshCount < 10; refreshCount++)
RefreshDisplay();
//-- Shift the bitmap one column to left --
for (int row=0; row<8; row++)
{
for (int zone=0; zone < numZones; zone++)
{
// This right shift would show as a left scroll on display because leftmost column is represented by least significant bit of the byte.
bitmap[row][zone] = bitmap[row][zone] >> 1;
// Roll over lowest bit from the next zone as highest bit of this zone.
if (zone < maxZoneIndex) bitWrite(bitmap[row][zone], 7, bitRead(bitmap[row][zone+1],0));
}
}
}
}
}
//=== L O O P ===
void loop() {
AlphabetSoup();
}
Проблемы заключается в следующем:
1) строка (которая прокомментирована большим количеством ****) должна выдавать порядковый номер символа в ASCII раскладке (для массива alphabets[][5] ). Но при использованиии русских букв выдает два байта. Избавиться от старшего байта никак не получается.
2) так же смущает тот факт, что arduino "видит" раскладку ASCII только до 126 символов. А наличие "русских" и "английских" букв (с учетом регистра), цифр и дополнительных символов, ну никак в 126 не "влезает".
Очень прошу подсказать "как жить дальше" или направить на путь истинный
Насколько я помню два байта занимает код в кодировке unicode. Делайте преобразование таблиц или прописывайте кодовую таблицу напрямую.
Спасибо за отклик.
Извиняюсь за настойчивость, но просьба подсказать как это делается на arduino
char msg[] = "абв "; char заменить на byte русские символы с 128 начинаются чар их просто не поймет. Получите два байта первый надо пропускать второй это и есть искомое. т.е. для "абв" будет 208/176 208/177 208/178 208 пропускаете от второго отнимаете 49 и получите искомые 127,128,129 но это совсем приметивно и без заморочек.
Но это нифига не на всех символах будет работать. Сомтрите UTF-8 таблицу, там от р до я идёт 209/128 например
Стало интересно получилось вот так, такой код преобразует русские символы в нужные вам числа в соответствии с вашим масивом. Но это только с РУССКИМИ символами работает. Для янковских надо код оставить как был.
Вот в общем: это универсальное работает со смешанными строками хоть русские хоть янковские символы хоть все вместе
я делал так. может поможет
для такого массива
Спасибо всем за помощь.
Истина, как всегда была рядом.
Отдельное спасибо Penni. Ваш код с некоторым изменением был опробован в "железе". Все ОК!
Код jeka_tm хорош для LCD дисплеев.
Чуть позже (после командировки) хочу на сайте выложить схему, код и видео работы устройства.
Всем еще раз огромное спасибо за помощь и участие.
Уважаемый, Penni. Все стесняюсь спросить. В какой среде вы программируете?
Уважаемый, Penni. Все стесняюсь спросить. В какой среде вы программируете?
По работе delphi xe7. Вне работы на всё понемногу. В основном тот же делфи и визуал студия с#. Под андроид пишу на эклипсе хотя сейчас начал немного на студию гугловскую перебираться.
Ардуино недавно купил, когда дом начал строить, планирую потом на нём сделать систему мониторинга параметров дома ну и некоторое управление им же. До ардуино собирал всё на атмегах и соответственно использовал CodeVision AVR.
Я имел ввиду: как называется программа, код из которой вы указали ранее. Там нумеруются строки и отделяются цветовыми эффектами
Вот вам файлик, который нужно заменить в папке "lib" и тогда можно выбрать кодировку самого скетча в настройках оболочки.
Файлик для среды 1.0.5.
Если нужен именно юникод, то гдето тут я уже показывал как избавиться от второго байта (где - не помню). Вобщем сложнотей там нет - главное понять что значат эти байты, а потом пара ифов, немного математики и все работает.
Я имел ввиду: как называется программа, код из которой вы указали ранее. Там нумеруются строки и отделяются цветовыми эффектами
Из Arduino IDE копирую, а на форуме когда сообщение пишите сверху есть кнопочки нажимаете {...}code и там вставляете код, он и пронумеруется и подсветится что надо и можно конкретные строки выделить
получилось.
Прошу не считать за флуд
Спасибо, проблема разрешилась.
Необходимо было поменять строку под номером 220 на:
for (int zone = 0; zone <= maxZoneIndex; zone++) {
А вы не можете кинуть снимок экрана,как вы подключали все к ардуино
Добрый день!
Кому-нибудь удалось выводить русский текст (кириллицу) на матрицы, управляемые max7219?
мы так сделали:
1. Взяли библиотеку, на которую ссылаются в статье
2. Доделали библиотеку под себя. Архив с библиотекой и примером.
Здравствуйте други!
Немного приподниму тему.
Я тоже ришил сделать бегущую строку.
Исходные данные такие.
Оборудование:
1. Ардуино
2. 10 матриц 8х8
3. Дешифратор CD4028 для управления строками
4. Сдвиговый регистр 74hc595 для управления столбцами 10шт
5. Транзисторная сборка ULN2803 для питания катодов (строк) всех матриц
Задача:
Сделать простую бегущую строку . Пока без каких либо доп возможностей (то есть без часов термометров управления со смартфона итд итп) то есть просто вывод текста, остальное прикручу позже. Сейчас эксперемнтирую пока только с одной матриценй на макетке для отработки схемы и кода.
Программа:
Есть большой двухмерный массив с 110 байтами, в каждом байте 8 бит (весь текст нарисовал сам. Только русский алфавит, заглавные и прописные, цифры и знаки пунктуации)
Дешифратор зажигает поочередно строки сверху в низ, функция ShiftOut выводит стачала позицию массива потом номер конкретного байта, таким образом за 1 проход функции рисуется отдна строчка с конкретным байтом.
Сейчас поочереди перебираются элементы массива. Все нормально светиться без засветок и прочего
Вот собственно теперь пара вопросов.
1. Правильны ли мои суждения? Массив большой и занимает половину места для переменных. В целом нестрашно вроде но видел пример где набор байт был задефайнен (#define) и не занимал места вообще. Это как вариант если придеться дорисовать английский алфавит и что то еще, пока остановился на массиве.
2. Как лучше двигать буквы? Выводить их поочереди можно нескольким путями и про это я подумаю позже. Сечас интересно как сдвигать буквы выводящиеся из массива хотя бы по очереди?. Сдвиг бита в самой функции ShiftOut работает как то однобоко, то есть сдвигает как бы всю картинку. Так что в этом вопросе у меня мозга за мозгу зашла немнога... Может нужно не просто двигать биты, а с помощью цикла for прибавлять нули в кажбый байт поочереди. Вообщем пока даже незнаю как подступиться. Еще раз оговрюсь что сейчас хотябы поняв принцып заставить бегать буквы по одной матрице.
Друзья, нехочу вас утруждать, по этому не нужно писать примеры кода, просто пальцем покажите, то есть сам принцип реализации. Направление в котором двигаться (только не Ленинским курсом пожалуйста =) )
Всем зарание спасибо!
Вот код
Вот видео работы матрицы.
https://www.youtube.com/watch?v=MRSBLdgGbI4