Добрый день!
Я новичок в программировании, решил сделать часы на кухню.
Приобрел матрице RGB 64x32; плату Arduino Mega 2560 R3; DS3231 RTC - часы реального времени , скачал проект из интернета: 64x32 RGB P4 Led matrix clock
Работает нормально, символы на английском языке показывает правильно.
решил русифицировать, но вот здесь проблема, не получается, пробовал по разному, менял кодировку, файл: glcdfont.c скачал из интернета в Adafruit_GFX_Library, пробовал вставить функцию: void utf8rus(). Но не знаю, как и куда ее вставить?
Вот скетч:
Помогите решить данную проблему,
За ранее благодарен.
С уважением,
Сергей Владимирович
Я новичок в программировании, решил сделать часы на кухню.
Приобрел матрице RGB 64x32; плату Arduino Mega 2560 R3; DS3231 RTC - часы реального времени , скачал проект из интернета: 64x32 RGB P4 Led matrix clock
Работает нормально, символы на английском языке показывает правильно.
решил русифицировать, но вот здесь проблема, не получается, пробовал по разному, менял кодировку, файл: glcdfont.c скачал из интернета в Adafruit_GFX_Library, пробовал вставить функцию: void utf8rus(). Но не знаю, как и куда ее вставить?
Вот скетч:
C++:
// 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"
"Янв", "Фев", "Мар", "Апр", "Май", "Июн",
"Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"
};
*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"
"Вс", "Пн", "Вт", "Ср",
"Чт", "Пт", "Сб"
};
*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;
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;
}
За ранее благодарен.
С уважением,
Сергей Владимирович