Обьявление переменных типа String мешают работать OLED1306 с библиотекой Adafruit_SSD1306

swiezdo
Offline
Зарегистрирован: 16.05.2020

Вечер в хату дамы и господа, дело такое, делаю один проект где присутствует экран 128х64.

По сути, проект закончен, только вот библиотеку для дисплея я выбрал мягко говоря не ту, без графических приблуд (битмэпы там, линии и прочее), а хотелось бы.

Решил перекрасить всё с другой библиотекой Adafruit SSD1306, и тут же столкнулся с такой проблемой:

Надо обьявить 6 глобальных переменных типа String, объявляю, загружаю скетч, всё в норме и без ошибок, только вот на экране ничего не отображается.

Теперь самое интересное, если я объявляю только 4 строки, то всё норм.

При загрузке скетча примерно ~50% динамики  и ~30% глобальные переменные занимают.

По ходу скетча строкам ничего и нигде не присваеватся, за*упа пока ещё даже на стадии объявления.

Зато вот если объявить массив типа чар то все ок, только вот по ходу дела мне нужно с этими строками кучу операций провести, а абсолютно весь код переписывать ой как не хочется.

Может кто-то сталкивался с такой проблемой или знает как её можно решить? 

swiezdo
Offline
Зарегистрирован: 16.05.2020

Чёрт, дико извиняюсь, только что понял в чем проблема, у меня в цикле куча методов с выводом аля: lcd.print(utf8rus("тратата"));

Вывод русифицированный, через функцию:

char *utf8rus(char *source)
{
  int i, j, k;
  unsigned char n;
  char m[2] = { '0', '\0' };
 
  strcpy(target, ""); k = strlen(source); i = j = 0;
 
  while (i < k) {
    n = source[i]; i++;
 
    if (n >= 0xBF) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB7;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
            break;
          }
      }
    }
 
    m[0] = n; strcat(target, m);
    j++; if (j >= MAX_STRING) break;
  }
  return target;
}
 
Я убрал эту приблуду, объявил строки и вуаля, всё работает, видимо эта вся жара дико нагружает память и что-то крашится, только вот теперь надо понять как мне русский шрифт организовать