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

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

Ну потому и занимает все место, что содержит множество ненужных функций.

Разбиение на строки - совсем не то, что должна делать библиотека дисплея.

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

andriano пишет:

Разбиение на строки - совсем не то, что должна делать библиотека дисплея.

Плюсую ;)

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

Andriano, добрый день!

Спасибо за замечательную библиотеку.

Сейчас на Ali есть 128x128 OLED I2C на SSD1327...

В связи с этим вопрос - есть ли у Вас планы по поддержке дисплеев на SSD1327?

А то уж дюже не хочется на U8g переходить.

PS Готов предоставить такой дисплей в бессрочное пользование. :-)

 

 

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

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

slider
Offline
Зарегистрирован: 17.06.2014

копатели либы OLED , что посоветуете по горячим следам,  как переделать на меньший размер по пикселям ? 
 либа  Ug8lib  ug2  есть поддержка i2c
0.42" SSD1306  72*40
0.49"  SSD1306 Drive 64*32 
но либа выжирает почти всю память , есть компактная как от UTFT и здешняя , но нет поддержки малых разрешений.  При пробовании запуска на больших разрешениях, мелкие диспы показываю лабуду. 
 Мож есть какая легкая либа для малопиксельных, или как эту либу переделать на нужное разрешение?

// есть интерес попробовать сделать уменьшенный вариант Data Glasses Arduino  (насадка на технич. очки, проецирует показания перед глазом )

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

А как эта "лабуда" выглядит?

Скажем, как выглядит экран, если вывести только:

- вертикальный отрезок,

- горизонтальный отрезок,

 

 

dima744
dima744 аватар
Offline
Зарегистрирован: 27.09.2018

Доброго времени суток!

спасибо за библиотеку!

не подскажете на какие пины вешать дисплей? Если не сложно, то подробно (Arduino UNO)....я новичок

сам разобрался ......

дисплей-->Arduino

VDD-->3.3V

GNG-->GND

SCK(или SCL) --> SCL

SDA-->SDA

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

PS другие библиотеки с моим дисплеем корректно работать не хотели

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

На SDA и SCL. У Arduino Uno это A4 и A5.

dima744
dima744 аватар
Offline
Зарегистрирован: 27.09.2018

andriano пишет:

На SDA и SCL. У Arduino Uno это A4 и A5.

странно у меня есть отдельные порты SDA,SCL или это физически A4,A5?

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

dima744 пишет:
странно у меня есть отдельные порты SDA,SCL или это физически A4,A5?

Это одни и те же пины. Просто на новых ревизиях плат пины A4,A5 продублированы на противоположной стороне с названием SDA,SCL.

slider
Offline
Зарегистрирован: 17.06.2014

andriano пишет:

А как эта "лабуда" выглядит?

Скажем, как выглядит экран, если вывести только:

- вертикальный отрезок,

- горизонтальный отрезок,

0.49"  SSD1306  64*32 
Эт с U2G8 , а с вашей либой оказалось норм, черный экран вывода цифр вылечился сдвигом +31,+4

LD.printString_6x8("012345_0000", 31, 4);   // первая строчка

Хотел вывести большие цифры int count;  , не получилось

1. (думал что либа запоминает шрифт после LD.printString_12x16 ) 

 как понял надо обязательно добывлять (long) для вывода int:    LD.printNumber( (long)count , 31, 4); - печатает только мелкий шрифт

2. попробовал через конветрацию , переменная String thisString=" "; 

  thisString = String(count, DEC);  // преобразуем int count в String
  LD.printString_12x16( (const)thisString , 31, 4);    //в либе подсмотрел что надо const , (String) тож не работает LD.printString_12x16( (string)thisString , 31, 4); 

Test_ASOLED2:53: error: invalid cast from type 'String' to type 'const int'
 
exit status 1
invalid cast from type 'String' to type 'const int'

LD.printString_12x16( thisString , 31, 4);  - тож не работает

подскажите пожалуйста как надо сделать чтоб int count большим шрифтом напечатался

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

printString() работает не со String, а с char*. Т.е. в Вашем случае должно быть что-то вроде LD.printString(thisString.c_str(), 31, 4);

Любые целые типы по идее должны преобразовываться в long. Безо всяких дополнительных действий с Вашей стороны.

Шрифт запоминается.

Дальше, не имея экрана, что-то сказать сложно.

Как именно выглядит это "не работает"?

Пытались выводить мелкий шрифт со смещением +5, +6, +7? А крупный с тем же смещением?

Еще можно попытаться поиграть с SetTurnedOrientation(); В этом случае картинка должна быть кверху ногами и со смещением от +0.

br0lviv
Offline
Зарегистрирован: 11.06.2018

а как быть в таком случае?

1LD.printString_12x16(F(time.gettime("H:i:s"), 0, 2));

macro "F" passed 3 arguments, but takes just 1

ибо, если сделаю вот так, вообще не проходит.

1LD.printString_12x16(F(time.gettime("H:i:s")), 0, 2);
exit status 1
Ошибка компиляции для платы Arduino Mini.
 
но и других ошибок не выдает
 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

br0lviv, а что Вы хотите сделать?

br0lviv
Offline
Зарегистрирован: 11.06.2018

andriano пишет:

br0lviv, а что Вы хотите сделать?

Я хочу вывести часы, минуты и секунды. Получается более одного значения, поэтому и ошибка? И как работает (F(...)); Возможно я не до конца понимаю его принцип действия. Спасибо

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

Вот мне и непонятно, с какой целью Вы пытаетесь использовать макрос F().

Ну и заодно приведите прототип функции .gettime() для используемой Вами библиотеки (в ASOLED такой функции нет).

br0lviv
Offline
Зарегистрирован: 11.06.2018

Как работает этот макрос? Или где можно о нем почитать?

Без него, все работает. Но как я понимаю ест больше памяти

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

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

Чтобы почитать о макросе, наберите  в поиске "Arduino PROGMEM".

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

Ну и самое главное - пока у меня нет никаеких оснований думать, что для вашего проекта требуется "больше памяти".

br0lviv
Offline
Зарегистрирован: 11.06.2018

Извините, не с того начал. Вы правы. Предоставить более подробную информацию смогу вечером. спасибо, что отвечаете)

aledan
Offline
Зарегистрирован: 22.12.2018

Пробую эту библиотеку на слегка другом дисплее размером 128х32. Столкнулся с тем, что большой шрифт отображается "нормально", а вот 6х8 нет. Я так понял, что обрезается сверху и снизу строка пикселей. И если на большом шрифте этого не заметно, то вот с маленьким не прокатывает. Посоветуете, как это можно решить.

slider
Offline
Зарегистрирован: 17.06.2014

Да либа хорошая и мало занимает . спасибо  andriano ,  все работает, все выводит.
для малых дисплеев просто добавил смещение +..  +.. по горизонтали и вертикали. 

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

aledan
Offline
Зарегистрирован: 22.12.2018

Не очень понял про смещение. В каком месте его редактировать.

Сделал фотки как выглядит.

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

aledan, дисплея такого у меня нет, поэтому сказать, что и как исправлять, не могу - не на чем проверить свои догадки.

А догадки, надо сказать, не очень приятные: из сравнения того, что пишет slider, и что пишете Вы, могу предположить, что китайцы на матрице 128х32 делают два разных вида дисплея, управлять которыми тоже нужно по-разному.

Собственно, контроллер предусматривает формат экрана 128х64, а в дисплее количество строк вдвое меньше. Т.е. половина строк не должна использоваться. Вопрос в том - какая именно половина. Похоже, что в дисплее slider'а это вторая половина (т.е. строки с 32 по 63), а в Вашем дисплее - через одну (например, все нечетные). Соответственно, и методы борьбы должны быть разными.

Но это только мои предположения.

Yarik_22
Offline
Зарегистрирован: 13.03.2016

Здравствуйте, подскажите, как с помощью вашей библиотеки выводит на экран OLED0.95" динамичесике цифры - если цифра изменяется от 0 до 100 (float), то например если значние изменилось  с 85 до 0, значение на экране остается 05, как можно сделать обновление цифры постоянно, не совсем понял как можно работать стипом char? можно пример

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

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

Ну а работать с типом char можно по-разному. Все зависит от того, что Вы хотите в результате получить.

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

а как вывести значок "градус"?

пытаюсь LD.printString_12х16("\xC2\xB0");

выводит звёздочку. 

Upd. Разобрался.  Спасибо.

Yarik_22
Offline
Зарегистрирован: 13.03.2016

хочу сделать типа такой функции, суть такая какое бы не было значение tape к нему добавляется в конце пустое место, думаю будет "затирать хвост" если длинна текста изменится, но в библиотеки нет функции printChar, поэтому и спрашиваю, как можно работать с функцией char, может как то проще это можно сделать?

void drawNum (String tape, int width, int x, int y) {
 
    String temp = tape + String(" ");
   
    for ( int i = 0 ; i < temp.length(); i++ ) {   
      int letter = i;
      LD.printChar(temp[letter],x, y);    
      x += width;           
      }
    
}
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Yarik_22, в библиотеке есть функция printChar, только она недоступна снаружи. Это сделано специально. Дело в том, что "char" в языке Си - это одно, а в кодировке UTF-8 - совсем другое. И как только мы пытаемся использовать кириллицу, эта разница сразу проявляется. Поэтому функция printChar в общепринятом смысле (для вывода одного символа) применительно к кодировке UTF-8 вообще невозможна.

Библиотека в целях компактронсти не поддерживает ни "String", ни "string", поэтому при обращении к ней следует использовать Си-строки (char*, заканчивающийся нулем). Если параметры, задающие позицию вывода, опустить, очередной символ будет отображаться вслед за предыдущим. Т.е. в Вашем случае вывод должен вцыглядеть как-то так:

1void drawNum (String tape, int width, int x, int y) {
2  LD.printString(tape.c_str, x, y);   
3  LD.printString(" ");   
4}

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

PS. Кстати, и с точки зрения расхода памяти такой подход будет гораздо лучше.

Yarik_22
Offline
Зарегистрирован: 13.03.2016

при компиляции ошибка

error: invalid use of non-static member function

   LD.printString(tape.c_str, x, y);   
 
 exit status 1
invalid use of non-static member function
 
 
p.s.
 
воспользовался вашим примером иначе, добавил после изменяемой переменной  LD.printString(" "); теперь все затирает как надо, артефактов не остается!!! а так  как кроме этого числа на одной строке ни чего нет, то эта функция ни чего лишнего не уберет.
 
 
Yasha261998
Offline
Зарегистрирован: 31.01.2019

Здравствуйте! Подойдёт ли эта библиотека для esp8266?

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

Пробуйте. Я ее и для Due использовал. А с ESP - не пробовал.

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

С ESP32 работает, только нужно #ifdef немного поправить.

По памяти, вечером дома проверю.

ASOLED.cpp

01#if defined(__AVR__)
02#include <avr/pgmspace.h>
03#endif
04 
05// ...
06 
07void ASOLED::init(){
08    Wire.begin();
09    // upgrade to 400KHz! (only use when your other i2c device support this speed)
10#if (!defined(__SAM3X8E__) && !defined(ESP32)) 
11    if (I2C_400KHZ){
12        // save I2C bitrate (default 100Khz)
13        byte twbrbackup = TWBR;
14        TWBR = 12;
15    }
16#else
17    Wire.setClock(400000);
18#endif

a_Small_Rus.c

1//...
2#elif defined(__arm__)
3  #define PROGMEM
4  #define fontdatatype const unsigned char
5#elif defined(ESP32)
6  #define PROGMEM
7  #define fontdatatype const unsigned char
8#endif

PS to Andriano: мож на GitHub?

karabas_19
Offline
Зарегистрирован: 04.02.2019

Добрый день! Скажите что я делаю не так? Использую эту библиотеку, в скетче пишу, например,

1LD.printString_12x16("ПРИВЕТ", 0, 0);

загружаю, на экране вместо букв звездочки.

В IDE нажимаю Исправить кодировку и перезагрузить. При этом весь русский тест в скетче (включая коментарии) меняется на кракозябры, исправляю нужные мне строки и загружаю - на экране русский текст.

При этом примеры идущие с библиотекой работают нормально - и в скетче и на экране русские буквы без танцев с бубном.

 

 

 

 

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

karabas_19, видимо, у Вас какие-то проблемы с кодировкой Arduino iDE. По умолчанию должна быть utf-8, и библиотека рассчитана именно на это.

karabas_19
Offline
Зарегистрирован: 04.02.2019

И как это исправить? В настройках IDE не нахожу ничего связанного с кодировками

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

Когда используете скетчи где есть кириллица, перед загрузкой нужно сохранить скетч (настройки-сохранить), иначе кириллица исчезает и вместо него появляется звездочки или ромбы  и тп. Это нужно делать , если после открытия скетча Вы вносили изменения, не важно какие! 

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

Tomat7, спасибо за рекомендации! Запустил библиотеку в ESP8266. В исправлениях вместо 32 написал 8266.

Правда пример не пошел . Оставил только печать текстов, печатает.

Такая ошибка:

01mice.c:14:1: error: unknown type name 'fontdatatype'
02 
03 fontdatatype mice[] PROGMEM={
04 
05 ^
06 
07mice.c:14:21: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'PROGMEM'
08 
09 fontdatatype mice[] PROGMEM={
10 
11                     ^
12 
13Используем библиотеку Wire версии 1.0 из папки: C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries\Wire
14Используем библиотеку ASOLED в папке: C:\Arduino\arduino-1.8.7\libraries\ASOLED (legacy)
15exit status 1
16unknown type name 'fontdatatype'

Может подскажете, что еще подправить.

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

karabas_19 пишет:

И как это исправить? В настройках IDE не нахожу ничего связанного с кодировками

Честно говоря, настройка Arduino IDE - та еще песня: там минимум три текстовых файла конфигурации, причем распределение функций между ними неочевидно.

Я не могу воспроизвести Вашу ситуацию: у меня при создании нового скетча он сразу получается в utf-8. Если нажать "Исправить кодировку", он перекодирует так, как если бы исходный текст был в 1251. Т.е. портит строку. Если я набираю рядом с испорченной новую - она отображается правильно и в дальнейшем все так и работает.

Т.е. я не могу получить режим, чтобы в IDE и на дисплее у меня отображалось по-разному. Соответственно, не могу понять причину проблемы и, следовательно, способо борьбы с нею.

А что если сразу после запуска среды сначала нажимать new, а только потом начинать набирать текст?

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

Вы попробуйте изменить скетч и загрузить, как я писал. У меня сразу появляются звездочки, как только сохраню, появляется кириллица. И это не только с Вашей библиотекой. И давно я обнаружил это, прочитав где-то почему так происходит, когда сохраняете код получается в utf-8.

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

aidar_i пишет:

В исправлениях вместо 32 написал 8266. ... Правда пример не пошел.

В примере идущем с библиотекой используется файл mice.c - он лежит в той же папке что и пример.

В начало этого файла нужно добавить те же строки, что и в a_Small_Rus.c

1...
2#elif defined(ESP8266)
3#define PROGMEM
4#define fontdatatype const unsigned char
5#endif

У меня после этого пример скомпилился без ошибок.

 

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

В строке #elif defined(__arm__) 

__arm__ заменил на ESP8266 и пример заработал!

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

Tomat7, еще раз спасибо!

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

aidar_i пишет:

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

К сожалению, именно этого Вы и не написали.

Цитата:

У меня сразу появляются звездочки, как только сохраню, появляется кириллица. И это не только с Вашей библиотекой. И давно я обнаружил это, прочитав где-то почему так происходит, когда сохраняете код получается в utf-8.

Из того, что Вы написали, понять, что именно Вы делаете, невозможно. Предполагаю, что вместо того, чтобы создать новый скетч, после чего начать набивать его содержимым, вы загружаете уже готовый (где-то взятый) скетч в неправильной кодировке. В этом случае - просто перекодируйте скетч прежде, чем загружать его в Arduino IDE.

karabas_19
Offline
Зарегистрирован: 04.02.2019

aidar_i пишет:

Когда используете скетчи где есть кириллица, перед загрузкой нужно сохранить скетч

Да, действительно помогло! Я изначально в настройках IDE отключил пункт "Сохранять скетч при проверке или компиляции" дабы в случае чего можно было безболезненно вернуться к исходному состоянию. После включения этого пункта все нормально, кирилица отбражается на дисплее без проблем. При этом неважно редактируется уже набранный ранее код или он пишется с нуля.

Теперь еще один вопрос. Правильно ли я понимаю что при использовании шрифта 12x16 строки нужно выводить через одну иначе происходит их наложение,а для шрифтов 6х8 можно подряд? Например

1LD.printString_12x16("ПРИВЕТ",0,0);
2LD.printString_12x16("АРДУИНА",0,2);

и

1LD.printString_6x8("ПРИВЕТ",0,0);
2LD.printString_6x8("АРДУИНА",0,1);

и еще так

1LD.printString_12x16("ПРИВЕТ",0,0);
2LD.printString_6x8("АРДУИНА",0,2);

 

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

Теперь эту библиотеку могут использовать и пользователи программы FLProg! Спасибо, andriano!

https://forum.flprog.ru/viewtopic.php?f=72&t=4910

karabas_19, да, пройдите по ссылке и в выложенных там фото увидите, как располагаются строки.

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

karabas_19 пишет:

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

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

Цитата:

Теперь еще один вопрос. Правильно ли я понимаю что при использовании шрифта 12x16 строки нужно выводить через одну иначе происходит их наложение,а для шрифтов 6х8 можно подряд? Например

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

А как их выводить - это уже дело Ваше )))))

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

Спасибо, за прикольную библиотеку, полезная штучка, да еще с русскими буквами. :) 

С моими таймерами, иногда, намертво вешает контроллер.  Не часто, раз в день примерно, хотя иногда может и сутки проработать а иногда минут 15.   Полагаю, где-то прерывания между собой конфликтуют.  Если таймер останавливаю перед выводом на экран - работает стабильно. :)  

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

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

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

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

andriano пишет:

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

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

Ненене, я про биб-ку ничо плахова не говорю.  Так и должно быть в пересекающихся прерываниях.

Вешаецца, именно в момент вывода, видно по артефактам и непрорисованным до конца буквам. 

Это не в Ваш огород камень, упаси Госспади, это я так, чтобы иметь ввиду. 

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

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

Но для начала я бы порекомендовал закомментировать в моей библиотеке повышение скорости с 100 до 400 кГц (строка "#define I2C_400KHZ 1 // 0 to use default 100Khz, 1 for 400Khz " в файле asoled.h) и посмотреть, как это скажется на устойчивости работы:

- если частота конфликтов увеличится, значит, Ваши таймеры действительно конфликтуют с wire,

- если конфликты исчезнут, значит, конфликт проявляется только на повышенной скорости, и, знапчит, Ваши таймеры не конфликтуют с wire на обычной скорости,

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

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

Разобралса. В зависаниях виноват плохо контачащий Dallas. :)