Displays text on a WS2812 (NeoPixel) matrix display
Dependencies: mbed miniFont wsDrive
Displays text on an array of WS2812 LEDs (NeoPixels)
Text is 5 rows tall so any grid larger than that can be used. The font supports A-Z (capitals only, any lowercase input will be capitalised) numbers and some basic punctuation. Letters are 5 LEDs wide, some numbers and punctuation are smaller but generally you need 6 pixels wide per character you wish to fit. If displaying a string a 1 row space is left between characters, for other spacings either edit the code or print one letter at a time and adjust the offset for the next letter.
LEDs must be connected in horizontal rows, top row first. Rows can be either direction or alternating directions.
NOTE: The testing on this has been fairly minimal. It works with my one physical configuration, I think the logic for other configurations is correct but haven't tested it. If you find a problem please let me know.
Diff: miniFont/miniFont.cpp
- Revision:
- 2:0006602e8713
- Parent:
- 1:2014f027ed6f
--- a/miniFont/miniFont.cpp Thu Nov 06 17:32:12 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,167 +0,0 @@ -#include "miniFont.h" - -const char miniFont::dot[5] = { 0x00,0x00,0x00,0x03,0x03}; -const char miniFont::space[5] = { 0x00,0x00,0x00,0x00,0x00}; -const char miniFont::exclam[5] = { 0x01,0x01,0x01,0x00,0x01}; -const char miniFont::quest[5] = { 0x0f,0x09,0x02,0x00,0x02}; - -const char miniFont::numbers[10][5] = { - { 0x0e, 0x11, 0x11, 0x11, 0x08 }, // 0 - { 0x06, 0x02, 0x02, 0x02, 0x07 }, // 1 - { 0x1f, 0x01, 0x06, 0x18, 0x1f }, // 2 - { 0x1f, 0x01, 0x0f, 0x01, 0x1f }, // 3 - { 0x10, 0x10, 0x14, 0x1f, 0x04 }, // 4 - { 0x1f, 0x10, 0x1e, 0x01, 0x1e }, // 5 - { 0x1f, 0x10, 0x1f, 0x11, 0x1f }, // 6 - { 0x1f, 0x01, 0x01, 0x02, 0x02 }, // 7 - { 0x1f, 0x11, 0x08, 0x11, 0x1f }, // 8 - { 0x1f, 0x11, 0x1f, 0x01, 0x1f } // 9 -}; - -const char miniFont::letters[26][5] = { - { 0x1f, 0x11, 0x1f, 0x11, 0x11 }, // A - { 0x1e, 0x11, 0x1e, 0x11, 0x1e }, // B - { 0x1f, 0x10, 0x10, 0x10, 0x1f }, // C - { 0x1e, 0x11, 0x11, 0x11, 0x1e }, // D - { 0x1f, 0x10, 0x1e, 0x10, 0x1f }, // E - { 0x1f, 0x10, 0x1e, 0x10, 0x10 }, // F - { 0x1f, 0x10, 0x13, 0x11, 0x1f }, // G - { 0x11, 0x11, 0x1f, 0x11, 0x11 }, // H - { 0x07, 0x02, 0x02, 0x02, 0x07 }, // I - { 0x01, 0x01, 0x01, 0x11, 0x1f }, // J - { 0x11, 0x12, 0x1c, 0x12, 0x11 }, // K - { 0x10, 0x10, 0x10, 0x10, 0x1f }, // L - { 0x11, 0x1b, 0x15, 0x11, 0x11 }, // M - { 0x11, 0x19, 0x15, 0x13, 0x11 }, // N - { 0x1f, 0x11, 0x11, 0x11, 0x1f }, // O - { 0x1f, 0x11, 0x1f, 0x10, 0x10 }, // P - { 0x1f, 0x11, 0x15, 0x1f, 0x04 }, // Q - { 0x1f, 0x11, 0x1f, 0x12, 0x11 }, // R - { 0x1f, 0x10, 0x1f, 0x01, 0x1F }, // S - { 0x1f, 0x04, 0x04, 0x04, 0x04 }, // T - { 0x11, 0x11, 0x11, 0x11, 0x1F }, // U - { 0x11, 0x11, 0x11, 0x0a, 0x04 }, // V - { 0x11, 0x11, 0x15, 0x1b, 0x11 }, // W - { 0x11, 0x0a, 0x04, 0x0a, 0x11 }, // X - { 0x11, 0x11, 0x1f, 0x04, 0x04 }, // Y - { 0x1f, 0x02, 0x04, 0x08, 0x1f } // Z -}; - - -miniFont::miniFont() { - - rotate90 = false; - fixedWidth = false; - } - - -uint8_t miniFont::getMinPixWidth(char letter) -{ - switch(letter) { - case '.': - return 2; - case ' ': - case '1': - case 'I': - case 'i': - return 3; - case '!': - return 1; - case '?': - return 4; - default: - return maxWidth; - } -} - - -uint8_t miniFont::getPixWidth(char letter) -{ - if (fixedWidth) - return maxWidth; - else - return getMinPixWidth(letter); -} - -uint8_t miniFont::getPixHeight(char letter) -{ - return 5; -} - -// gets the proportional letter -bool miniFont::getRawChar(char letter, const char **rowArray) -{ - - if ((letter>='A') && (letter<='Z')) { // upper - *rowArray = letters[letter-'A']; - return true; - } - if ((letter>='a') && (letter<='z')) { // lower - *rowArray = letters[letter-'a']; - return true; - } - if ((letter>='0') && (letter <='9')) { - *rowArray = numbers[letter-'0']; - return true; - } - if (letter == '.') { - *rowArray = dot; - return true; - } - if (letter == '!') { - *rowArray = exclam; - return true; - } - if (letter == '?') { - *rowArray = quest; - return true; - } - if (letter == ' ') { - *rowArray = space; - return true; - } - return false; -} - -// converts to fixed width if needed. -bool miniFont::getVerticalChar(char letter, const char **rowArray) -{ - if (!fixedWidth) - return getRawChar(letter,rowArray); - - uint8_t shift = (maxWidth - getMinPixWidth(letter)) / 2; - if (shift == 0) - return getRawChar(letter,rowArray); - - const char *rawletter; - if (getRawChar(letter,&rawletter)) { - for (int i = 0; i < maxHeight; i++) { - letterBuffer[i] = rawletter[i]<<shift; - } - *rowArray = (const char *)letterBuffer; - return true; - } - return false; -} - -// rotates if needed. -bool miniFont::getChar(char letter, const char **rowArray) -{ - if (!rotate90) return getVerticalChar(letter,rowArray); - - const char *vertical; - if (!getVerticalChar(letter,&vertical)) - return false; - - for (int i = 0; i < maxWidth; i++) { - rotateBuffer[i] = 0; - } - - for (int i = 0; i < maxHeight; i++) { - for (int j = 0; j < maxWidth; j++) { - rotateBuffer[i] = vertical[j] << j; - } - } - *rowArray = vertical; - return true; -}