LED matrix display - MD_Parola, MD_MAX72xx and MD_MAXPanel

Hello, I received these LED modules from China: MAX7219 Dot Matrix Module They are allready connected 4pcs on one board. So I downloaded from github latest libraries, THANK YOU, Marco!!! and after some reading, I've managed to run some examples with 3 boards connected = 96x8px. They work just fine with FC16_HW preset in the MD_MAX72xx.h.

And of course, I have some noob questions. :-[ I'm trying to make a Cyrillic font for the MAX7219... And I decided to replace the english letters in the default MD_MAX72xx_font.cpp. And it works just fine, when I write from the keyboard Parola za Arduino (Parola for Arduino) it comes out the right Cyrillic letters on the LED matrices (Парола за Ардуино). But this way I loose the english letters. My understanding is that I have to make Cirillic with different ASCII numbers and write them one by one in hex format, as it is shown in the fonts parola example. Is that correct? Is there any way to write in Cyrillic in Arduino IDE with the keyboard and the right letters to come out on the matrices? :slight_smile: Thank you.

The IDE uses a multi byte character set which has, I think, at least 2 bytes for each character, so it does not match the 256 char ascii limit.

One way you could display what is being typed is to interpret the serial stream and map it to the reduced character set you have in the software. What the mapping is - you will need to work out as I have not looked at this.

Here is Cyrillic(BG) font for MD_MAX72XX, if somebody is interested:

 // Data file for user example user defined fonts
#ifndef FONTS_DATA_H
#define FONTS_DATA_H


MD_MAX72XX::fontType_t fontBG[] =
{
 0, // 0
 0, // 1
 0, // 2
 0, // 3
 0, // 4
 0, // 5
 0, // 6
 0, // 7
 0, // 8
 0, // 9
 0, // 10
 0, // 11
 0, // 12
 0, // 13
 0, // 14
 0, // 15
 0, // 16
 0, // 17
 0, // 18
 0, // 19
 0, // 20
 0, // 21
 0, // 22
 0, // 23
 0, // 24
 0, // 25
 0, // 26
 0, // 27
 0, // 28
 0, // 29
 0, // 30
 0, // 31
 0, // 32
 0, // 33
 0, // 34
 0, // 35
 0, // 36
 0, // 37
 0, // 38
 0, // 39
 0, // 40
 0, // 41
 0, // 42
 0, // 43
 0, // 44
 0, // 45
 0, // 46
 0, // 47
 0, // 48
 0, // 49
 0, // 50
 0, // 51
 0, // 52
 0, // 53
 0, // 54
 0, // 55
 0, // 56
 0, // 57
 0, // 58
 0, // 59
 0, // 60
 0, // 61
 0, // 62
 0, // 63
 0, // 64
 0, // 65
 0, // 66
 0, // 67
 0, // 68
 0, // 69
 0, // 70
 0, // 71
 0, // 72
 0, // 73
 0, // 74
 0, // 75
 0, // 76
 0, // 77
 0, // 78
 0, // 79
 0, // 80
 0, // 81
 0, // 82
 0, // 83
 0, // 84
 0, // 85
 0, // 86
 0, // 87
 0, // 88
 0, // 89
 0, // 90
 0, // 91
 0, // 92
 0, // 93
 0, // 94
 0, // 95
 0, // 96
 0, // 97
 0, // 98
 0, // 99
 0, // 100
 0, // 101
 0, // 102
 0, // 103
 0, // 104
 0, // 105
 0, // 106
 0, // 107
 0, // 108
 0, // 109
 0, // 110
 0, // 111
 0, // 112
 0, // 113
 0, // 114
 0, // 115
 0, // 116
 0, // 117
 0, // 118
 0, // 119
 0, // 120
 0, // 121
 0, // 122
 0, // 123
 0, // 124
 0, // 125
 0, // 126
 0, // 127
 0, // 128
 0, // 129
 0, // 130
 0, // 131
 0, // 132
 0, // 133
 0, // 134
 0, // 135
 0, // 136
 0, // 137
 0, // 138
 0, // 139
 0, // 140
 0, // 141
 0, // 142
 0, // 143
 0, // 144
 0, // 145
 0, // 146
 0, // 147
 0, // 148
 0, // 149
 0, // 150
 0, // 151
 0, // 152
 0, // 153
 0, // 154
 0, // 155
 0, // 156
 0, // 157
 0, // 158
 0, // 159
 0, // 160
 0, // 161
 0, // 162
 0, // 163
 0, // 164
 0, // 165
 0, // 166
 0, // 167
 0, // 168
 0, // 169
 0, // 170
 0, // 171
 0, // 172
 0, // 173
 0, // 174
 0, // 175
 0, // 176
 0, // 177
 0, // 178
 0, // 179
 0, // 180
 0, // 181
 0, // 182
 0, // 183
 0, // 184
 0, // 185
 0, // 186
 0, // 187
 0, // 188
 0, // 189
 0, // 190
 0, // 191
  5, 0x7e, 0x11, 0x11, 0x11, 0x7e,             // 192 - 'А'  x0c0
  5, 0x7f, 0x49, 0x49, 0x49, 0x31,             // 193 - 'Б'  x0c1
  5, 0x7f, 0x49, 0x49, 0x49, 0x36,             // 194 - 'B'  x0c2
  5, 0x7f, 0x01, 0x01, 0x01, 0x03,             // 195 - 'Г'  x0c3
  6, 0xc0, 0x7e, 0x41, 0x41, 0x7e, 0xc0,       // 196 - 'Д'  x0c4
  5, 0x7f, 0x49, 0x49, 0x49, 0x41,             // 197 - 'E'  x0c5
  5, 0x77, 0x08, 0x7f, 0x08, 0x77,             // 198 - 'Ж'  x0c6
  5, 0x41, 0x49, 0x49, 0x49, 0x36,             // 199 - 'З'  x0c7
  5, 0x7f, 0x10, 0x08, 0x04, 0x7f,             // 200 - 'И'  x0c8
  5, 0x7f, 0x10, 0x09, 0x04, 0x7f,             // 201 - 'Й'  x0c9
  5, 0x7f, 0x08, 0x14, 0x22, 0x41,             // 202 - 'K'  x0ca
  5, 0x40, 0x3e, 0x01, 0x01, 0x7f,             // 203 - 'Л'  x0cb
  5, 0x7f, 0x02, 0x0c, 0x02, 0x7f,             // 204 - 'M'  x0cc
  5, 0x7f, 0x08, 0x08, 0x08, 0x7f,             // 205 - 'H'  x0cd
  5, 0x3e, 0x41, 0x41, 0x41, 0x3e,             // 206 - 'O'  x0ce
  5, 0x7f, 0x01, 0x01, 0x01, 0x7f,             // 207 - 'П'  x0cf
  5, 0x7f, 0x09, 0x09, 0x09, 0x06,             // 208 - 'Р'  x0d0
  5, 0x3e, 0x41, 0x41, 0x41, 0x22,             // 209 - 'C'  x0d1
  5, 0x03, 0x01, 0x7f, 0x01, 0x03,             // 210 - 'T'  x0d2
  5, 0x27, 0x48, 0x48, 0x48, 0x3f,             // 211 - 'У'  x0d3
  7, 0x1c, 0x22, 0x22, 0x7f, 0x22, 0x22, 0x1c, // 212 - 'Ф'  x0d4
  5, 0x63, 0x14, 0x08, 0x14, 0x63,             // 213 - 'X'  x0d5
  6, 0x7f, 0x40, 0x40, 0x40, 0x7f, 0xc0,       // 214 - 'Ц'  x0d6
  5, 0x07, 0x08, 0x08, 0x08, 0x7f,             // 215 - 'Ч'  x0d7
  5, 0x7f, 0x40, 0x7e, 0x40, 0x7f,             // 216 - 'Ш'  x0d8
  6, 0x7f, 0x40, 0x7e, 0x40, 0x7f, 0xc0,       // 217 - 'Щ'  x0d9
  7, 0x01, 0x01, 0x7f, 0x48, 0x48, 0x48, 0x30, // 218 - 'Ъ'  x0da
  5, 0x7f, 0x48, 0x48, 0x30, 0x7f,             // 219 - 'Ы'  x0db
  5, 0x7f, 0x48, 0x48, 0x48, 0x30,             // 220 - 'Ь'  x0dc
  5, 0x22, 0x41, 0x49, 0x49, 0x3e,             // 221 - 'Э'  x0dd
  6, 0x7f, 0x08, 0x3e, 0x41, 0x41, 0x3e,       // 222 - 'Ю'  x0de
  5, 0x46, 0x29, 0x19, 0x09, 0x7f,             // 223 - 'Я'  x0df
  5, 0x20, 0x54, 0x54, 0x54, 0x78,             // 224 - 'а'  x0e0
  5, 0x3c, 0x4a, 0x4a, 0x49, 0x31,             // 225 - 'б'  x0e1
  5, 0x7c, 0x54, 0x54, 0x54, 0x28,             // 226 - 'в'  x0e2
  4, 0x7c, 0x04, 0x04, 0x0c,                   // 227 - 'г'  x0e3
  6, 0xc0, 0x78, 0x44, 0x44, 0x78, 0xc0,       // 228 - 'д'  x0e4
  5, 0x38, 0x54, 0x54, 0x54, 0x18,             // 229 - 'e'  x0e5
  5, 0x6c, 0x10, 0x7c, 0x10, 0x6c,             // 230 - 'ж'  x0e6
  5, 0x44, 0x54, 0x54, 0x54, 0x28,             // 231 - 'з'  x0e7
  5, 0x7c, 0x20, 0x10, 0x08, 0x7c,             // 232 - 'и'  x0e8
  5, 0x7c, 0x20, 0x12, 0x08, 0x7c,	       // 233 - 'й'  x0e9
  5, 0x7c, 0x10, 0x10, 0x28, 0x44,             // 234 - 'к'  x0ea
  5, 0x40, 0x38, 0x04, 0x04, 0x7c,             // 235 - 'л'  x0eb
  5, 0x7c, 0x08, 0x10, 0x08, 0x7c,             // 236 - 'м'  x0ec
  5, 0x7c, 0x10, 0x10, 0x10, 0x7c,             // 237 - 'н'  x0ed
  5, 0x38, 0x44, 0x44, 0x44, 0x38,             // 238 - 'o'  x0ee
  5, 0x7c, 0x04, 0x04, 0x04, 0x7c,             // 239 - 'п'  x0ef
  5, 0xfc, 0x24, 0x24, 0x24, 0x18,             // 240 - 'р'  x0f0
  4, 0x38, 0x44, 0x44, 0x44,                   // 241 - 'с'  x0f1
  5, 0x0c, 0x04, 0x7c, 0x04, 0x0c,             // 242 - 'т'  x0f2
  5, 0x4c, 0x90, 0x90, 0x50, 0x3c,             // 243 - 'у'  x0f3
  7, 0x10, 0x28, 0x28, 0xfc, 0x28, 0x28, 0x10, // 244 - 'ф'  x0f4
  5, 0x44, 0x28, 0x10, 0x28, 0x44,             // 245 - 'x'  x0f5
  5, 0x7c, 0x40, 0x40, 0x7c, 0xc0,             // 246 - 'ц'  x0f6
  5, 0x0c, 0x10, 0x10, 0x10, 0x7c,             // 247 - 'ч'  x0f7
  5, 0x7c, 0x40, 0x78, 0x40, 0x7c,             // 248 - 'ш'  x0f8
  6, 0x7c, 0x40, 0x78, 0x40, 0x7c, 0xc0,       // 249 - 'щ'  x0f9
  6, 0x04, 0x7c, 0x50, 0x50, 0x50, 0x20,       // 250 - 'ъ'  x0fa
  5, 0x7c, 0x50, 0x50, 0x20, 0x7c,             // 251 - 'ы'  x0fb
  5, 0x7c, 0x50, 0x50, 0x50, 0x20,             // 252 - 'ь'  x0fc
  5, 0x28, 0x44, 0x54, 0x54, 0x38,             // 253 - 'э'  x0fd
  6, 0x7c, 0x10, 0x38, 0x44, 0x44, 0x38,       // 254 - 'ю'  x0fe
  5, 0x48, 0x34, 0x14, 0x14, 0x7c              // 255 - 'я'  x0ff
};
#endif

Thanks ton4eff. Do you have the text file (for txt2font) or the xls worksheet (for FontBuilder), depending on how you made this, that I can include in the release?

I'm afraid I deleted those... :confused: I did part of it with excell and part with txt2font. I also used some latin letters from original file. I made it in compliance with Windows 1251 code page (I don't know why :slight_smile: ) May be because I'm hoping one day, if I get smart enough, I could make a program (php), so if one writes in a browser window, it would output the code for the MD_MAX72xx library in this format: "\x0e0\x0e1\x0e2\x0e3\x0e4\x0e5\x0e6\x0e7\x0e8\x0e9\x0ea\x0eb\x0ec\x0ed\x0ee" },"

I was going to ask does it matter if the coding for the letters is hex or decimal? I see it works well with both.
And also is it possible to make different text animation effect for in and out with parola?

1 Like

I was going to ask does it matter if the coding for the letters is hex or decimal? I see it works well with both.

No difference. The notation is just an equivalent way of expressing the same number, just a different number base.

And also is it possible to make different text animation effect for in and out with parola?

Yes, that is built into the function:

void displayText(char *pText, textPosition_t align, uint16_t speed, uint16_t pause, textEffect_t effectIn, textEffect_t effectOut)

All in the documentation :slight_smile:

I was busy with these fonts. Now I'm starting to read all the documents, thank you.
Edited the previous post. Now everything is in hex (looks better :slight_smile: ) and also added some Russian characters. Now it should be complete Cyrillic for MD_MAX72XX library.

Here is a short video of how the Cyrillic alphabet looks.

1 Like

I have downloaded code to use 16 rows and big fonts from Trick for 16-rows display using Parola :) - Exhibition / Gallery - Arduino Forum The matrices I have have the ic on top/bottom of the boards so I cant stack them top to bottom. I have to stck them bottom to bottom or top to top. The problem is that one zone will always be reversed from the other. Is there a way to set the zones independently from each other and have different hardware definitions so that the text will scroll together. The way it is configured now it works but there is a gap from the circuit board between the 2 zones.
.
Basically I want to define two different HW types one type per zone.
thanks.

Look at the example code for double line display. There is a method to reverse and invert the text on the top row so it looks right.

I looked at Parola_double_Height(and _v2) but I did not find where I can inverse the top row.

As a side point for some reason in the V2 script (and some others I dont recall which) the matrix was blank after upload even with unplugging and reconnecting until I changed the script to include Serial.begin.

If someone can help me and point out where I can configure the zones I would be even more grateful.

Thanks.

The example that showed the inverse and reversed was the Double_Clock example, so my error on that one.

I have modified Double_Height_v2 to include the same logic. Please download the whole library again as there have been a few adjustments to the core code that you need to have consistent.

There was some debug output still turned on for the MD_MAX72xx library which could explain your Serial.begin() requirement. This has been fixed so you may want to take a copy of the latest MD_MAX72xx library as well.

Please tell me can i show float value direct with parola library ? if yes please tell me how ! any example will be very help full thanks !

PS. i want to make a frequency meter/counter !

Any help ?

marco_c:
TPlease download the whole library again as there have been a few adjustments to the core code that you need to have consistent.

Thanks doing that now...

I tried it and it works like it should.... almost.

It seems like my zones are reversed. The top zone has the ic chips on bottom and the lower zone has them on top so they have a space betweeen the matrices. I tried changing

#define ZONE_UPPER  0
#define ZONE_LOWER  1

but there was no effect. I tried but cannot figure out what to do to get it working right.

Please tell me can i show float value direct with parola library

Parola only displays strings. You need to convert your data into a string using the dtostrf() function.

I tried it and it works like it should.... almost.

Please confirm that you have arranged the matrix modules as per the documentation in the MD_MAX72xx library - module 0 is on the right and increases to the left. The Double-Height examples also show how the modules need to be arranged.

I am checking the double height module arrangement [edit: I checked} but for single line module 0 is at the far right so it reads like this:

_ _ _ _ _ _ _ _
7,6,5,4,3,2,1,0

Double height is like so:
_ _ _ _
3 2 1 0
4 5 6 7
- - - -

the _ is the IC on top of the modules.

I do see that the wiring is expected to be different
like so:
4 5 6 7
3 2 1 0

The problem is then I cant easilt convert from one line to double line just changing the code I need to change the wiring which is soldered together.

Thanks again.

Hate to bother you Marco, but I upgraded parola and max libraries today and the old sketches stopped working. Here is the error log:

Arduino: 1.6.13 (Windows 8.1), Board: "Arduino/Genuino Uno"

C:\Users\ton4eff\AppData\Local\Temp\arduino_modified_sketch_344396\Parola_Zone_TimeMsg.ino: In function 'void setup()':

Parola_Zone_TimeMsg:140: error: 'CENTER' was not declared in this scope

   P.displayZoneText(1, szTime, CENTER, SPEED_TIME, PAUSE_TIME, PRINT, NO_EFFECT);

                                ^

Parola_Zone_TimeMsg:140: error: 'PRINT' was not declared in this scope

   P.displayZoneText(1, szTime, CENTER, SPEED_TIME, PAUSE_TIME, PRINT, NO_EFFECT);

                                                                ^

Parola_Zone_TimeMsg:140: error: 'NO_EFFECT' was not declared in this scope

   P.displayZoneText(1, szTime, CENTER, SPEED_TIME, PAUSE_TIME, PRINT, NO_EFFECT);

                                                                       ^

Parola_Zone_TimeMsg:141: error: 'SCROLL_LEFT' was not declared in this scope

   P.displayZoneText(0, szMesg, CENTER, SPEED_TIME, 0, SCROLL_LEFT, SCROLL_LEFT);

                                                       ^

C:\Users\ton4eff\AppData\Local\Temp\arduino_modified_sketch_344396\Parola_Zone_TimeMsg.ino: In function 'void loop()':

Parola_Zone_TimeMsg:166: error: 'SCROLL_LEFT' was not declared in this scope

         P.setTextEffect(0, SCROLL_LEFT, SCROLL_LEFT);

                            ^

exit status 1
'CENTER' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Is it possible to download the previous versions somewhere? And here is what I get with new Parola zone time msg example (no errors during compiling):

ps: First problem solved - it was "PA_" thing in functions...

All the animation names have PA_ in front of them as some were clashing with other libraries, especially ESP8266 related. Easy edit for most code - PA_CENTER, PA_PRINT, etc.

Zone_Time_Mesg example has not changed from before (other than PA_ edit) so I am not sure what could be going wrong.

Strangely enough, today Zone_Time_Mesg example is working... I'm using it with DS3231 module, but obviously it was not the problem, because today it's working with the same module... Same arduino board, same computer, same IDE version...
I ordered some ESP8266 modules and I'm planning to try to run Parola on these to. Thank you.

And only one more question, I hope that it's not one of those strange errors again, there were never a problem with previous version. This is from Parola Fonts example:

Arduino: 1.6.13 (Windows 8.1), Board: "Arduino/Genuino Uno"

Sketch uses 18,914 bytes (58%) of program storage space. Maximum is 32,256 bytes.
Global variables use 2,495 bytes (121%) of dynamic memory, leaving -447 bytes for local variables. Maximum is 2,048 bytes.
processing.app.debug.RunnerException: Not enough memory; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing your footprint.
	at cc.arduino.Compiler.size(Compiler.java:340)
	at cc.arduino.Compiler.build(Compiler.java:159)
	at processing.app.SketchController.build(SketchController.java:643)
	at processing.app.Editor$BuildHandler.run(Editor.java:1795)
	at java.lang.Thread.run(Thread.java:745)
Not enough memory; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing your footprint.

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.