+2 голосов

Добрый день!

Я новичок в программировании, решил  сделать часы на кухню.

Приобрел матрице 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;
 }
 

скетч:

Помогите  решить данную проблему,

За ранее благодарен.

(4 баллов) 1 1 2
Перекомментировать пробовали или все равно не получается?
 static const char str[][4] PROGMEM =
  {
     "Jan", "Feb", "Mar", "Apr", "May", "Jun",
     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
    // "Янв", "Фев", "Мар", "Апр", "Май", "Июн",
    // "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"
И что именно не получается , код не компилируется или прошивка должным образом не работает?
Добрый день!
Пробовал  пере комментировать и все равно не получается. Когда стоят массивы с английскими символами, тогда часы работают нормально (рис.2), стоит поменять английские символы на кириллицу, произвести компиляцию, тогда часы работают как на (рис.3), т. е. выдает не понятные символы. Пробовал менять файл glcdfont.c в Adafruit-GFX для русификации библиотеки Adafruit-GFX и вывод русских букв на дисплей в кодировке UTF-8 из Arduino IDE, нашел в интернете, тоже самое. Я думаю, что что-то еще необходимо писать в скетче, чтобы выводились русские символы, а что, я не знаю, менял кодировку на восьмеричную и шестнадцатеричной системы счисления (они в данный момент за комментированы, также как и кирилличные символы), тоже самое, поэтому прошу помочь.
С уважением,
Сергей Владимирович

1 Ответ

0 голосов
  1. Можно попробовать , чтобы скетч был сам в кодировке utf-8.
  2. Не сувать utf8rus в пустые места, а сдедующим образом 
      sprintf(psz, "%02d%s%04d", RTC.dd, utf8rus( mon2str(RTC.mm, szBuf, sizeof(szBuf)-1)), RTC.yyyy);
    }
    

  3. Раскомментировать 

    // display.cp437(true);

  4. Повторить действия указанные здесь  по фаилу glcdfont.c.(скорее всего вам прейдётся подбирать из трёх вариантов )

(3.1 тыс. баллов) 14 20 41
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.

    За этот месяц ещё никого.

    ...