/*
* Copyright (C) 2022, Andrei Egorov
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "LedControl.h"
String utf8rus(String source)
{
int i,k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) { n = 0xB8; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}
String disp_text = utf8rus("ABCDАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ ");
const uint8_t PROGMEM fontHEX[][8] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 0x20 32
{0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02}, // ! 0x21 33
{0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // " 0x22 34
{0x28, 0x28, 0x7E, 0x14, 0x14, 0x3F, 0x0A, 0x0A}, // # 0x23 35
{0x04, 0x1E, 0x05, 0x05, 0x0E, 0x14, 0x14, 0x0F}, // $ 0x24 36
{0x46, 0x49, 0x29, 0x26, 0x90, 0x50, 0x48, 0x88}, // % 0x25 37
{0x06, 0x09, 0x09, 0x26, 0x29, 0x11, 0x31, 0x4E}, // & 0x26 38
{0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ' 0x27 39
{0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02}, // ( 0x28 40
{0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02}, // ) 0x29 41
{0x15, 0x0E, 0x15, 0x04, 0x00, 0x00, 0x00, 0x00}, // * 0x2a 42
{0x00, 0x08, 0x08, 0x08, 0x7F, 0x08, 0x08, 0x08}, // + 0x2b 43
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02}, // , 0x2c 44
{0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00}, // - 0x2d 45
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02}, // . 0x2e 46
{0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01}, // / 0x2f 47
{0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E}, // 0 0x30 48
{0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0E}, // 1 0x31 49
{0x0E, 0x11, 0x10, 0x08, 0x04, 0x02, 0x01, 0x1F}, // 2 0x32 50
{0x0E, 0x11, 0x10, 0x0C, 0x10, 0x10, 0x11, 0x0E}, // 3 0x33 51
{0x08, 0x0C, 0x0A, 0x09, 0x1F, 0x08, 0x08, 0x08}, // 4 0x34 52
{0x1F, 0x01, 0x01, 0x0F, 0x10, 0x10, 0x11, 0x0E}, // 5 0x35 53
{0x0C, 0x02, 0x01, 0x0F, 0x11, 0x11, 0x11, 0x0E}, // 6 0x36 54
{0x1F, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02}, // 7 0x37 55
{0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x11, 0x0E}, // 8 0x38 56
{0x0E, 0x11, 0x11, 0x11, 0x1E, 0x10, 0x08, 0x06}, // 9 0x39 57
{0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02}, // : 0x3a 58
{0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02}, // ; 0x3b 59
{0x00, 0x40, 0x30, 0x0C, 0x02, 0x0C, 0x30, 0x40}, // < 0x3c 60
{0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00}, // = 0x3d 61
{0x00, 0x02, 0x0C, 0x30, 0x40, 0x30, 0x0C, 0x02}, // > 0x3e 62
{0x07, 0x08, 0x08, 0x04, 0x02, 0x02, 0x00, 0x02}, // ? 0x3f 63
{0x7C, 0x82, 0x39, 0x25, 0x25, 0x25, 0xF9, 0x02}, // @ 0x40 64
{0x18, 0x18, 0x24, 0x24, 0x24, 0x7E, 0x42, 0x42}, // A 0x41 65
{0x1E, 0x22, 0x22, 0x1E, 0x22, 0x22, 0x22, 0x1E}, // B 0x42 66
{0x78, 0x04, 0x02, 0x02, 0x02, 0x02, 0x04, 0x78}, // C 0x43 67
{0x1E, 0x22, 0x42, 0x42, 0x42, 0x42, 0x22, 0x1E}, // D 0x44 68
{0x3E, 0x02, 0x02, 0x1E, 0x02, 0x02, 0x02, 0x3E}, // E 0x45 69
{0x3E, 0x02, 0x02, 0x3E, 0x02, 0x02, 0x02, 0x02}, // F 0x46 70
{0x78, 0x04, 0x02, 0x02, 0x72, 0x42, 0x44, 0x78}, // G 0x47 71
{0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42}, // H 0x48 72
{0x1C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C}, // I 0x49 73
{0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x1C}, // J 0x4a 74
{0x22, 0x12, 0x0A, 0x06, 0x06, 0x0A, 0x12, 0x22}, // K 0x4b 75
{0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x3C}, // L 0x4c 76
{0x63, 0x63, 0x55, 0x55, 0x49, 0x49, 0x41, 0x41}, // M 0x4d 77
{0x46, 0x46, 0x4A, 0x4A, 0x52, 0x52, 0x62, 0x62}, // N 0x4e 78
{0x1C, 0x22, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1C}, // O 0x4f 79
{0x1E, 0x22, 0x22, 0x22, 0x1E, 0x02, 0x02, 0x02}, // P 0x50 80
{0x1C, 0x22, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1C}, // Q 0x51 81
{0x1E, 0x22, 0x22, 0x22, 0x1E, 0x12, 0x22, 0x42}, // R 0x52 82
{0x3C, 0x02, 0x02, 0x1C, 0x20, 0x20, 0x20, 0x1E}, // S 0x53 83
{0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, // T 0x54 84
{0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C}, // U 0x55 85
{0x22, 0x22, 0x22, 0x14, 0x14, 0x14, 0x08, 0x08}, // V 0x56 86
{0x91, 0x91, 0x91, 0xAA, 0xAA, 0xAA, 0x44, 0x44}, // W 0x57 87
{0x22, 0x22, 0x14, 0x08, 0x08, 0x14, 0x22, 0x22}, // X 0x58 88
{0x22, 0x22, 0x14, 0x14, 0x08, 0x08, 0x08, 0x08}, // Y 0x59 89
{0x3E, 0x20, 0x10, 0x08, 0x08, 0x04, 0x02, 0x3E}, // Z 0x5a 90
{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}, // [ 0x5b 91
{0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04}, // \ 0x5c 92
{0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}, // ] 0x5d 93
{0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00}, // ^ 0x5e 94
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // _ 0x5f 95
{0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ` 0x60 96
{0x00, 0x00, 0x1C, 0x20, 0x3C, 0x22, 0x22, 0x3C}, // a 0x61 97
{0x02, 0x02, 0x1E, 0x22, 0x22, 0x22, 0x22, 0x1E}, // b 0x62 98
{0x00, 0x00, 0x38, 0x04, 0x04, 0x04, 0x04, 0x38}, // c 0x63 99
{0x20, 0x20, 0x3C, 0x22, 0x22, 0x22, 0x22, 0x3C}, // d 0x64 100
{0x00, 0x00, 0x1C, 0x22, 0x3E, 0x02, 0x22, 0x1C}, // e 0x65 101
{0x30, 0x08, 0x08, 0x1C, 0x08, 0x08, 0x08, 0x08}, // f 0x66 102
{0x3C, 0x22, 0x22, 0x22, 0x3C, 0x20, 0x20, 0x1C}, // g 0x67 103
{0x02, 0x02, 0x02, 0x1E, 0x22, 0x22, 0x22, 0x22}, // h 0x68 104
{0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}, // i 0x69 105
{0x10, 0x00, 0x18, 0x10, 0x10, 0x10, 0x10, 0x0C}, // j 0x6a 106
{0x02, 0x02, 0x12, 0x0A, 0x06, 0x0A, 0x12, 0x22}, // k 0x6b 107
{0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, // l 0x6c 108
{0x00, 0x00, 0x37, 0x49, 0x49, 0x49, 0x49, 0x49}, // m 0x6d 109
{0x00, 0x00, 0x1E, 0x22, 0x22, 0x22, 0x22, 0x22}, // n 0x6e 110
{0x00, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x22, 0x1C}, // o 0x6f 111
{0x1E, 0x22, 0x22, 0x22, 0x1E, 0x02, 0x02, 0x02}, // p 0x70 112
{0x3C, 0x22, 0x22, 0x22, 0x3C, 0x20, 0x20, 0x20}, // q 0x71 113
{0x00, 0x00, 0x34, 0x0C, 0x04, 0x04, 0x04, 0x04}, // r 0x72 114
{0x00, 0x00, 0x38, 0x04, 0x0C, 0x30, 0x20, 0x1C}, // s 0x73 115
{0x08, 0x08, 0x3C, 0x08, 0x08, 0x08, 0x08, 0x30}, // t 0x74 116
{0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x3C}, // u 0x75 117
{0x00, 0x00, 0x22, 0x22, 0x14, 0x14, 0x08, 0x08}, // v 0x76 118
{0x00, 0x00, 0x49, 0x49, 0x55, 0x55, 0x22, 0x22}, // w 0x77 119
{0x00, 0x00, 0x22, 0x14, 0x08, 0x08, 0x14, 0x22}, // x 0x78 120
{0x00, 0x00, 0x12, 0x12, 0x12, 0x1C, 0x10, 0x0C}, // y 0x79 121
{0x00, 0x00, 0x3C, 0x20, 0x10, 0x08, 0x04, 0x3C}, // z 0x7a 122
{0x04, 0x04, 0x04, 0x04, 0x03, 0x04, 0x04, 0x04}, // { 0x7b 123
{0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02}, // | 0x7c 124
{0x02, 0x02, 0x02, 0x02, 0x0C, 0x02, 0x02, 0x02}, // } 0x7d 125
{0x00, 0x00, 0x00, 0x46, 0x49, 0x31, 0x00, 0x00}, // ~ 0x7e 126
{0x18, 0x24, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42}, // А 192
{0x7e, 0x02, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x3e}, // Б
{0x3E, 0x42, 0x42, 0x3E, 0x42, 0x42, 0x42, 0x3E}, // В
{0x7e, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02}, // Г
{0x18, 0x24, 0x24, 0x24, 0x24, 0x7E, 0x42, 0x42}, // Д
{0x7E, 0x02, 0x02, 0x7E, 0x02, 0x02, 0x02, 0x7E}, // Е
{0x92, 0x92, 0x54, 0x38, 0x54, 0x92, 0x92, 0x92}, // Ж
{0x38, 0x44, 0x40, 0x20, 0x40, 0x40, 0x44, 0x38}, // З
{0x42, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x46, 0x42}, // И
{0x5A, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x46, 0x42}, // Й
{0x22, 0x12, 0x0A, 0x06, 0x06, 0x0A, 0x12, 0x22}, // К
{0x7C, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x46}, // Л
{0x63, 0x63, 0x55, 0x55, 0x49, 0x49, 0x41, 0x41}, // М
{0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42}, // Н
{0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18}, // О
{0x7E, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42}, // П
{0x1E, 0x22, 0x22, 0x22, 0x1E, 0x02, 0x02, 0x02}, // Р
{0x38, 0x44, 0x02, 0x02, 0x02, 0x02, 0x44, 0x38}, // С
{0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, // Т
{0x44, 0x44, 0x44, 0x78, 0x40, 0x40, 0x44, 0x38}, // У
{0x7C, 0x92, 0x92, 0x92, 0x92, 0x7C, 0x10, 0x10}, // Ф
{0x22, 0x22, 0x14, 0x08, 0x08, 0x14, 0x22, 0x22}, // Х
{0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x7E, 0x40}, // Ц
{0x44, 0x44, 0x44, 0x7C, 0x40, 0x40, 0x40, 0x40}, // Ч
{0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x7F}, // Ш
{0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0xFF, 0x80}, // Щ
{0x06, 0x04, 0x04, 0x3C, 0x44, 0x44, 0x44, 0x3c}, // Ъ
{0x42, 0x42, 0x42, 0x4E, 0x52, 0x52, 0x52, 0x4E}, // Ы
{0x02, 0x02, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x3E}, // Ь
{0x3C, 0x42, 0x40, 0x7C, 0x40, 0x40, 0x42, 0x3C}, // Э
{0x32, 0x4A, 0x4A, 0x4E, 0x4A, 0x4A, 0x4A, 0x32}, // Ю
{0x7C, 0x42, 0x42, 0x7C, 0x50, 0x48, 0x44, 0x42}, // Я 223
{0x00, 0x1C, 0x22, 0x20, 0x3C, 0x22, 0x22, 0x1C}, //a 224
{0x06, 0x18, 0x20, 0x20, 0x3C, 0x22, 0x22, 0x1C}, //б
{0x00, 0x1E, 0x22, 0x22, 0x1E, 0x22, 0x22, 0x1E}, //в
{0x00, 0x3E, 0x22, 0x02, 0x02, 0x02, 0x02, 0x02}, //г
{0x00, 0x3C, 0x28, 0x24, 0x22, 0x3E, 0x22, 0x22}, //д
{0x00, 0x1C, 0x22, 0x22, 0x3E, 0x02, 0x02, 0x1C}, //e
{0x00, 0x2A, 0x2A, 0x2A, 0x1C, 0x2A, 0x2A, 0x2A}, //ж
{0x00, 0x1C, 0x22, 0x20, 0x1C, 0x20, 0x22, 0x1C}, //з
{0x00, 0x22, 0x22, 0x32, 0x2A, 0x26, 0x22, 0x22}, //и
{0x00, 0x2A, 0x22, 0x32, 0x2A, 0x26, 0x22, 0x22}, //й
{0x00, 0x22, 0x12, 0x0A, 0x06, 0x0A, 0x12, 0x22}, //к
{0x00, 0x3C, 0x28, 0x28, 0x28, 0x28, 0x2A, 0x24}, //л
{0x00, 0x22, 0x36, 0x2A, 0x22, 0x22, 0x22, 0x22}, //м
{0x00, 0x22, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x22}, //н
{0x00, 0x1C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C}, //o
{0x00, 0x3E, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22}, //п
{0x00, 0x1E, 0x22, 0x22, 0x1E, 0x02, 0x02, 0x02}, //p
{0x00, 0x1C, 0x22, 0x02, 0x02, 0x02, 0x22, 0x1C}, //c
{0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, //т
{0x00, 0x22, 0x22, 0x22, 0x3C, 0x20, 0x22, 0x1C}, //у
{0x00, 0x08, 0x1C, 0x2A, 0x2A, 0x2A, 0x1C, 0x08}, //ф
{0x00, 0x22, 0x14, 0x14, 0x08, 0x14, 0x14, 0x22}, //x
{0x00, 0x12, 0x12, 0x12, 0x12, 0x12, 0x3E, 0x20}, //ц
{0x00, 0x22, 0x22, 0x22, 0x3c, 0x20, 0x20, 0x20}, //ч
{0x00, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x3E}, //ш
{0x00, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x3E, 0x20}, //щ
{0x00, 0x06, 0x04, 0x04, 0x1C, 0x24, 0x24, 0x1C}, //ъ
{0x00, 0x22, 0x22, 0x22, 0x2E, 0x32, 0x32, 0x2E}, //ы
{0x00, 0x02, 0x02, 0x02, 0x0E, 0x12, 0x12, 0x0E}, //ь
{0x00, 0x1C, 0x22, 0x20, 0x3C, 0x20, 0x22, 0x1C}, //э
{0x00, 0x12, 0x2A, 0x2A, 0x2E, 0x2A, 0x2A, 0x12}, //ю
{0x00, 0x3C, 0x22, 0x22, 0x3C, 0x28, 0x24, 0x22}, //я 225
};
/* АЛЬТЕРНАТИВНЫЙ РУССКИЙ КАПС!!! Проверяйте =)
{0x7e,0x11,0x11,0x11,0x7e}, //A
{0x7f,0x49,0x49,0x49,0x33}, //Б
{0x7f,0x49,0x49,0x49,0x36}, //В
{0x7f,0x01,0x01,0x01,0x03}, //Г
{0xe0,0x51,0x4f,0x41,0xff}, //Д
{0x7f,0x49,0x49,0x49,0x41}, //E
{0x77,0x08,0x7f,0x08,0x77}, //Ж
{0x41,0x49,0x49,0x49,0x36}, //З
{0x7f,0x10,0x08,0x04,0x7f}, //И
{0x7c,0x21,0x12,0x09,0x7c}, //Й
{0x7f,0x08,0x14,0x22,0x41}, //K
{0x20,0x41,0x3f,0x01,0x7f}, //Л
{0x7f,0x02,0x0c,0x02,0x7f}, //M
{0x7f,0x08,0x08,0x08,0x7f}, //H
{0x3e,0x41,0x41,0x41,0x3e}, //O
{0x7f,0x01,0x01,0x01,0x7f}, //П
{0x7f,0x09,0x09,0x09,0x06}, //P
{0x3e,0x41,0x41,0x41,0x22}, //C
{0x01,0x01,0x7f,0x01,0x01}, //T
{0x47,0x28,0x10,0x08,0x07}, //У
{0x1c,0x22,0x7f,0x22,0x1c}, //Ф
{0x63,0x14,0x08,0x14,0x63}, //X
{0x7f,0x40,0x40,0x40,0xff}, //Ц
{0x07,0x08,0x08,0x08,0x7f}, //Ч
{0x7f,0x40,0x7f,0x40,0x7f}, //Ш
{0x7f,0x40,0x7f,0x40,0xff}, //Щ
{0x01,0x7f,0x48,0x48,0x30}, //Ъ
{0x7f,0x48,0x30,0x00,0x7f}, //Ы
{0x00,0x7f,0x48,0x48,0x30}, //Э
{0x22,0x41,0x49,0x49,0x3e}, //Ь
{0x7f,0x08,0x3e,0x41,0x3e}, //Ю
{0x46,0x29,0x19,0x09,0x7f}, //Я
*/
// интерпретатор кода символа по ASCII в его номер в массиве fontHEX
uint8_t getFont(uint8_t font, uint8_t row) {
font = font - '0' + 16; // перевод код символа из таблицы ASCII в номер согласно нумерации массива
if (font < 126) return pgm_read_byte(&(fontHEX[font][row])); // для английских букв и символов
else return pgm_read_byte(&(fontHEX[font - 65][row])); // для русских букв и символов (смещение -65 по массиву)
}
LedControl LC = LedControl(12, 11, 10, 1);
void setup() {
}
void loop() {
static uint8_t c=0;
for (uint8_t r=0; r<8; r++) LC.setRow(0, r, getFont((uint8_t)disp_text[c], r));
delay(500);
if (++c==disp_text.length()) c=0;
}