Использование сторонних шрифтов

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Помогите, плиз, новичку в програмировании. Как подключить сторонний шрифт знаю, подцепил к скетчу, пытаюсь использовать так:

  tft.setFont(DotMatrix_M);

Библиотека SWTFT ругается и говорит "не помню такой команды". Что посоветуете?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

есть в начале #include <Adafruit_GFX.h>?

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Да, эта библиотека подключается автоматически вместе с SWTFT. Может попробовать другую версию этой библиотеки?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Насчёт автоматически не знаю, но пока не пропишу два инклуда GFX и SWTFT не пашет

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Adafruit_mfGFX надо такую именно мультифонт которая

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Сейчас поищу в инете, опробую.

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Скачал, установил, всё-равно ругается.

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Больше ни кто ни чего не посоветует?

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Знатоки, помогите...

axill
Offline
Зарегистрирован: 05.09.2011

Закопипасте сюда сообщение об ошибке без самодеятельности, в вашем пересказе можно только гадать о том какая у вас проблема

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Пишет так:

'class SWTFT' has no member named 'setFont'
Menu_TFT.ino: In function 'void setup()':
Menu_TFT:50: error: 'class SWTFT' has no member named 'setFont'

 

 

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Вот собственно скетч:

#include <Adafruit_GFX.h>
#include <mega_24_shield.h>
#include <SWTFT.h>

extern uint8_t DotMatrix_M[];

//Подключаю стандартные цвета
#define	BLACK   0x0000
#define	BLUE    0x001F
#define	RED     0xF800
#define	GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

//Инициализация LCD
SWTFT tft;

 //Подключение кнопок
 int lcd_key     = 0;
 int adc_key_in  = 0;
 #define btnRIGHT  0
 #define btnUP     1
 #define btnDOWN   2
 #define btnLEFT   3
 #define btnSELECT 4
 #define btnNONE   5
 
 int read_LCD_buttons()
   {  
 adc_key_in = analogRead(0);// Читаем что на кнопках 

 if(adc_key_in > 1000) return btnNONE; // Что выдают мои кнопки
 if adc_key in < 30)  return btnRIGHT;  
 if(adc_key_in < 150) return btnUP; 
 if(adc_key_in < 370) return btnDOWN; 
 if(adc_key_in < 550) return btnLEFT; 
 if(adc_key_in < 820) return btnSELECT;  

 return btnNONE;  
 }

 void setup(void){
  tft.reset();
  tft.begin();
  tft.fillScreen(BLACK);
  tft.setCursor(20,20);
  tft.setTextColor(WHITE);  
  tft.setFont(DotMatrix_M);
  tft.println("Menu:");
  tft.setTextSize(3);
  tft.setCursor(20,80);
  tft.println("Oscilloscop");
  tft.setCursor(20,110);
  tft.println("Temperatura");
  tft.setCursor(20,140);
  tft.println("Times");
}  

void loop(void){
}
nevkon
Offline
Зарегистрирован: 20.01.2015

По моему вполне четко компилятор указывает что в SWTFT нет функции/процедуры/команды setFont.

Проверьте документацию на библиотеку или посмотрите исходники. Очень может быть что ошиблись регистром/структурой при написании команды.

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Оно понятно, что нет в библиотеке SWTFT "void setFont()". Это единственная библиотека, работающая с драйвером моего дисплея. От-того и вопрос: "прикрутить" данную библиотеку к "UTFT", или как-то в самой SWTFT сделать процедуру подключения сторонних шрифтов.

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

"Выдрал" void setFont() с библиотеки UTFT, прописал соответственно вместо UTFT SWTFT, прописал её в SWTFT.h, компилирую, шибко ругается. Переименовал её в библиотеке void setFont8() - ошибка как и в первом посту: 'class SWTFT' has no member named 'setFont'.

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

А вот так ругается, когда в имени нет восьмерки:

D:\Arduino\arduino-1.0.6\libraries\SWTFT\SWTFT.cpp: In member function 'void SWTFT::setFont8(uint8_t*)':
D:\Arduino\arduino-1.0.6\libraries\SWTFT\SWTFT.cpp:702: error: 'cfont' was not declared in this scope
D:\Arduino\arduino-1.0.6\libraries\SWTFT\SWTFT.cpp:703: error: 'fontbyte' was not declared in this scope
D:\Arduino\arduino-1.0.6\libraries\SWTFT\SWTFT.cpp: At global scope:
D:\Arduino\arduino-1.0.6\libraries\SWTFT\SWTFT.cpp:709: error: no 'uint8_t* SWTFT::getFont()' member function declared in class 'SWTFT'
D:\Arduino\arduino-1.0.6\libraries\SWTFT\SWTFT.cpp:714: error: no 'uint8_t SWTFT::getFontXsize()' member function declared in class 'SWTFT'
D:\Arduino\arduino-1.0.6\libraries\SWTFT\SWTFT.cpp:719: error: no 'uint8_t SWTFT::getFontYsize()' member function declared in class 'SWTFT'
 
nevkon
Offline
Зарегистрирован: 20.01.2015

Похоже проще перенести из SWTFT в UTFT драйвер инициализации дисплея чем фукцию. У вас затребовали еще 2 переменных и 3 функции добавить.

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Каким образом это сделать? Я в языке С как свинья в апельсинах. Пробовал свои силы в Delphi 7, написал пару программ для работы, но Си для меня вооще "темный лес" только начал осваивать. Есть даже компилятор на Delphi для програмирования контроллеров, но и там синтаксис другой. Более упрощённый, что-ли. Помогите если не сложно...

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Не кому помочь моему "горю"?

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Вспомнился прочитанный где-то анекдот про форумы:

           Американский форум: задаёшь вопрос, в ответ: Расскажут, покажут, объяснят, научат...

           Еврейский форум: задаёшь вопрос, в ответ: "А шо это? "А зачем Вам это надо?"

           Русский форум: задаёшь вопрос, в ответ: "Дурак, зачем лезешь туда, где ни чего не понимаешь", "Найди ошибку сам"...

Действительно, а для чего форум? 

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

За крывайте тему.

vitalikost
Offline
Зарегистрирован: 28.11.2014

Немного порискав по библиотеке "Adafruit_GFX" я тоже не нашол "setFont". Только стандартный шрифт. :(

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

vitalikost пишет:

Немного порискав по библиотеке "Adafruit_GFX" я тоже не нашол "setFont". Только стандартный шрифт. :(

В этой библиотеке как-раз и есть "setFont", но всё разруливает, как я понял "SWTFT". Дудка и выдаёт ошибку, что в классе "SWTFT" нет функции "setFont"...

vitalikost
Offline
Зарегистрирован: 28.11.2014

Я лично нашол вот такие только:

    setCursor(int16_t x, int16_t y),
    setTextColor(uint16_t c),
    setTextColor(uint16_t c, uint16_t bg),
    setTextSize(uint8_t s),
    setTextWrap(boolean w),
    setRotation(uint8_t r);

В UTFT.h дествительно есть данный метод:

void setFont(uint8_t* font);
uint8_t* getFont();
uint8_t getFontXsize();
uint8_t getFontYsize();
 

Думаю все намного проще, в библиотеке "Adafruit_GFX.h" есть файл "glcdfont.c" - вот здесь шрифт и его форма, если немного подправить файл, то можно и другую форму задать шрифту. 

 

vitalikost
Offline
Зарегистрирован: 28.11.2014

Вот еще что-то нарыл, зараз нету особо времени копать, ну направление думаю указал 

http://mcuguru.ru/2013/03/utft-rus-1/

http://www.rinkydinkelectronics.com/r_fonts.php

vitalikost
Offline
Зарегистрирован: 28.11.2014

так же немного поколупал форум нашол как можно изменить текущий шрифт. 

http://arduino.ru/forum/obshchii/russkie-simvoly-lcd-5110#comment-84215

http://arduino.ru/forum/obshchii/russkie-simvoly-lcd-5110#comment-84255

 

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

vitalikost, спасибо за отклик. Но теперь я ещё больше ни чего не понимаю. Эти статьи и форум я читал. Сейчас провёл несколько экспериментов. Удалил из библиотеки "Adafruit_GFX.h" файл "glcdfont.c", всё-равно шрифт рисуется. Подставил файл "glcdfont_rus.c", появился русский шрифт, но всё такой-же убогий(как я понял, шрифт 5х7, для размера 1, 2 ещё пойдёт. А если брать больший размер - то это ужас). Так вот. Заменил "glcdfont_rus.c" на родной шрифт библиотеки. Русские символы всё-равно остались. Как так ?

Вот чего не могу понять. Удаляю файл шрифта - работает. Копирую другой шрифт - всё по прежнему...

vitalikost
Offline
Зарегистрирован: 28.11.2014

Немного поколупал библиотеку  "Adafruit_GFX.h" , нашел где нужно править, чтобы построить другой шрифт:

//Высота шрифта - 8, Ширина - 5+1 отступ. 

#if ARDUINO >= 100
size_t Adafruit_GFX::write(uint8_t c) {
#else
void Adafruit_GFX::write(uint8_t c) {
#endif
  if (c == '\n') {
    cursor_y += textsize*8;
    cursor_x  = 0;
  } else if (c == '\r') {
    // skip em
  } else {
    drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);
    cursor_x += textsize*6;
    if (wrap && (cursor_x > (_width - textsize*6))) {
      cursor_y += textsize*8;
      cursor_x = 0;
    }
  }
#if ARDUINO >= 100
  return 1;
#endif
}

// Draw a character
void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c,
			    uint16_t color, uint16_t bg, uint8_t size) {

  if((x >= _width)            || // Clip right
     (y >= _height)           || // Clip bottom
     ((x + 6 * size - 1) < 0) || // Clip left
     ((y + 8 * size - 1) < 0))   // Clip top
    return;

  for (int8_t i=0; i<6; i++ ) {
    uint8_t line;
    if (i == 5)
      line = 0x0;
    else
      line = pgm_read_byte(font+(c*5)+i);
    for (int8_t j = 0; j<8; j++) {
      if (line & 0x1) {
        if (size == 1) // default size
          drawPixel(x+i, y+j, color);
        else {  // big size
          fillRect(x+(i*size), y+(j*size), size, size, color);
        }
      } else if (bg != color) {
        if (size == 1) // default size
          drawPixel(x+i, y+j, bg);
        else {  // big size
          fillRect(x+i*size, y+j*size, size, size, bg);
        }
      }
      line >>= 1;
    }
  }
}

таким способом вставить шрифт 16Х16 из  http://www.rinkydinkelectronics.com/r_fonts.php  запихнуть в "glcdfont_rus.c" - немного его под редактировав. заменить 8 и 6(5) на 16 и 17(16). в коде указанном выше. И все должно завестись. Ну это так теория. Которую еще нужно проверить.

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Сейчас осмыслю и буду пробовать...

vitalikost
Offline
Зарегистрирован: 28.11.2014

Попытался прикрутить, фиг вам.... Почал дальше смотреть, и тут полный писец... В библиотеке "Adafruit_GFX.h" вывод по столбцам, а в «UTFT.h» шрифты закодированы в строках, тоесть вывод построчно. Так что надо будет функцию «drawChar»  переписать полностью. 

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

  Есть такая библиотека "Adafruit_mfGFX" которая предусматривает работу с 8 шрифтами(идут вместе с библиотекой). Но она довольно спецефична, написана для работы с монохромным дисплеем "Sharp". Так в ней как раз функция «drawChar» и написана для работы с этими шрифтами. Пробовал "подменить" в "Adafruit_GFX.cpp" на "Adafruit_mfGFX.cpp", соответственно изменив имя, и добавив эти шрифты, компилятор ругается на последнюю строку в "Adafruit_GFX.h":

const FontDescriptor* fontDesc;

Не "нравится" ему звездочка и что константа без названия типа. А какой тип? Для меня - тупик...

vitalikost
Offline
Зарегистрирован: 28.11.2014

Направление понял, завтра постраюсь посмотреть. Ну на крайний случай с вторника. попробуем целиком подменить ""Adafruit_GFX"" на "Adafruit_mfGFX.cpp", посмотри что получиться. 

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

  Я, как раз, целиком и менял и .h файл и .cpp файл, не забыв конечно, поменять имена и убрав лишние #define.

vitalikost
Offline
Зарегистрирован: 28.11.2014

Собрал, даже работает графика. Ну текст не выводит. 

https://yadi.sk/d/XVLgae33f5REp

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

  Ссылка "битая", не могу открыть...

vitalikost
Offline
Зарегистрирован: 28.11.2014
Dmn
Dmn аватар
Offline
Зарегистрирован: 29.11.2015

Порешали вопрос со шрифтами?

inkvi777
Offline
Зарегистрирован: 17.01.2016

Шрифт меняется. На латинице получилось по крайней мере. попробуй как указано в мануале на 20 странице 

https://learn.adafruit.com/downloads/pdf/adafruit-gfx-graphics-library.pdf

sav liana
Offline
Зарегистрирован: 28.11.2016

Как я понял, вопрос остается открытым...

Есть ресурс: , но как им воспользоваться... скачал file.c типа например arial_bold.c

Как бы все расписано, но что с этим делать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

"Что делать" определяется тем, что именно Вам нужно.

Если Вы не знаете, что делать со скачанным файлом, закачайте его обратно.

sav liana
Offline
Зарегистрирован: 28.11.2016

?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Ничего не понял из вышеизложенного, к сожалению.

Могу только сказать что-таки - да: в "Adafruit" дела со шрифтами обстоят не лучшим образом и настолько, что пришлось даже купить другой дисплей, который работает под UTFT и со шрифтами там всё на порядок проще, что даже я кое-как разобрался.

Насчёт "прикрутить шрифт".

Не далее как сегодня вдруг возникла необходимость выводить некоторые значения более удобочитаемым шрифтом. Понятное дело что разговор идёт о совершенно другой библиотеке, да еще и под рукой нет ни IDE ни плат, но все же.

В "UTFT" внешние шрифты подключаются вот так:

extern uint8_t BigFont[];

где "BigFont[]" это файл "BigFont.c", который я, кстати, так нигде и не нашёл почему-то. Ну а что бы подключить любой другой шрифт, достаточно скачать соответствующий файл шрифтов с расширением ".c", положить его в папку со скетчем и потом вызывать с помощью того же "setFont". Во всяком случае у меня этот метод работает...

Но я сейчас не об этом. Интересно вот что: во это "extern uint8_t" (приминительно к шрифтам) работает только для UTFT или для Adafruit тоже?

brigadir218
Offline
Зарегистрирован: 27.02.2022

привет, может кто поможет в вопросе? При установке сторонних шрифтов ,а именно при использовании цифр, когда меняются показания, то на экране начинается каша. старые показания не затираются. много читал старался где то найти информацию, но увы и ах , ничего про это нигде не сказано. изучал разные скетчи, подозреваю, что нужна какая то функция в скетче, но пока так и не нашел решение. Может кто подскажет где капать?