ASOLED - компактная библиотека для OLED дисплея 128х64 с кириллицей UTF-8

aidar_i
Offline
Зарегистрирован: 07.10.2018

andriano, не сможете добавить шрифт 24?

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

1. И сколько строк с таким шрифтом поместится на экран? Две по 7 символов?

2. А это будет не слишком угловато? (у меня мысль - наоборот, сделать "родной" 12х16. Хотя бы для Mega/Due)

 

В общем - нет, я не думаю, что это целесообразно. Если Вам нужно - исходники в открытом доступе.

aidar_i
Offline
Зарегистрирован: 07.10.2018

Да, две строки устроило бы. К сожалению, я не смог. Это очень сложно сделать?

aidar_i
Offline
Зарегистрирован: 07.10.2018

Попробовал сам сделать. Ширину смог увеличить, но высоту нет. 

Здесь высоту увеличил

но не смог вывести все три части. 

Пока сделал как шрифт 18х16. 

Библиотека, правил файлы ASOLED.h, ASOLED.cpp

https://yadi.sk/d/B4cXmoa-YPZzDg

 

aidar_i
Offline
Зарегистрирован: 07.10.2018

andriano пишет:

1. И сколько строк с таким шрифтом поместится на экран? Две по 7 символов?

2. А это будет не слишком угловато? (у меня мысль - наоборот, сделать "родной" 12х16. Хотя бы для Mega/Due)

 

В общем - нет, я не думаю, что это целесообразно. Если Вам нужно - исходники в открытом доступе.

Две строки и нужно.

Вроде шрифт получается нормально, даже в варианте 16х18. На фото сравнение с шрифтом 12х16

Помогите, пожалуйста,  с высотой!

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Высота должна быть кратна 8

aidar_i
Offline
Зарегистрирован: 07.10.2018

Это я знаю, но шрифт 24 уже состоит из трех частей по высоте, 2 части выводятся, а одна нет.

Когда 

Wire.write(lowByte(m)^textMode);верхнюю часть.

Wire.write(highByte(m)^textMode);нижнюю часть.

выводится верхние 2 части. Как вывести еще одну?

aidar_i
Offline
Зарегистрирован: 07.10.2018

 У меня получается только так! /sites/default/files/u41008/foto.jpg

smail
Offline
Зарегистрирован: 24.02.2019

не подскажите,как с помощью этой библиотеки выводить динамические данные?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

дак динамически же

smail
Offline
Зарегистрирован: 24.02.2019

Ну я догадывался...,но не верил

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Вот.  Теперь догадайся обьяснить, что ты имеешь ввиду, под выражением "динамические данные"

smail
Offline
Зарегистрирован: 24.02.2019

Имеется переменная «temp” ,например. Значение которой меняется в ходе выполнения программы. Требуется выводить ее значение на экран. 

Выше уже задавался такой вопрос, но остался без ответа.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

есть функции, printString и printNumber.  Они, сопсно, и выводят все что угодно душе.  Можно сначала temp преобразовать в строку и вывести через printString, а если она имеет тип int то вывести можно через printNumber.  В тексте биб-ки можно подсмотреть парамеьры

smail
Offline
Зарегистрирован: 24.02.2019

Подробнее можно? Даже не знаю как смотреть текст библиотеки. 

Если темп это температура полученная от датчика, ее ещё как то нужно преобразовать? Как? И как эти преобразования скажутся на быстродействии?

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

это к автору, он часто сюда заходит

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

DetSimen пишет:

это к автору, он часто сюда заходит

Почему к автору то?

Автор не заявлял в библиотеке никаких функций преобазования температуры. Библиотека совсем не для этого написана.

smail
Offline
Зарегистрирован: 24.02.2019

Ээ. Вы не так поняли товарища, и меня видимо. Объясните пожалуйста как вывести на экран содержание переменной.

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

На экран можно вывести только целые числа и строки. Все остальные типы переменных нужно предварительно преобразовать в троку.

Вывести можно разным размером шрифта - см. заголовочный файл библиотеки.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

andriano пишет:

На экран можно вывести только целые числа и строки. 

Вывсёврети.  У Вас еще функция есть

byte printNumber(float float_num, byte prec=6, byte Y=255, byte numChar=255); // current font 

smail
Offline
Зарегистрирован: 24.02.2019

Извините за назойливость.Я просто не умею этого-посмотреть заголовочный файл библиотеки.Объясните если не сложно.

GoDr
GoDr аватар
Offline
Зарегистрирован: 14.02.2018

А запихнуть эту библиотеку в attiny13 реально?

PS

Под рукой нет контроллера... 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

GoDr пишет:

А запихнуть эту библиотеку в attiny13 реально?

Нет

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

DetSimen пишет:

andriano пишет:

На экран можно вывести только целые числа и строки. 

Вывсёврети.  У Вас еще функция есть

byte printNumber(float float_num, byte prec=6, byte Y=255, byte numChar=255); // current font 

Нифига себе!

Надо будет удалить в следующей версии.

 

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

small, посмотрите, там есть скетч с примерами Test_ASOLED.ino, там показано, как выводить числа, строки, битмапы, спрайты и даже простейший вид диаграммы.

kostyamat
Offline
Зарегистрирован: 16.11.2017

Вернулся к этой библе.
Ребята, несколько вопросов.
Какая версия самая последняя и где взять?
Научилась ли библа выводить String или дальше приходится делать преобразование в массив char?
Как и чем нарисовать пару символов. Редактор на первых страницах не подходит, нет у меня MS Excel, есть OpenOffice, и в нем он не работает. Может кто попроще метод объяснить?

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

Последняя версия 0.4. Собственно, сама тема в "Проектах" была создана только тогда, когда библиотека уже была обсуждена на форуме и в нее внесены исправления.

Функциональность библиотеки расширять не планируется, т.к. одно из основных качеств - компактность. И терять это качество не хочется. Соответственно, поддержка новых типов (в особенности неблагоприятных для использования в микроконтроллерах) не планируется.

Нарисовать пару символов не так просто. В библиотеке для конмактности применена внутренняя нумерация символов, не совпадающая ни с одной кодовой страницей. Поэтому для расширения набора символов нужно править не только массив данных, но и сам код.

Вы уверены, что Вам нужны именно символы? Т.е. они будут обрабатываться и выводиться внутри строки?

Если просто нужны нестандартные значки, то их можно выводить как битмап.

kostyamat
Offline
Зарегистрирован: 16.11.2017

Ну, лично мне на данный момент нужна антеннка и линейка сигнала. И еще парочка мелочей, к примеру полностью заполненное знакоместо, чтобы вывести прогресс.

Жаль конечно, что String не поддерживается, хотя и не критично. А вот флоат вывести мне так и не удалось, вроде команду PrintNumber оформляю правильно, ставлю точность 2 знака, но выводит все равно целое. И хотелось бы средний шрифт, между большим и маленьким. А точно никак сделать шрифт кратным 4, а не 8-ми? Шрифт 10х12 было бы самое то.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

kostyamat пишет:

 А точно никак сделать шрифт кратным 4, а не 8-ми? Шрифт 10х12 было бы самое то.

Никак, из-за специфики самого экранчика. 

 

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

kostyamat пишет:

Ну, лично мне на данный момент нужна антеннка и линейка сигнала. И еще парочка мелочей, к примеру полностью заполненное знакоместо, чтобы вывести прогресс.

Для того, что Вы перечислили, по логике больше подходит битмап, нежели фонт.

Цитата:

А вот флоат вывести мне так и не удалось, вроде команду PrintNumber оформляю правильно, ставлю точность 2 знака, но выводит все равно целое.

А в демонстрационном примере работает? В чем разница?

Цитата:

И хотелось бы средний шрифт, между большим и маленьким. А точно никак сделать шрифт кратным 4, а не 8-ми? Шрифт 10х12 было бы самое то.

Без буфера - никак. На дисплее можно изменить только 8 смежных пикселей одновременно. Нарисовать часть из них сначала, а часть потом - невозможно. Если у Вас есть в этом необходимость, Вам нужна другая библиотека - с экранным буфером. Это стоит килобайт ОЗУ.

kvazi
Offline
Зарегистрирован: 06.10.2016

может есть кто её адаптировал под stm32?

не компилится(

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

Что выдает?

Насколько я помню, под Arduino Due прилось изменить, кажется, одну строку - повышение частоты обмена с 100 до 400 кГц.

Кстати, дисплей (по крайней мере тот, что у меня) может работать и на 2 МГц.

deloed
Offline
Зарегистрирован: 23.05.2019

Как запустить библиотеку на esp?

Tomat7
Offline
Зарегистрирован: 09.11.2018

deloed пишет:

Как запустить библиотеку на esp?

http://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-displeya-128kh64-s-kirillitsei-utf-8?page=1#comment-427764

to Andriano: я слегка модифицировал библиотеку - добавил поддержку ESP32 (ESP8266 компилится, но не проверял) и выбор типа дисплея при инициализации библиотеки. Выкладывать в середине форума чужую библиотеку считаю не правильным. Могу переслать тебе, но наверное лучше на гитхаб.

deloed
Offline
Зарегистрирован: 23.05.2019

спасибо, затупил :)

deloed
Offline
Зарегистрирован: 23.05.2019

Под esp8266 не компилится.

Tomat7, вы не могли бы скинуть подправленную библиотеку сюда или на почту deleod СОБАКА ya.ru?

Tomat7
Offline
Зарегистрирован: 09.11.2018

deloed пишет:

Под esp8266 не компилится.

что не компилится?

 

deloed
Offline
Зарегистрирован: 23.05.2019
тестовый скетч, компилятор ругается на это:
 
C:\Users\User\Documents\Arduino\libraries\ASOLED\ASOLED.cpp:536:21: error: 'TWBR' was not declared in this scope
 
   byte twbrbackup = TWBR;
Tomat7
Offline
Зарегистрирован: 09.11.2018

deloed пишет:

тестовый скетч, компилятор ругается на это:
 
C:\Users\User\Documents\Arduino\libraries\ASOLED\ASOLED.cpp:536:21: error: 'TWBR' was not declared in this scope
 
   byte twbrbackup = TWBR;

http://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-...

ASOLED.cpp отредактировать "точно" как в сообщении по ссылке, а потом заменить defined(ESP32) на defined(ESP8266)

Чтобы скомпилить пример идущий с библиоткой нужно подредактировать mice.c так же, как и a_Small_Rus.c

 

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

deloed, можете вообще выкинуть все, что касается TWBR - это специфичная для AVR настройка скорости I2C, все должно работать, но не так быстро. Либо заменить этот фрагмент на аналог настройки скорости I2C для выбранного Вами контроллера. Кстати, для Due удается поднять скорость обмена до 2 МГц.

deloed
Offline
Зарегистрирован: 23.05.2019

Спасибо, коллеги :)

SVD
Offline
Зарегистрирован: 05.04.2018

Доброго времени суток. Подскажите пожалуйста как сконвертировать рисунок для этой чудной библиотеке? То как делал на U8glib, не работает.

Спасибо!

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

Сруктура битмэпа должна повторять структуру экрана, т.е.:

- высота рисунка должна быть кратна 8,

- первые 4 байта - заголовок аналогичный таковому для шрифта, т.е. первый байт ширина (dx), а второй - высота (dy) в пикселях, третий байт в данном случае смысла не имеет, потому 0xff, а в четвертом - количество кадров изображения: в простейшем случае - 1,

- далее идет сам битмап: в первом байте содержится вертикальный столбец из 8 пикселей - левый верхний. Во втором байте - второй слева верхний, и так - до правого конца битмэпа, т.е. всего dx байтов. Соотвественно, когда мы все их заполонили, это верхние 8 строк растра,

- следующие dx байтов содержат следующие 8 строк растра - аналогично. Всего строк растра - dy штук, байтов в строке битмэпа - (dy/8), а байтов в битмэпе dx*(dy/8), плюс, как упомянуто выше, 4 байта заголовок.

SVD
Offline
Зарегистрирован: 05.04.2018

andriano пишет:

Сруктура битмэпа должна повторять структуру экрана, т.е.:

- высота рисунка должна быть кратна 8,

- первые 4 байта - заголовок аналогичный таковому для шрифта, т.е. первый байт ширина (dx), а второй - высота (dy) в пикселях, третий байт в данном случае смысла не имеет, потому 0xff, а в четвертом - количество кадров изображения: в простейшем случае - 1,

- далее идет сам битмап: в первом байте содержится вертикальный столбец из 8 пикселей - левый верхний. Во втором байте - второй слева верхний, и так - до правого конца битмэпа, т.е. всего dx байтов. Соотвественно, когда мы все их заполонили, это верхние 8 строк растра,

- следующие dx байтов содержат следующие 8 строк растра - аналогично. Всего строк растра - dy штук, байтов в строке битмэпа - (dy/8), а байтов в битмэпе dx*(dy/8), плюс, как упомянуто выше, 4 байта заголовок.

Спасибо. Все получилось. 

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

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

Про систему кординат, честно говоря, не понял.

Но цифру по правому краю выровнять, естественно, можно: для шрифта 6х8 цифру следует выводить в позиции 122, а для шрифта 12х16 - 116.

Что же касается Ворда, то там преимущественно используются шрифты с непостоянной шириной символа, поэтому наличие такой опции действительно сильно облегчает жизнь разработчика, правда, ценой существенного расхода вычислительного ресурса и объема кода. На МК с его скромными ресурсами и моноширинным шрифтом встраивание такой возможности в библиотеку считаю нецелесообразным.

SVD
Offline
Зарегистрирован: 05.04.2018

andriano пишет:

Про систему кординат, честно говоря, не понял.

Но цифру по правому краю выровнять, естественно, можно: для шрифта 6х8 цифру следует выводить в позиции 122, а для шрифта 12х16 - 116.

Что же касается Ворда, то там преимущественно используются шрифты с непостоянной шириной символа, поэтому наличие такой опции действительно сильно облегчает жизнь разработчика, правда, ценой существенного расхода вычислительного ресурса и объема кода. На МК с его скромными ресурсами и моноширинным шрифтом встраивание такой возможности в библиотеку считаю нецелесообразным.

Ну вот смотрите. Цифра 859, видите между ней и ее единицей измерения пробел, соответственно если цифра будет четырехзначной, то пробела не будет. Вот хочется, что бы и при трехзначной не было. Цифры соответственно будут динамически меняться. Пока не понял как это сделать?

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

Если число трехзначное (меньше 1000), выводить с одной позиции, если четырехзначное - с другой.

Это про то, как сделать компактно и для конкретного случая.

Для моноширинного общего случая: Xstart = XleftPosition - NumberOfDigits(myNumber)*symbolWidth;

Для немоноширинного общего случая необходима функция, подсчитывающая длину строки в пикселях. В общем случае эта функция должна содержать цикл. Xstart = XleftPosition - pixelLength("myString");

Т.е. способов много разных, но, на мой взгляд, наиболее предпочтительным выглядит первый - т.е. не писать универсальную функцию, а писать наиболее компактный вариант для каждого конкретного случая.

SVD
Offline
Зарегистрирован: 05.04.2018

andriano пишет:

Если число трехзначное (меньше 1000), выводить с одной позиции, если четырехзначное - с другой.

Это про то, как сделать компактно и для конкретного случая.

Для моноширинного общего случая: Xstart = XleftPosition - NumberOfDigits(myNumber)*symbolWidth;

Для немоноширинного общего случая необходима функция, подсчитывающая длину строки в пикселях. В общем случае эта функция должна содержать цикл. Xstart = XleftPosition - pixelLength("myString");

Т.е. способов много разных, но, на мой взгляд, наиболее предпочтительным выглядит первый - т.е. не писать универсальную функцию, а писать наиболее компактный вариант для каждого конкретного случая.

Все спасибо. Получилось. Сделал просто через if. Если число блоьше 999 то одна начальная позиция, если меньше то другая и все работает. 

 

AlexSat2017
Offline
Зарегистрирован: 25.10.2017

Не могли бы вы прислть этот скетч на почту, я только начал изучать адруино, некоторые вещи мне не понятны. Спасибо !

rusexpress13@gmail.com

kholonkin
Offline
Зарегистрирован: 14.10.2013

Здравтсвуйте!

Хотелось бы выводить....
 

String rtut;

LD.printString(rtut,0,0);

А оно ругается, 

Arduino: 1.6.5 (Windows 8.1), Плата"Arduino Nano, ATmega328"
 
Cube.ino: In function 'void Cube()':
Cube:15: error: no matching function for call to 'ASOLED::printString(String&, byte, int)'
Cube.ino:15:43: note: candidates are:
In file included from ValveControlAlone_asoled.ino:3:0:
C:\Program Files (x86)\Arduino\libraries\ASOLED/ASOLED.h:33:8: note: void ASOLED::printString(const char*, byte, byte)
   void printString(const char *String, byte X=255, byte Y=255);  // Current font
        ^
C:\Program Files (x86)\Arduino\libraries\ASOLED/ASOLED.h:33:8: note:   no known conversion for argument 1 from 'String' to 'const char*'
C:\Program Files (x86)\Arduino\libraries\ASOLED/ASOLED.h:37:8: note: void ASOLED::printString(const __FlashStringHelper*, byte, byte)
   void printString(const __FlashStringHelper *ifsh, byte X=255, byte Y=255);  // Current font - text in PROGMEM
        ^
C:\Program Files (x86)\Arduino\libraries\ASOLED/ASOLED.h:37:8: note:   no known conversion for argument 1 from 'String' to 'const __FlashStringHelper*'
no matching function for call to 'ASOLED::printString(String&, byte, int)'