Использование сторонних шрифтов
- Войдите на сайт для отправки комментариев
Пнд, 23/02/2015 - 10:04
Помогите, плиз, новичку в програмировании. Как подключить сторонний шрифт знаю, подцепил к скетчу, пытаюсь использовать так:
tft.setFont(DotMatrix_M);
Библиотека SWTFT ругается и говорит "не помню такой команды". Что посоветуете?
есть в начале #include <Adafruit_GFX.h>?
Да, эта библиотека подключается автоматически вместе с SWTFT. Может попробовать другую версию этой библиотеки?
Насчёт автоматически не знаю, но пока не пропишу два инклуда GFX и SWTFT не пашет
Adafruit_mfGFX надо такую именно мультифонт которая
Сейчас поищу в инете, опробую.
Скачал, установил, всё-равно ругается.
Больше ни кто ни чего не посоветует?
Знатоки, помогите...
Закопипасте сюда сообщение об ошибке без самодеятельности, в вашем пересказе можно только гадать о том какая у вас проблема
Пишет так:
Вот собственно скетч:
#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){ }По моему вполне четко компилятор указывает что в SWTFT нет функции/процедуры/команды setFont.
Проверьте документацию на библиотеку или посмотрите исходники. Очень может быть что ошиблись регистром/структурой при написании команды.
Оно понятно, что нет в библиотеке SWTFT "void setFont()". Это единственная библиотека, работающая с драйвером моего дисплея. От-того и вопрос: "прикрутить" данную библиотеку к "UTFT", или как-то в самой SWTFT сделать процедуру подключения сторонних шрифтов.
"Выдрал" void setFont() с библиотеки UTFT, прописал соответственно вместо UTFT SWTFT, прописал её в SWTFT.h, компилирую, шибко ругается. Переименовал её в библиотеке void setFont8() - ошибка как и в первом посту:
'class SWTFT'has no member named'setFont'.А вот так ругается, когда в имени нет восьмерки:
Похоже проще перенести из SWTFT в UTFT драйвер инициализации дисплея чем фукцию. У вас затребовали еще 2 переменных и 3 функции добавить.
Каким образом это сделать? Я в языке С как свинья в апельсинах. Пробовал свои силы в Delphi 7, написал пару программ для работы, но Си для меня вооще "темный лес" только начал осваивать. Есть даже компилятор на Delphi для програмирования контроллеров, но и там синтаксис другой. Более упрощённый, что-ли. Помогите если не сложно...
Не кому помочь моему "горю"?
Вспомнился прочитанный где-то анекдот про форумы:
Американский форум: задаёшь вопрос, в ответ: Расскажут, покажут, объяснят, научат...
Еврейский форум: задаёшь вопрос, в ответ: "А шо это? "А зачем Вам это надо?"
Русский форум: задаёшь вопрос, в ответ: "Дурак, зачем лезешь туда, где ни чего не понимаешь", "Найди ошибку сам"...
Действительно, а для чего форум?
За крывайте тему.
Немного порискав по библиотеке "Adafruit_GFX" я тоже не нашол "setFont". Только стандартный шрифт. :(
Немного порискав по библиотеке "Adafruit_GFX" я тоже не нашол "setFont". Только стандартный шрифт. :(
В этой библиотеке как-раз и есть "setFont", но всё разруливает, как я понял "SWTFT". Дудка и выдаёт ошибку, что в классе "SWTFT" нет функции "setFont"...
Я лично нашол вот такие только:
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 дествительно есть данный метод:
Думаю все намного проще, в библиотеке "Adafruit_GFX.h" есть файл "glcdfont.c" - вот здесь шрифт и его форма, если немного подправить файл, то можно и другую форму задать шрифту.
Вот еще что-то нарыл, зараз нету особо времени копать, ну направление думаю указал
http://mcuguru.ru/2013/03/utft-rus-1/
http://www.rinkydinkelectronics.com/r_fonts.php
так же немного поколупал форум нашол как можно изменить текущий шрифт.
http://arduino.ru/forum/obshchii/russkie-simvoly-lcd-5110#comment-84215
http://arduino.ru/forum/obshchii/russkie-simvoly-lcd-5110#comment-84255
vitalikost, спасибо за отклик. Но теперь я ещё больше ни чего не понимаю. Эти статьи и форум я читал. Сейчас провёл несколько экспериментов. Удалил из библиотеки "Adafruit_GFX.h" файл "glcdfont.c", всё-равно шрифт рисуется. Подставил файл "glcdfont_rus.c", появился русский шрифт, но всё такой-же убогий(как я понял, шрифт 5х7, для размера 1, 2 ещё пойдёт. А если брать больший размер - то это ужас). Так вот. Заменил "glcdfont_rus.c" на родной шрифт библиотеки. Русские символы всё-равно остались. Как так ?
Вот чего не могу понять. Удаляю файл шрифта - работает. Копирую другой шрифт - всё по прежнему...
Немного поколупал библиотеку "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). в коде указанном выше. И все должно завестись. Ну это так теория. Которую еще нужно проверить.
Сейчас осмыслю и буду пробовать...
Попытался прикрутить, фиг вам.... Почал дальше смотреть, и тут полный писец... В библиотеке "Adafruit_GFX.h" вывод по столбцам, а в «UTFT.h» шрифты закодированы в строках, тоесть вывод построчно. Так что надо будет функцию «drawChar» переписать полностью.
Есть такая библиотека "Adafruit_mfGFX" которая предусматривает работу с 8 шрифтами(идут вместе с библиотекой). Но она довольно спецефична, написана для работы с монохромным дисплеем "Sharp". Так в ней как раз функция «drawChar» и написана для работы с этими шрифтами. Пробовал "подменить" в "Adafruit_GFX.cpp" на "Adafruit_mfGFX.cpp", соответственно изменив имя, и добавив эти шрифты, компилятор ругается на последнюю строку в "Adafruit_GFX.h":
Не "нравится" ему звездочка и что константа без названия типа. А какой тип? Для меня - тупик...
Направление понял, завтра постраюсь посмотреть. Ну на крайний случай с вторника. попробуем целиком подменить ""Adafruit_GFX"" на "Adafruit_mfGFX.cpp", посмотри что получиться.
Я, как раз, целиком и менял и .h файл и .cpp файл, не забыв конечно, поменять имена и убрав лишние #define.
Собрал, даже работает графика. Ну текст не выводит.
https://yadi.sk/d/XVLgae33f5REp
Ссылка "битая", не могу открыть...
https://yadi.sk/d/RNdgTlOef5TkY
Порешали вопрос со шрифтами?
Шрифт меняется. На латинице получилось по крайней мере. попробуй как указано в мануале на 20 странице
https://learn.adafruit.com/downloads/pdf/adafruit-gfx-graphics-library.pdf
Как я понял, вопрос остается открытым...
Есть ресурс: , но как им воспользоваться... скачал file.c типа например arial_bold.c
Как бы все расписано, но что с этим делать?
"Что делать" определяется тем, что именно Вам нужно.
Если Вы не знаете, что делать со скачанным файлом, закачайте его обратно.
?
Ничего не понял из вышеизложенного, к сожалению.
Могу только сказать что-таки - да: в "Adafruit" дела со шрифтами обстоят не лучшим образом и настолько, что пришлось даже купить другой дисплей, который работает под UTFT и со шрифтами там всё на порядок проще, что даже я кое-как разобрался.
Насчёт "прикрутить шрифт".
Не далее как сегодня вдруг возникла необходимость выводить некоторые значения более удобочитаемым шрифтом. Понятное дело что разговор идёт о совершенно другой библиотеке, да еще и под рукой нет ни IDE ни плат, но все же.
В "UTFT" внешние шрифты подключаются вот так:
где "BigFont[]" это файл "BigFont.c", который я, кстати, так нигде и не нашёл почему-то. Ну а что бы подключить любой другой шрифт, достаточно скачать соответствующий файл шрифтов с расширением ".c", положить его в папку со скетчем и потом вызывать с помощью того же "setFont". Во всяком случае у меня этот метод работает...
Но я сейчас не об этом. Интересно вот что: во это "extern uint8_t" (приминительно к шрифтам) работает только для UTFT или для Adafruit тоже?
привет, может кто поможет в вопросе? При установке сторонних шрифтов ,а именно при использовании цифр, когда меняются показания, то на экране начинается каша. старые показания не затираются. много читал старался где то найти информацию, но увы и ах , ничего про это нигде не сказано. изучал разные скетчи, подозреваю, что нужна какая то функция в скетче, но пока так и не нашел решение. Может кто подскажет где капать?