Русификация проекта RGB Led Matrix Clock With Arduino

serg1954

✩✩✩✩✩✩✩
16 Фев 2020
8
0
Добрый день!
Я новичок в программировании, решил сделать часы на кухню.
Приобрел матрице RGB 64x32; плату Arduino Mega 2560 R3; DS3231 RTC - часы реального времени , скачал проект из интернета: 64x32 RGB P4 Led matrix clock
1581862181596.png
Работает нормально, символы на английском языке показывает правильно.
1581862210434.png
решил русифицировать, но вот здесь проблема, не получается, пробовал по разному, менял кодировку, файл: glcdfont.c скачал из интернета в Adafruit_GFX_Library, пробовал вставить функцию: void utf8rus(). Но не знаю, как и куда ее вставить?
1581862262103.png
Вот скетч:

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;
 }
Помогите решить данную проблему,
За ранее благодарен.

С уважением,
Сергей Владимирович
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Мне интерфейс не понравился, что то есть сильно удобнее, но я могу и в блокноте писать по большому счету ) Я поковырял немного, ну не зашло
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
Мне интерфейс не понравился, что то есть сильно удобнее, но я могу и в блокноте писать по большому счету ) Я поковырял немного, ну не зашло
Мне в нём нравится что не нужно запоминать функции. Начал писать что помнишь, он тебе предлагает варианты.
Я на него перешёл после MPLAB X, а система эта очень мощная. И убожество Arduino IDE меня начало очень стебать. Я нашёл у Гайвера заметку о PlatformIO, попробовал. Понравилось. Теперь её использую что бы накидать что то по быстрому. Но так как сами ATMELы меня мало интересуют, стал под ним программировать STM32. Но что то более серьёзное под них пишу в Atollic.
 

serg1954

✩✩✩✩✩✩✩
16 Фев 2020
8
0
@Эдуард Анисимов,

Добрый день, Эдуард!
Большое спасибо, что откликнулись на мою просьбу о помощи в данном вопросе. В такие дни нет возможности попробовать, а в выходные попробую. Я уже вставлял в скетч:
  • функцию перекодировки русских букв из UTF-8 в Win-1251;
  • display.cp437(true);

  • При вставке: display.cp437(true); не компилируется и выскакивает ошибка, точно не помню, какая, потом посмотрю. Скачивал файл glcdfont.c и менял его в библиотеке Adafruit-GFX.
  • Может быть я их не туда куда следует вставлял?
  • Скетч я выложил, если не трудно, посмотрите, где ошибка?
  • И еще, у меня стоит arduino-1.8.11 Hourly Build, не может быть тут загвоздка?
  • И еще, можно ли у Вас в дальнейшем получить консультацию, по данному и другим вопросам.

  • С уважением,
  • Сергей Владимирович
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
И еще, можно ли у Вас в дальнейшем получить консультацию, по данному и другим вопросам
ВСё зависит от Вашей обучаемости.

У Вас объявлен дисплей так RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, false, 64);
поэтому данная строка будет выглядеть так matrix.cp437(true); стоять она должна в функции setup() после строк

matrix.begin();
matrix.setTextWrap(false);
 
Изменено:

serg1954

✩✩✩✩✩✩✩
16 Фев 2020
8
0
@Эдуард Анисимов,

Добрый день, Эдуард!
Большое спасибо что откликнулись на мою просьбу.
Скачал Ваши вложения, которые Вы мне выложили, заменил файл:
glcdfont.c в Adafruit-GFX;
добавил функцию utf8rus() в скетч;
  • вставил в начале скетча команду: matrix.cp437(true); после строк
    matrix.begin();
    matrix.setTextWrap(false);
функцию utf8rus() применил внутри команд печати строк:
  • matrix.println(utf8rus("Тест"));
Взял скетч printString.ino вывода текста с сайта: http://wiki.amperka.ru/projects:rgb-led-matrix-arduino. При выводе первой строки в данном скетче, где использовалась функция matrix.println(utf8rus("Тест")); текст выводится на русском языке.
А вот, при выводе второй строки там, где используется символьный тип данных char
Вот часть скетча:
// выводимая вторая строка
// char strText[] = "LED MATRIX!";
char strText[] = "СВЕ МАТРИЦА";
// перебираем по очереди каждый символ
for (int i = 0; i < strlen(strText); i++) {
// генерируем случайное число от 0 до 1536
int hue = random(0, 1536);
1582374169454.png
При установке скетча: RGB_Led_Matrix_Clock_With_Arduino_Mega2560
Происходит тоже самое, т. к. там также используется символьный тип данных char и еще двоеточие, межу часами и минутами увеличено в 2 раза, т. е. вместо 2x2px - 4x4px и мигает верхняя точка, при этом меняется с 4x4px в 4x2px, мне кажется что это не соответствуют размеры символов в glcdfont.c, но может быть я ошибаюсь.
1582374223770.png
1582374267461.png
Прошу Вас, если есть такая возможность, дать консультацию по устранению этого?

С уважением,
Сергей Владимирович
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
Сегодня посмотреть не смогу. Завтра гляну.

Хотя есть очень простое решение с русификацией, которое решит эту проблему навечно.
Можно перейти под PlatformIO. Там русификация будет заключаться только в замене файла со шрифтами.
В нём можно компилить файлы ардуины.

Установить его могу помочь.
 
Изменено:

serg1954

✩✩✩✩✩✩✩
16 Фев 2020
8
0
@Эдуард Анисимов,

Добрый день, Эдуард!

Поздравляю Вас с днем защитника отечества!

Высылаю Вам файлы скетчей к картинкам
Картинка №1 – файл: printString;
Картинка №№ 2;3 – файл: RGB_Led_Matrix_Clock_With_Arduino_Mega2560

С уважением,
Сергей Владимирович

P. S.
Скачал PlatformIO. Сейчас буду производить установку и настройку, необходимо еще изучить.
 

Вложения

Изменено:

uuu000

✩✩✩✩✩✩✩
27 Мар 2021
6
1
serg 1954 -Можно получить схему соединений всех модулей. Я не нашел ее в интернете.
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
я только начал изучать программирование, правда для АВР
"программирование для АВР" и "программирование ардуино" отличается крайне мало. В основе - один и тот же язык Си/С++. А ардуино - не более чем набор библиотек.

Насчет времени хотел посоветовать заглянуть в исходных код библиотеки RTC - а вы и сами справились.