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

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

Думаю, проекты могут быть не только программно-аппаратные, но и чисто программные.

Поэтому выкладываю библиотеку здесь.

https://drive.google.com/open?id=1Fze8BdCS8wJCUNduSNcDkKqdjXrvCCgk

Прежние версии обсуждались в теме http://arduino.ru/forum/programmirovanie/kirillitsa-na-displee-ili-chto-ya-delayu-ne-tak

Напомню: создание библиотеки преследовало две цели:

1. Добиться, чтобы без всекого шаманства что мы видим на экране в Arduino IDE, то же было на дисплее.

2. Уменьшить расход оперативной памяти при использовании библиотеки.

Вторая цель достигнута за счет отказа от экранного буфера в оперативной памяти. И, соответственно, вынужденного отказа от пиксельной графики: библиотека может выводить только текст или битмап. При этом высота как текста, так и битмапа должна нацело делиться на 8, а Y-координата также должна быть кратна 8. Это - плата за экономию памяти. Исправить это нельзя, если указанные ограничения критичны, пользуйтесь другой библиотекой - с экранным буфером объемом 1 киб.

В последней версии (0.4) добавлено

1. переключение ориентации (нормальный и кверху тормашками)
2. поддержка строк из PROGMEM
3. установка скорости для Arduino Due
4. добавлена поддержка 1.3" OLED SH1106
 
Комментарии:
1. В Arduino почему-то считается, что экран должен располагаться так, чтобы пины были сверху дисплея. А производитель дисплея, наоборот, сделал режимом по умолчанию тот, где пины снизу. И последнее логично: при раз0мещении экрана на лицевой панели совместно с другими органами управления более благоприятное расположение дисплея именно такое. Поэтому кроме "прямного" режима сделан "кверху тормашками" - какждый сам выбирает, как сориентировать дисплей в своей конструкции.
2. Собственно, теперь можно располагать строковые константы в PROGMEM: F("Моя новая строка")
3. Библиотека для увеличения скорости работы переключает шину I2C со стандлартных 100 кГц на 400 кГц. Теперь и для Arduino Due - тоже. Скажу по секрету: я добился устойчивой работы этой библиотеки на Arduino Due с имеющимся у меня дисплеем на 2 МГц.
4. Для подключения такого дисплея нужно раскомментировать одну строку в ASOLED.h. Если этого не сделать, то, в принципе, работать все равно будет - но со сдвижкой на 2 пиксела вправо.

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Полезный проект, надо будет опробовать!

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

А ориентацию 90/180 градусов можно реализовать?

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

А я уже опробовал, библиотека просто бомба. Простенько и со вкусом. Огромное спасибо автору.

ПС. И автор забыл указать, что библиотека выводит как ангийский, так и русский, український и беларуский шрифты. Причем без бубнов, вот как написал в скетче LD.printString_6x8(F("Україна - ненька моя"), 0, 4) , вот так и на экране будет. )

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

Tomasina пишет:

А ориентацию 90/180 градусов можно реализовать?

На 180 - уже есть.

На 90 - для 1306, если мне не изменяет память, реализовать можно, но нужно гораздо глубже перепрограммировать дисплей (чтобы байт, 8 пикселей, располагался не вертикально, а горизонтально). Для 1106 - не смотрел.

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

Ну а самое главное - по мере обрастания "фичами" библиотека теряет свою компактность. Поэтому хочется, чтобы в библиотеке было только самое необходимое, а не все, что кому-то когда-то может понадобиться.

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

kostyamat пишет:

ПС. И автор забыл указать, что библиотека выводит как ангийский, так и русский, український и беларуский шрифты. Причем без бубнов, вот как написал в скетче LD.printString_6x8(F("Україна - ненька моя"), 0, 4) , вот так и на экране будет. )

Разве забыл?

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

Правда, должен признаться, что если русский, украинский, белорусский, болгарский и русинский поддерживаются честно, то, скажем, в македонском можно добиться адекватного изображения надписей, но для этого нужно заменить македонские "S" или "J" на аналогичные по написанию латинские.

 

PLYT
Offline
Зарегистрирован: 06.11.2017

Нет ли у автора этой библиотеки со SPI?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Плюсанул и подписался на тему. Спасибо за библу ))

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

В названии темы, да, фигурирует. Но и многие другие библы выводят кирилицу, но с телодвижениями. А ваша -  сразу, как есть. Вот в том-то и вишенка.

Но, я как бы не настаиваю. Фигурирует, - значит фигурирует. ))

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

PLYT пишет:

Нет ли у автора этой библиотеки со SPI?

Были бы у меня дисплеи с SPI - появилсь бы и библиотека.

Да и самя сейчас, честно говоря, предпочел бы SPI, но основа этой библиотеки зародилась в первую неделю моего знакомства с Ардуино, поэтому какой дисплей мне первым попался, для такого интерфейса и написал.

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

kostyamat пишет:

В названии темы, да, фигурирует. Но и многие другие библы выводят кирилицу, но с телодвижениями. А ваша -  сразу, как есть. Вот в том-то и вишенка.

Ну как раз на этот случай в том же названии есть уточнение "UTF-8", беда лишь в том, что далеко не все начинающие пользовалели Ардуино знают, что среда Arduino IDE работает именно в этой кодировке.

В общем, всен, что нужно, написано, но, увы, не совсем вразумительно.

Logik
Offline
Зарегистрирован: 05.08.2014

Неплохо, но такое https://youtu.be/i6ZzAEG1vaE на этой либке не забацаеш ;)

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

Было бы желание.

Библиотека поддерживает вывод битмапа, а самому рисовать в битмап (который, кстати, не обязан занимать всю площадь экрана) никто не запрещал.

Logik
Offline
Зарегистрирован: 05.08.2014

Т.е. промежуточный буфер. Прога пишет в него, передает его в либу, а та уже выводит на экран. А зачем? Это и ОЗУ нужно, и время на заполнение и вывод ;) Не понимаете на что намекаю?

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

Я вам намекну на одно обстоятельство - с либой от адафруит + трошки кода, мой скетч хавал 78% флеш и 76% ОЗУ, после перехода на эту - 48% и 42℅ соответственно. Намек понятен?
Нужны блекджек и женщины? Адафруит вам в помощь. Ну или другие либы с разной степенью доступности женщин.

Logik
Offline
Зарегистрирован: 05.08.2014

Я Вам сострадаю с вашими проблемами, причем только здесь адафрукт. Что он дерьмо с буфером 1КБ прогрессивное человечество давно вкурсах и его избегают. Или Вы решили что то видео на адафрукте - так таки нет конечно, там буфера нет вобще, не считая нужных для работы БПФ.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

OlegK пишет:

Плюсанул и подписался на тему. Спасибо за библу ))

я тоже

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

Logik пишет:

Т.е. промежуточный буфер. Прога пишет в него, передает его в либу, а та уже выводит на экран. А зачем? Это и ОЗУ нужно, и время на заполнение и вывод ;) Не понимаете на что намекаю?

В чем проблема? Хотите рисовать на экране побайтно - рисуйте. Немножечно времени на заполнении, конечно, выиграете. Но но на выводе потеряете намного больше.

 

И еще одно замечение (простите за очевидность): Можно выводить на экран и без всякой библиотеки, только библиотека для этого не нужна. :)

 

А на что ВЫ намекаете, я не понял. Лично я, если бы мне потребовалось реализовать что-то подобное тому, что на видео, помимо библиотеки использовал бы и небиблиотечные функции. А расширять библиотеку для частного случая - не стал бы.

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

А на что ВЫ намекаете, я не понял. Лично я, если бы мне потребовалось реализовать что-то подобное тому, что на видео, помимо библиотеки использовал бы и небиблиотечные функции. А расширять библиотеку для частного случая - не стал бы.

Разумеется расширять библиотеку под ту или иную картинку не стоит. Библиотеки универсальностю ценны. А намекаю  я на калбек. Возмем к примеру void ASOLED::drawBitmap(const byte *bitmaparray, byte X, byte Y, byte width, byte height) Все как обычно, указатель на буфер первым параметром, в данном случае буфер в PROGMEM (кстати неплохо бы это в типе буфера отразить). Аналогично можна разумеется как в адафрукте указатель на ОЗУ сделать. Но оба подхода слабоваты. А вот если вместо его указатель на функцию возвращающую очередной байт для отрисовки на экран сделат - то все становится намного интересней. Именно так и сделано то видео, функция возвращающая байт там такая.

01byte OscilFn(uint16_t a)
02{
03  static bool flagBlym;
04  byte i=a&0x7f;
05  byte y=a>>7;
06  byte v=Arr[i+sinxro]>>3;
07  byte r=(v>>3)==y?_BV(v&7):0;
08  // сетка, границы, мигаем
09  if((i&0x0f)==0) r|=0x55;
10  if((i==0) | (i==127) | ((i==64) && (flagBlym))) r|=0xff;
11  switch(y)
12  {
13   case 0: r|=1;break;
14   case 2: r|=flagBlym?1:i>>2&1;break;
15   case 3: r|=0x80;break;
16  }
17 
18  if (!a) flagBlym=!flagBlym;
19  return r;
20}
Как видно несложная, но несколько непривычная. Она по номеру байта (они при каждой отрисовке пробегают от 0 до Хмах*Ymax), переданому при вызове из моей библиотечной функции (аналогичного вашей drawBitmap), формирует значений требуемое для отправки в экран. Все не сложно, без буферов и перепахивания либы под конкретную картинку. При этом очень гибко т.к. можна в этом калбеке использовать все что есть, часть (фон например) из PROGMEM вытянуть, часть налету сформировать (мигания всякие например), а  чтото и из буфера дернуть, если надо. Такой вот есть подход ;)
 
ПС. Сейчас вот думаю еще сделать либку с набором таких калбеков частовстречающихся: график, стрелочный прибор, прогрессбар и пр.
kostyamat
Offline
Зарегистрирован: 16.11.2017

А вот можно как-то SD-карту задействовать? Для шрифтов, или битмапов, например. Ни одной такой не видел. Опционально, конечно.

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

Logik пишет:

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

Признаю - мой косяк.

Основа либы делалась в первые две недели моего знакомства с Ардуино.

Цитата:

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

...

ПС. Сейчас вот думаю еще сделать либку с набором таких калбеков частовстречающихся: график, стрелочный прибор, прогрессбар и пр.

Ту есть два замечания:

1. А сколько времени уходит при этом на отрисовку одного экрана? По опыту работы на ПК такой подход крайне неэффективен.

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

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

kostyamat пишет:
А вот можно как-то SD-карту задействовать? Для шрифтов, или битмапов, например. Ни одной такой не видел. Опционально, конечно.

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

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

Ту есть два замечания:

1. А сколько времени уходит при этом на отрисовку одного экрана? По опыту работы на ПК такой подход крайне неэффективен.

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

1. С временем порядок. На видее без тормозов, а ведь там БПФ заодно считает, синусоиды генерит и выводит-вводит. Понятно что если в сравнивать с выводом фиксированой картинки из PROGMEM, то медленей получится, но фиксированая все хотелки совсем не покрывает. А если сравниват с использованием буфера в ОЗУ то надо учитывать и время на формирование буфера, и время мало отличается. При грамотном использовании аппаратного i2c  пока предыдущий байт выводится новый расчитывается. 

2. В каком смысле не универсальны? На все случаи жизни ничего не хватит;)

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

Это понятно, что для сдшки своя библиотека, а для экрана своя.
Я имел в виду - как это сделано в либе, которая к примеру звук выводит из файла wav. Она, при наличии карты и SD.h, воспроизводит файлы с карты, но может и с PROGMEM.
К примеру, LD.drawBitmapSD("proba.bmp");

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

Logik пишет:

1. С временем порядок. На видее без тормозов, а ведь там БПФ заодно считает, синусоиды генерит и выводит-вводит. Понятно что если в сравнивать с выводом фиксированой картинки из PROGMEM, то медленей получится, но фиксированая все хотелки совсем не покрывает. А если сравниват с использованием буфера в ОЗУ то надо учитывать и время на формирование буфера, и время мало отличается. При грамотном использовании аппаратного i2c  пока предыдущий байт выводится новый расчитывается. 

То, что видно на видео, можно оценить в 4-5 fps. Моя библиотека обеспечивает порядка 20 fps при обновлении всего экрана. Конечно, понятно - FFT и все такое... там уже скорость вывода на экран имеет второстепенную роль.

Собсвенно я позиционирую библиотеку для проектов, в которых дисплей играет вспомогательную роль (для чего, собственно, и нужна минимальная ресурсоемкость даже за счет ограничения функциональности). Например, я использовал ее для колесного робота. В Вашем же проекте, судя по FFT, синусоиде и пр. экран - это то, ради чего проект и создавался. Это несколько разные цели и, соответственно, разумно достигать их разными средствами.

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

kostyamat пишет:
Это понятно, что для сдшки своя библиотека, а для экрана своя. Я имел в виду - как это сделано в либе, которая к примеру звук выводит из файла wav. Она, при наличии карты и SD.h, воспроизводит файлы с карты, но может и с PROGMEM. К примеру, LD.drawBitmapSD("proba.bmp");

Вы забыли упомянуть, о какой именно библиотеке идет речь.

Лично мне встречались библиотеки как для Uno, так и для Due. Первые, как правило, предназначались для готовых аппаратных модулей - Shield'ов. На самом Shield'е располагались как слот для карты, так и звуковой модуль. Т.е. серийно выпускается и довольно распространен модуль, содержащий в себе два разных периферийных устройства. В расчете на этот единственный модуль и написана библиотека.

Для Due, который сам содержит все необходимое для воспроизведения звука - своя библиотека. В качестве периферии также используется единственный модуль - слот SD.

Если мы берем отдельно экран и отдельно слот SD - это два модуля.

Модулей (Shield'ов), в которых были бы совмещены экран и слот SD мне не попадалось, а следовательно, писать библиотеку для несуществующего модуля не имеет смысла.

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

Вот https://github.com/TMRh20/TMRpcm библиотека, которая, недурственно, надо сказать, воспроизводит wav (там вроде даже mp3 заявлено, не разобрался до конца).
Она не для шилда, она вообще. А СДшка, это просто SPI, даже шилда не нужен, для согласования уровней 6 резисторов вешается и все. Я, например, эти шесть резисторов прямо к переходнике SD - microSD припаять, и использую как шилд.
Просто, как оказалось, использовать СДшку как программную память - нет. Так хоть для битмапов пошло бы, а если сделать подгрузку надписей, для разных, языков, из файла на СД, - это было бы что-то. Но лучше отдельным модулем, не всем это надо.
Тут вообще, если фантазию включить, надписи можно прямо с СДшки, и сразу как битмассивы загружать, типа в виде витиеватых шрифтов. Вот только нужен будет какой-то редактор, чтобы их готовить.
Приблизительно так:
Функция - открыть файл на карте.
Функция вывода предварительно подготовленного битмассивы в строку.
Правда ещё нужно будет таки функцию дополнения вывода переменными из программы.
Надеюсь не очень сумбурно, и не слишком по нубски объясняю.
Тогда вместо текстовой надписи, которую нужно хранить в PROGMEM, придется хранить только адрес битмассива в файле на карте.

Кстати, вот вам экран с СДшкой на борту 1pcs 1.8 inch TFT LCD Module LCD Screen SPI serial 51 drivers 4 IO driver TFT Resolution 128*160 TFT interface 1.8 inch
http://s.aliexpress.com/M3eyEVZv?fromSns=Копировать
(from AliExpress Android)

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

kostyamat, а обсуждаемая библиотека то тут при чем?

Есть библиотека для карты, есть библиотека для дисплея, хотите использовать совместно - кто ж Вам запретит!

Другое дело, что данная библиотека заточена под минимальное использование памяти, а SD сама по себе прожорлива по памяти. Так что в проектах, где критично количество ОЗУ, SD вряд ли пригодится.

А что касается указанного Вами дисплея, то он явно цветной. Т.е. не меньше 16 бит на пиксель. При разрешении 128х160 - это более 40 кбайт один экран. Для такого имеет смысл хранить картинки на карте, т.к. на Uno даже одной картинки в PROGMEM не поместится.

Универсальных решений не бывает. Особенно для ограниченных в ресурсах микроконтроллеров. Что подходит для одного, совершенно не годится для другого.

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

Logik пишет:

1. С временем порядок. На видее без тормозов, а ведь там БПФ заодно считает, синусоиды генерит и выводит-вводит. Понятно что если в сравнивать с выводом фиксированой картинки из PROGMEM, то медленей получится, но фиксированая все хотелки совсем не покрывает. А если сравниват с использованием буфера в ОЗУ то надо учитывать и время на формирование буфера, и время мало отличается. При грамотном использовании аппаратного i2c  пока предыдущий байт выводится новый расчитывается. 

То, что видно на видео, можно оценить в 4-5 fps. Моя библиотека обеспечивает порядка 20 fps при обновлении всего экрана. Конечно, понятно - FFT и все такое... там уже скорость вывода на экран имеет второстепенную роль.

Собсвенно я позиционирую библиотеку для проектов, в которых дисплей играет вспомогательную роль (для чего, собственно, и нужна минимальная ресурсоемкость даже за счет ограничения функциональности). Например, я использовал ее для колесного робота. В Вашем же проекте, судя по FFT, синусоиде и пр. экран - это то, ради чего проект и создавался. Это несколько разные цели и, соответственно, разумно достигать их разными средствами.

Заинтересовался цифрами, упростил код вызова до 

1void loop(void)
2{
3  
4   int t=millis();
5 //   Выводим осцилограмму
6   myOLED.InitFrame(0,0,128,8, myOLED.FRAME_MODE_CALLBACK, (byte*) OscilFn);
7   myOLED.update(); // на экран
8  Serial.println(millis()-t);
9  return;

Калбек все тот же, только он расчитан на часть экрана с графиком, а я его теперь на весь экран вызываю. Получил 86мс - 12fps, упростил калбек до return 0xc2; нарисовало полоски на весь экран 60мсек -15fps. На софтовом i2c.  ИМХО - более чем достаточно для любых применений, кроме качественной анимации и видео. Но она явно не для такого экрана. Либу свою я использую универсально, в всех указанных случаях. А чего бы и нет?! Выводить  битмапы из PROGMEM аналогично вашей тоже умеет. Шрифты тоже из PROGMEM напрямую. Линии, окружности и прочую лабудень используя временный буфер под требуемую часть экрана тоже (буфер извне передается, как данные выведены - память освобождается). И отдельное применение - отладка скрипта в готовом изделии без экрана. Цепляю на любые 2 свободных пина и софтовый i2c готов. Рассматриваемый пример с DTMF, FFT, алгоритмом Герцеля и пр. как раз пример применения для отладки, смотреть сигналы както надо было.

По дискусии про поддержку SD карты - тулить это в либу экрана плохая идея. Не нужно лепить монстров. Но невозможность вывести картинку из SD на экран без буферизации её - очевидно тоже недостаток. Кстати калбек тут тоже выручает ;) Я так делал на TFT 320*240*16bit. Перед вызовом вывода картинки файл с ней открывается, проверяется на соответствие формата, выделяется на стеке небольшой, по памяти 128 байт, буфер. В вызов передается калбек на функцию которая возвращает из буфера очередной байт, а если он пуст - вычитывает очередной блок данных из файла. Перерисовывало экран 1-2сек. Слабоват 328-й для графики 320*240, а либа поддержки SD - один из образчиков тормознутости.  Думаю если ей переписать то можно и до ограничения по скорости SPI дойти 2-3fps вытянуть, только нафига оно.

dachnik
Offline
Зарегистрирован: 26.07.2013

Привет, долго мучался с адафрутом и нехваткой места, пока ненаткнулся на SSD1306Ascii. Сравнил вашу либу и либу https://github.com/greiman/SSD1306Ascii , результат:

01#include <Wire.h>
02#include "ASOLED.h"
03 
04void setup()
05{
06  LD.init();  //initialze OLED display
07  LD.clearDisplay();
08  LD.printString_6x8("Hello world!", 0, 0);
09}
10void loop()
11{}
1Sketch uses 4 164 bytes (12%) of program storage space. Maximum is 32 256 bytes.
2Global variables use 254 bytes (12%) of dynamic memory, leaving 1 794 bytes for local variables. Maximum is 2 048 bytes.

и либу, которой пользуюсь:

01#define I2C_ADDRESS 0x3C
02#include "SSD1306AsciiAvrI2c.h"
03 
04SSD1306AsciiAvrI2c oled;
05 
06void setup() {               
07  oled.begin(&Adafruit128x64, I2C_ADDRESS);
08  oled.setFont(System5x7);
09  oled.clear();
10  oled.print("Hello world!");
11}
12 
13void loop() {}
1Sketch uses 2 696 bytes (8%) of program storage space. Maximum is 32 256 bytes.
2Global variables use 49 bytes (2%) of dynamic memory, leaving 1 999 bytes for local variables. Maximum is 2 048 bytes.

Надеюсь будет полезно тем, кому и с вашей либой памяти не хватает =)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

dachnik пишет:

Надеюсь будет полезно тем, кому и с вашей либой памяти не хватает =)

А не смущает, что в одном случае шрифт 6х8, а в другом - 5х7? В одном случае - 48 бит на символ, в другом - 35 бит на символ, разница по шрифту - навскидку 27%. Сколько там в шрифте символов? Это я про то, что надо бы покорректней сравнивать ;) К тому же, на первый взгляд - в указанной вами либе нет поддержки UTF-8, стало быть - на русском там писать не судьба, по ходу.

dachnik
Offline
Зарегистрирован: 26.07.2013

Да видел, только шрифта 6х8 из доступных https://github.com/greiman/SSD1306Ascii/tree/master/SSD1306Ascii/src/fonts не нашёл =)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

andriano, можно где нибудь почитать о формате битмапа в вашей библиотеке? В частности хочется понять, что означают

1fontdatatype mice[] PROGMEM={
20x80, 0x40, 0xFF, 0x01,

первые 4 байта в ваших примерах. Гуглёж ничего полезного не даёт.  И есть ли программа, что-бы на компе нарисовать нужное изображение попиксельно, и сразу получить массив в нужном формате.

 

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

dimax, формат я упер из первой попавшейся мне библиотеки для 0.96" OLED. Кажется, она называлсь OzOLED. Но, возможно, и другая, при написании своей (а это был мой первый опыт написать что-то для Arduino) я использовал для справки 3 библиотеки.

Первые две цифры, очевидно, размер изображения по горизонтали и вертикали в пикселях. Четвертая - количество изображений в файле. А третья, думаю, для совместимости с файлом шрифтов, где это поле обозначает номер первого символа в таблице (для полного алфавита обычно код пробела (0х20), а для цифрового - код нуля (0х30)). Собстренно, его можно использовать для выбора нужного изображения по коду, если в массиве помещено сразу несколько изображений (в указанном файле содержится единственное изображение с кодом 255). Вот как-то так. Но формат изобретал не я, так что могу лишь поделиться своими догадками.

Есть ли программа - не знаю, я пользовался обычным текстовым редактором (как известно, настоящий программист пишет так: "COPY CON PROGRAM.EXE").

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Есть ли программа - не знаю, я пользовался обычным текстовым редактором (как известно, настоящий программист пишет так: "COPY CON PROGRAM.EXE").


 

а начинающий так: "copy con program.com" ??? ))) или debug program.com

 

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

Ну да, если начинающий, то начинать нужно с СP/M-80.

mefi7373
Offline
Зарегистрирован: 30.01.2018

библиотека так себе. текс выводится только статичный, текст из переменной вывести так и не получилось. из переменной можно вывести только число, но только одним шрифтом, а текст можно вывести 2 шрифтами. 

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

1. Что такое нестатичный текст?

2. Из переменной какого типа не получилось вывести текст?

3. Вообще-то в библиотеке используется единственный шрифт. Но двух размеров. Любым из размеров можно вывести как строку, так и число.

 

PS. Библиотека и задумывалась как "так себе" - чтобы для экономии памяти ничего лишнего. Отличает ее от других компактных библиотек лишь поддержка кириллицы "из коробки".

Gomez
Offline
Зарегистрирован: 09.09.2017

Тут такое дело. Не могу погасить 1.3" OLED SH1106. :)

LD.setBrightness(0) дает просто небольшую яркость, но экран не гасит. :(

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

И не должно (по крайней мере, с точки зрения разработчиков дисплея). 

Яркость там изменяется в очень небольших пределах. Полностью погасить экран - только очищать его.

DenSyo
Offline
Зарегистрирован: 13.01.2017

добавил в редактор поддержку шрифтов OLED_I2C на основе которых сделаны шрифты ASOLED. до определенной степени совместимость с ASOLED есть, идущий с библиотекой шрифт читается и запишется верно. но не знаю как насчет шрифтов высотой больше 8 и высотой не кратной 8. 

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

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

В библиотеке сейчас, насколько помню, жестко зафиксирован размер 6х8. Точнее, 5х8 с прмежутком в один пиксел.

Еще раз повторюсь: все сделано для минимизации программной и оперативной памяти. Поэтому расширять возможности не планирую.

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

SadiQ228
Offline
Зарегистрирован: 10.04.2017

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

 

SadiQ228
Offline
Зарегистрирован: 10.04.2017

так же не могу понять как реализовать вот такое?

Serial.println((versiondata>>24) & 0xFF, HEX); 

 

при том что  вот такое Serial.print((versiondata>>16) & 0xFF, DEC);  работает корректно

 

LD.printNumber((HEX)(versiondata>>24) & 0xFF, 108, 0); так не дает сделать

SadiQ228
Offline
Зарегистрирован: 10.04.2017

как выводить 0x значения?

b707
Offline
Зарегистрирован: 26.05.2017

SadiQ228 пишет:

Сложновато разобраться, как сделать чтобы пока загружается ардуингка, пакман бежал по желтой полосе

Чтобы "пока загружается ардуинка" что-то выводить на дисплей, нужен еще один МК, кроме ардуинки. иначе никак

sadman41
Offline
Зарегистрирован: 19.10.2016

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

SadiQ228
Offline
Зарегистрирован: 10.04.2017

хихихи

имелось ввиду не в момент загрузки а в момент начала выполнения функции Setup,  для того чтобы в loop все успело инициализироваться и быть готово к корректной работе

ну и еше в двух словах как вообще анимация отрисоввывается в случае пакмана

b707
Offline
Зарегистрирован: 26.05.2017

SadiQ228 пишет:

хихихи

имелось ввиду не в момент загрузки а в момент начала выполнения функции Setup,  для того чтобы в loop все успело инициализироваться и быть готово к корректной работе

Зря смеетесь, ответ совершенно серьезный. я не знаю, что у вас такое иннициализируется в Сетап, что можно успеть анимацию вызвать. В большинстве проектов Сетап выполняется за доли секунды.  Разве только имитировать бурную деятельность -см ответ Садмана на предыдущее сообщение

SadiQ228 пишет:
ну и еше в двух словах как вообще анимация отрисоввывается в случае пакмана

 

анимация - это последовательный показ статичных картинок в разных позициях дисплея. Отрисовывается в положеннии х, потом стирается и отрисовывается на позиции х+1, потом на позиции х+2 и тд

А вообще, ваши вопросы - явный оффтоп в этой ветке. Разместите свои вопросы в разделе Программирование

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

SadiQ228 пишет:

так же не могу понять как реализовать вот такое?

Serial.println((versiondata>>24) & 0xFF, HEX); 

 

при том что  вот такое Serial.print((versiondata>>16) & 0xFF, DEC);  работает корректно

 

LD.printNumber((HEX)(versiondata>>24) & 0xFF, 108, 0); так не дает сделать

Serial.println позволяет работать с различными наборами параметров по одной единственной причине: этих "Serial.println" на самом деле несколько. Каждая отрабатывает свой набор. Хотите, чтобы "давала" - напишите сами. Ничего сложного в этом нет. С моей же точки зрения, HEX формат может понадобиться при работе с подобным дисплеем чрезвычайно редко. Настолько редко, что писать отдельную функцию для этого не имеет мсысла. Он ведь не предназначен, как консоль, для выдачи отладочной информации. 

В общем, у Вас два варианта:

1. Написать нужный Вам варинт printNumber самостоятельно и дополнить им библиотеку.

2. Самому преобразовывать число в HEX-строку и выводить ее обычной функцией вывода строки.

Gomez
Offline
Зарегистрирован: 09.09.2017

А возможно ли как-то вывести на экран длинную строку с автоматическим разбиением ее на строки?

Почему-то это умеет делать, по-моему, одна библиотека Adafruit, которая на платах типа Nano бесполезна, так как занимает всё место. :)