Добрый день!
Я новичок в программировании, решил сделать часы на кухню.
Приобрел матрице RGB 64x32; плату Arduino Mega 2560 R3; DS3231 RTC - часы реального времени , скачал проект из интернета: 64x32 RGB P4 Led matrix clock
Работает нормально, символы на английском языке показывает правильно.
Решил русифицировать, но вот здесь проблема, не получается, пробовал по разному, менял кодировку, файл: glcdfont.c скачал из интернета в Adafruit_GFX_Library, пробовал вставить функцию: void utf8rus().
// testshapes demo for RGBmatrixPanel library.
// демонстрация тестовых фигур для библиотеки RGBmatrixPanel.
// Demonstrates the drawing abilities of the RGBmatrixPanel library.
// Демонстрирует возможности рисования библиотеки RGBmatrixPanel.
// For 32x64 RGB LED matrix.
// Для светодиодной матрицы 32X64 RGB.
// WILL NOT FIT on ARDUINO UNO -- requires a Mega, M0 or M4 board
// Не поместится на ARDUINO UNO -- требуется плата Mega, M0 или M4
#include <Adafruit_GFX.h> // Core graphics library (Графическая библиотека ядра)
#include <RGBmatrixPanel.h> // Hardware-specific library (Аппаратно-зависимые библиотеки)
#include <MD_DS1307.h>
// #include <DS3231M.h>
#include <Wire.h>
#define CLK 11 // USE THIS ON ARDUINO MEGA (ИСПОЛЬЗУЙТЕ ЭТО НА ARDUINO MEGA)
#define OE 9
#define LAT 10
#define A A0
#define B A1
#define C A2
#define D A3
RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, false, 64);
// Global variables (Глобальная переменная)
#define MAX_MESG 4
#define MAX_MES 20
unsigned int NewRTCh = 24;
unsigned int NewRTCm = 60;
unsigned int NewRTCs = 60;
char szTime[12]; // mm:ss\0
char szMesg[MAX_MESG+1] = "";
char szDate[MAX_MES+1] = "";
// Вставил функцию utf8rus()
// void utf8rus()
// display.cp437(true);
char *mon2str(uint8_t mon, char *psz, uint8_t len)
// вставил utf8rus и выше строку за ремлил
// char *mon2str(utf8rus mon, char *psz, utf8rus len)
// Get a label from PROGMEM into a char array (Получить метку из PROGMEM в массив символов)
{
static const char str[][4] PROGMEM =
{
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
// "Янв", "Фев", "Мар", "Апр", "Май", "Июн",
// "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"
// Кодировка в восьмеричной системе исчисления месяцев
// "\320\257\320\275\320\262", "\320\244\320\265\320\262", "\320\234\320\260\321\200", "\320\220\320\277\321\200", "\320\234\320\260\320\271", "\320\230\321\216\320\275",
// "\320\230\321\216\320\273", "\320\220\320\262\320\263", "\320\241\320\265\320\275", "\320\236\320\272\321\202", "\320\235\320\276\321\217", "\320\224\320\265\320\272"
// Кодировка в шестнадцатеричной системе исчисления месяцев
// "0xD0, 0xAF, 0xD0, 0xBD, 0xD0, 0xB2", "0xD0, 0xA4, 0xD0, 0xB5, 0xD0, 0xB2", "0xD0, 0x9C, 0xD0, 0xB0, 0xD1, 0x80", "0xD0, 0x90, 0xD0, 0xBF, 0xD1, 0x80", "0xD0, 0x9C, 0xD0, 0xB0, 0xD0, 0xB9", "0xD0, 0x98, 0xD1, 0x8E, 0xD0, 0xBD",
// "0xD0, 0x98, 0xD1, 0x8E, 0xD0, 0xBB", "0xD0, 0x90, 0xD0, 0xB2, 0xD0, 0xB3", "0xD0, 0xA1, 0xD0, 0xB5, 0xD0, 0xBD", "0xD0, 0x9E, 0xD0, 0xBA, 0xD1, 0x82", "0xD0, 0x9D, 0xD0, 0xBE, 0xD1, 0x8F", "0xD0, 0x94, 0xD0, 0xB5, 0xD0, 0xBA"
};
*psz = '\0';
mon--;
if (mon < 12)
{
strncpy_P(psz, str[mon], len);
psz[len] = '\0';
}
return(psz);
}
char *dow2str(uint8_t code, char *psz, uint8_t len)
// вставил utf8rus и выше строку за ремлил
// char *dow2str(utf8rus code, char *psz, utf8rus len)
{
static const char str[][10] PROGMEM =
{
"Su", "Mo", "Tu", "We",
"Th", "Fr", "Sa"
// "Вс", "Пн", "Вт", "Ср",
// "Чт", "Пт", "Сб"
// Кодировка в восьмеричной системе исчисления дней недели
// "\320\222\321\201", "\320\237\320\275", "\320\222\321\202", "\320\241\321\200",
// "\320\247\321\202", "\320\237\321\202", "\320\241\320\261"
// Кодировка в шестнадцатеричной системе исчисления дней недели
// "0xD0, 0x92, 0xD1, 0x81", "0xD0, 0x9F, 0xD0, 0xBD", "0xD0, 0x92, 0xD1, 0x82", "0xD0, 0xA1, 0xD1, 0x80",
// "0xD0, 0xA7, 0xD1, 0x82", "0xD0, 0x9F, 0xD1, 0x82", "0xD0, 0xA1, 0xD0, 0xB1"
};
*psz = '\0';
code--;
if (code < 7)
{
strncpy_P(psz, str[code], len);
psz[len] = '\0';
}
return(psz);
}
void getTime(char *psz, bool f = true)
// Code for reading clock time
// Код для считывания часового времени
{
RTC.readTime();
if (NewRTCh != RTC.h)
{
sprintf(psz, "%02d", RTC.h);
matrix.setCursor(2, 4);
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color333(7, 0, 7));
matrix.fillRect(2, 4, 64, 14, matrix.Color333(0, 0, 0));
matrix.print(szTime);
sprintf(psz, "%02d", RTC.m);
matrix.setCursor(28, 4);
matrix.setTextColor(matrix.Color333(7, 0, 7));
matrix.fillRect(25, 4, 25, 14, matrix.Color333(0, 0, 0));
matrix.print(szTime);
matrix.setCursor(21, 4);
matrix.setTextColor(matrix.Color333(7, 0, 0));
matrix.fillRect(25, 8, 2, 6, matrix.Color333(0, 0, 0));
matrix.print(f ? ':' : ' ');
matrix.setCursor(52, 9);
matrix.setTextSize(1);
matrix.setTextColor(matrix.Color333(7, 7, 0));
matrix.fillRect(52, 9, 11, 7, matrix.Color333(0, 0, 0));
sprintf(psz, "%02d", RTC.s);
matrix.print(szTime);
getDate(szDate);
matrix.setCursor(5, 20);
matrix.fillRect(5, 20, 54, 8, matrix.Color333(0, 0, 0));
uint8_t y = 0;
// вставил utf8rus и выше строку за ремлил
// utf8rus y = 0;
for (y=0; y<10; y++) {
matrix.setTextColor(Wheel(y));
matrix.print(szDate[y]);
}
getDay(szMesg);
matrix.setTextSize(1);
matrix.setCursor(52, 1);
matrix.setTextColor(matrix.Color333(0, 7, 0));
matrix.fillRect(52, 1, 11, 7, matrix.Color333(0, 0, 0));
matrix.print(szMesg);
NewRTCh=RTC.h;
}
else if (NewRTCm != RTC.m)
{
sprintf(psz, "%02d", RTC.m);
matrix.setCursor(28, 4);
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color333(7, 0, 7));
matrix.fillRect(25, 4, 25, 14, matrix.Color333(0, 0, 0));
matrix.print(szTime);
matrix.setCursor(21, 4);
matrix.setTextColor(matrix.Color333(0, 0, 7));
matrix.fillRect(25, 8, 2, 6, matrix.Color333(0, 0, 0));
matrix.print(f ? ':' : ' ');
matrix.setCursor(52, 9);
matrix.setTextSize(1);
matrix.setTextColor(matrix.Color333(0, 7, 7));
sprintf(psz, "%02d", RTC.s);
matrix.fillRect(52, 9, 11, 7, matrix.Color333(0, 0, 0));
matrix.print(szTime);
NewRTCm=RTC.m;
}
else if (NewRTCs != RTC.s/10)
{
matrix.setCursor(21, 4);
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color333(0, 7, 0));
matrix.fillRect(25, 8, 2, 6, matrix.Color333(0, 0, 0));
matrix.print(f ? ':' : ' ');
matrix.setCursor(52, 9);
matrix.setTextSize(1);
matrix.setTextColor(matrix.Color333(0, 0, 7));
sprintf(psz, "%02d", RTC.s);
matrix.fillRect(52, 9, 11, 7, matrix.Color333(0, 0, 0));
matrix.print(szTime);
NewRTCs=RTC.s/10;
}
else
{
matrix.setCursor(21, 4);
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color333(0, 0, 7));
matrix.fillRect(25, 8, 2, 6, matrix.Color333(0, 0, 0));
matrix.print(f ? ':' : ' ');
matrix.setCursor(52, 9);
matrix.setTextSize(1);
matrix.setTextColor(matrix.Color333(7, 0, 0));
sprintf(psz, "%02d", RTC.s);
matrix.fillRect(58, 9, 5, 7, matrix.Color333(0, 0, 0));
matrix.print(szTime);
}
}
void getDate(char *psz)
// Code for reading date (Код для считывания данных)
{
char szBuf[10];
sprintf(psz, "%02d%s%04d", RTC.dd, mon2str(RTC.mm, szBuf, sizeof(szBuf)-1), RTC.yyyy);
}
void getDay(char *psz)
// Code for reading day date (Код для чтения даты Дня)
{
dow2str(RTC.dow, szMesg, MAX_MESG);
}
void setup() {
matrix.begin();
matrix.setTextWrap(false);
RTC.control(DS1307_CLOCK_HALT, DS1307_OFF);
RTC.control(DS1307_12H, DS1307_OFF);
// RTC.control(DS3231_CLOCK_HALT, DS3231_OFF);
// RTC.control(DS3231_12H, DS3231_OFF);
}
void loop() {
static uint32_t lastime = 0; // millis() memory (память millis())
static bool flasher = false; // seconds passing flasher (секунды, проходящие мигалка)
if (millis() - lastime >= 1000)
{
lastime = millis();
getTime(szTime, flasher);
flasher = !flasher;
}
}
// Input a value 0 to 24 to get a color value. (Введите значение от 0 до 24, чтобы получить значение цвета.)
// The colours are a transition r - g - b - back to r. (Цвета-это переход rgb-назад к реальности.)
uint16_t Wheel(byte WheelPos) {
if(WheelPos < 2) {
return matrix.Color333(0, 7, 0);
} else if(WheelPos < 5) {
WheelPos -= 2;
return matrix.Color333(7 , 0, 0);
} else {
WheelPos -= 5;
return matrix.Color333(0, 7, 0);
}
}
// Вставил функцию utf8rus()
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;
}
скетч:
Помогите решить данную проблему,
За ранее благодарен.