ПРОСТРАНСТВО ВОКРУГ НАС.
Бегущая строка из восьми модулей MAX7219 - 64*8 светодиодов
Так давно собирался и наконец - собрался с силами.
Действительно - настолько давно обещал сделать видео и выложить скетч для восьми модкулей MAX7219, собранных в одну бегущую строку, что даже потерял тот скетч, который использовал. Но вот, перед новогодней ночью - задался целью - и нашел.
Скетч.
Напомню, что в более ранней реализации мы выводили русские буквы в бегущей строке из четырех модулей MAX7219. Но попытки вывести используя ТОТ скетч в восьми модулях - 64х8 - не увенчались успехом. Это было ЗДЕСЬ
И в новогодние праздники на моей машине было передвижное поздравление "* Merry Christmas and Happy New Year 2017 !!! ". Оно отображалось красными светодиодами бегущей строки, а сборку я разместил на боковом
стекле авто. Питание осуществлял через обычный USB разъем, которым снабдил Ni-MH аккумулятор от бортового питания для моего вертолета Raptor 30V2.
Есть еще одна задумка, которую, может быть, реализую со временем - это чтобы можно было отправить на телефон SMS с текстом, потом этот текст перешел бы на интернет - сервер, а с сервера попал бы на смартфон в машине, со смартфона - на ардуинку с модулем бегущей строки... Вот такой вот длинный путь, но интересно - как это можно реализовать...
Для работы - необходима библиотека LedControl.h , которую нужно поискать в сети - это не сложно...
Выводятся только латинские символы, до переделки под кириллицу, извините, руки у меня не дошли, но в интернете есть много текстов, описывающих процесс перехода с латиницы на кириллицу.
Видео:
Итак, сам скетч - начинается со строки ниже.
#include
// pin 12 is connected to the MAX7219 pin 1
// pin 11 is connected to the CLK pin 13
// pin 10 is connected to LOAD pin 12
LedControl lc=LedControl(12,11,10,8); // 4 matrices, 4 MAX7219s.
char msg[] = "* Merry Christmas and Happy New Year 2017 !!! ";
int msgsize = strlen(msg);
// The character set courtesy of cosmicvoid. It is rowwise
byte Font8x5[104*8] =
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00,
0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x0A, 0x00,
0x0E, 0x15, 0x05, 0x0E, 0x14, 0x15, 0x0E, 0x00,
0x13, 0x13, 0x08, 0x04, 0x02, 0x19, 0x19, 0x00,
0x06, 0x09, 0x05, 0x02, 0x15, 0x09, 0x16, 0x00,
0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x04, 0x00,
0x01, 0x02, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00,
0x00, 0x0A, 0x15, 0x0E, 0x15, 0x0A, 0x00, 0x00,
0x00, 0x04, 0x04, 0x1F, 0x04, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x01,
0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
0x10, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x00,
0x0E, 0x11, 0x19, 0x15, 0x13, 0x11, 0x0E, 0x00,
0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x0E, 0x00,
0x0E, 0x11, 0x10, 0x0C, 0x02, 0x01, 0x1F, 0x00,
0x0E, 0x11, 0x10, 0x0C, 0x10, 0x11, 0x0E, 0x00,
0x08, 0x0C, 0x0A, 0x09, 0x1F, 0x08, 0x08, 0x00,
0x1F, 0x01, 0x01, 0x0E, 0x10, 0x11, 0x0E, 0x00,
0x0C, 0x02, 0x01, 0x0F, 0x11, 0x11, 0x0E, 0x00,
0x1F, 0x10, 0x08, 0x04, 0x02, 0x02, 0x02, 0x00,
0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E, 0x00,
0x0E, 0x11, 0x11, 0x1E, 0x10, 0x08, 0x06, 0x00,
0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x01,
0x08, 0x04, 0x02, 0x01, 0x02, 0x04, 0x08, 0x00,
0x00, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x00,
0x01, 0x02, 0x04, 0x08, 0x04, 0x02, 0x01, 0x00,
0x0E, 0x11, 0x10, 0x08, 0x04, 0x00, 0x04, 0x00,
0x0E, 0x11, 0x1D, 0x15, 0x0D, 0x01, 0x1E, 0x00,
0x04, 0x0A, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x00,
0x0F, 0x11, 0x11, 0x0F, 0x11, 0x11, 0x0F, 0x00,
0x0E, 0x11, 0x01, 0x01, 0x01, 0x11, 0x0E, 0x00,
0x07, 0x09, 0x11, 0x11, 0x11, 0x09, 0x07, 0x00,
0x1F, 0x01, 0x01, 0x0F, 0x01, 0x01, 0x1F, 0x00,
0x1F, 0x01, 0x01, 0x0F, 0x01, 0x01, 0x01, 0x00,
0x0E, 0x11, 0x01, 0x0D, 0x11, 0x19, 0x16, 0x00,
0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11, 0x00,
0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07, 0x00,
0x1C, 0x08, 0x08, 0x08, 0x08, 0x09, 0x06, 0x00,
0x11, 0x09, 0x05, 0x03, 0x05, 0x09, 0x11, 0x00,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x00,
0x11, 0x1B, 0x15, 0x15, 0x11, 0x11, 0x11, 0x00,
0x11, 0x13, 0x13, 0x15, 0x19, 0x19, 0x11, 0x00,
0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00,
0x0F, 0x11, 0x11, 0x0F, 0x01, 0x01, 0x01, 0x00,
0x0E, 0x11, 0x11, 0x11, 0x15, 0x09, 0x16, 0x00,
0x0F, 0x11, 0x11, 0x0F, 0x05, 0x09, 0x11, 0x00,
0x0E, 0x11, 0x01, 0x0E, 0x10, 0x11, 0x0E, 0x00,
0x1F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00,
0x11, 0x11, 0x11, 0x11, 0x0A, 0x0A, 0x04, 0x00,
0x41, 0x41, 0x41, 0x49, 0x2A, 0x2A, 0x14, 0x00,
0x11, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x11, 0x00,
0x11, 0x11, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x00,
0x1F, 0x10, 0x08, 0x04, 0x02, 0x01, 0x1F, 0x00,
0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00,
0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00,
0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x00,
0x00, 0x04, 0x0A, 0x11, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00,
0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x08, 0x0E, 0x09, 0x0E, 0x00,
0x01, 0x01, 0x0D, 0x13, 0x11, 0x13, 0x0D, 0x00,
0x00, 0x00, 0x06, 0x09, 0x01, 0x09, 0x06, 0x00,
0x10, 0x10, 0x16, 0x19, 0x11, 0x19, 0x16, 0x00,
0x00, 0x00, 0x06, 0x09, 0x07, 0x01, 0x0E, 0x00,
0x04, 0x0A, 0x02, 0x07, 0x02, 0x02, 0x02, 0x00,
0x00, 0x00, 0x06, 0x09, 0x09, 0x06, 0x08, 0x07,
0x01, 0x01, 0x0D, 0x13, 0x11, 0x11, 0x11, 0x00,
0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00,
0x04, 0x00, 0x06, 0x04, 0x04, 0x04, 0x04, 0x03,
0x01, 0x01, 0x09, 0x05, 0x03, 0x05, 0x09, 0x00,
0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
0x00, 0x00, 0x15, 0x2B, 0x29, 0x29, 0x29, 0x00,
0x00, 0x00, 0x0D, 0x13, 0x11, 0x11, 0x11, 0x00,
0x00, 0x00, 0x06, 0x09, 0x09, 0x09, 0x06, 0x00,
0x00, 0x00, 0x0D, 0x13, 0x13, 0x0D, 0x01, 0x01,
0x00, 0x00, 0x16, 0x19, 0x19, 0x16, 0x10, 0x10,
0x00, 0x00, 0x0D, 0x13, 0x01, 0x01, 0x01, 0x00,
0x00, 0x00, 0x0E, 0x01, 0x06, 0x08, 0x07, 0x00,
0x00, 0x02, 0x07, 0x02, 0x02, 0x02, 0x04, 0x00,
0x00, 0x00, 0x11, 0x11, 0x11, 0x19, 0x16, 0x00,
0x00, 0x00, 0x11, 0x11, 0x11, 0x0A, 0x04, 0x00,
0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0A, 0x00,
0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00,
0x00, 0x00, 0x09, 0x09, 0x09, 0x0E, 0x08, 0x06,
0x00, 0x00, 0x0F, 0x08, 0x06, 0x01, 0x0F, 0x00,
0x04, 0x02, 0x02, 0x01, 0x02, 0x02, 0x04, 0x00,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00,
0x01, 0x02, 0x02, 0x04, 0x02, 0x02, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1C, 0x2A, 0x49, 0x49, 0x41, 0x22, 0x1C, 0x00,
0x1C, 0x22, 0x51, 0x49, 0x41, 0x22, 0x1C, 0x00,
0x1C, 0x22, 0x41, 0x79, 0x41, 0x22, 0x1C, 0x00,
0x1C, 0x22, 0x41, 0x49, 0x51, 0x22, 0x1C, 0x00,
0x1C, 0x22, 0x41, 0x49, 0x49, 0x2A, 0x1C, 0x00,
0x1C, 0x22, 0x41, 0x49, 0x45, 0x22, 0x1C, 0x00,
0x1C, 0x22, 0x41, 0x4F, 0x41, 0x22, 0x1C, 0x00,
0x1C, 0x22, 0x45, 0x49, 0x41, 0x22, 0x1C, 0x00};
byte lentbl_S[104] =
{
2, 2, 3, 5, 5, 5, 5, 2,
3, 3, 5, 5, 2, 5, 1, 5,
5, 4, 5, 5, 5, 5, 5, 5,
5, 5, 1, 2, 4, 4, 4, 5,
5, 5, 5, 5, 5, 5, 5, 5,
5, 3, 5, 5, 4, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 7,
5, 5, 5, 3, 5, 3, 5, 5,
2, 4, 5, 4, 5, 4, 4, 4,
5, 2, 3, 4, 2, 6, 5, 4,
5, 5, 5, 4, 3, 5, 5, 5,
5, 4, 4, 3, 2, 3, 0, 0,
7, 7, 7, 7, 7, 7, 7, 7
};
int curcharix = 0;
int curcharbit = 0;
int curcharixsave = 0;
int curcharbitsave = 0;
int curcharixsave2 = 0;
int curcharbitsave2 = 0;
char curchar;
void setup()
{
lc.shutdown(0,false);// turn off power saving, enables display
lc.setIntensity(0,15);// sets brightness (0~15 possible values)
lc.clearDisplay(0);// clear screen
lc.shutdown(1,false);// turn off power saving, enables display
lc.setIntensity(1,15);// sets brightness (0~15 possible values)
lc.clearDisplay(1);// clear screen
lc.shutdown(2,false);// turn off power saving, enables display
lc.setIntensity(2,15);// sets brightness (0~15 possible values)
lc.clearDisplay(2);// clear screen
lc.shutdown(3,false);// turn off power saving, enables display
lc.setIntensity(3,15);// sets brightness (0~15 possible values)
lc.clearDisplay(3);// clear screen
lc.shutdown(4,false);// turn off power saving, enables display
lc.setIntensity(4,15);// sets brightness (0~15 possible values)
lc.clearDisplay(4);// clear screen
lc.shutdown(5,false);// turn off power saving, enables display
lc.setIntensity(5,15);// sets brightness (0~15 possible values)
lc.clearDisplay(5);// clear screen
lc.shutdown(6,false);// turn off power saving, enables display
lc.setIntensity(6,15);// sets brightness (0~15 possible values)
lc.clearDisplay(6);// clear screen
lc.shutdown(7,false);// turn off power saving, enables display
lc.setIntensity(7,15);// sets brightness (0~15 possible values)
lc.clearDisplay(7);// clear screen
lc.shutdown(8,false);// turn off power saving, enables display
lc.setIntensity(8,15);// sets brightness (0~15 possible values)
lc.clearDisplay(8);// clear screen
}
void loop()
{
int i,j,k;
while(1)
{
curcharixsave2 = curcharix;
curcharbitsave2 = curcharbit;
for (i=7;i>=0;i--) // Loop through our 8 displays
{
for (j=0;j<8;j++) // Set up rows on current display
{
byte outputbyte = 0;
curchar = msg[curcharix];
curcharixsave = curcharix;
curcharbitsave = curcharbit;
for (k=7;k>=0;k--) // Copy over data for 8 columns to current row and send it to current display
{
// This byte is the bitmap of the current character for the current row
byte currentcharbits = Font8x5[((curchar-32)*8)+j];
if (currentcharbits & (1<<curcharbit))
outputbyte |= (1<<k);
// advance the current character bit of current character
curcharbit ++;
if (curcharbit > lentbl_S[curchar-32]) // we are past the end of this character, so advance.
{
curcharbit = 0;
curcharix += 1;
if (curcharix+1 > msgsize) curcharix=0;
curchar = msg[curcharix];
}
}
lc.setRow(i, j, outputbyte);
if (j != 7) // if this is not the last row, roll back advancement, if it is, leave the counters advanced.
{
curcharix = curcharixsave;
curcharbit = curcharbitsave;
}
}
}
curcharix = curcharixsave2;
curcharbit = curcharbitsave2;
curchar = msg[curcharix];
// advance the current character bit of current character
curcharbit ++;
if (curcharbit > lentbl_S[curchar-32]) // we are past the end of this character, so advance.
{
curcharbit = 0;
curcharix += 1;
if (curcharix+1 > msgsize) curcharix=0;
curchar = msg[curcharix];
}
delay(10);
}
}