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

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

Не тот ты String в ея пхаешь

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

kholonkin пишет:

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

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

если хочется выводить так - надо библиотеку переписывать. А пока она не работает с классом String, только с char*
sadman41
Offline
Зарегистрирован: 19.10.2016

Так у стринга есть же дырка, через которую char* виден?

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

sadman41 пишет:

Так у стринга есть же дырка, через которую char* виден?

это костыль :)

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

Это я уже понял :)))))))))))))))

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

А по подробнее?
Я не сильно силен в этих изысках.

 

Спасибо.

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

Посмотрите здесь  https://forum.flprog.ru/viewtopic.php?p=64316#p64316, я там стринг делал. 

И поддержку ESP8266 сделал.

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

Сама конструкция:

 

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

aidar_i пишет:

И поддержку ESP8266 сделал.

можно узнать, в чем она заключалась? Вроде в этой библиотеке нет ничего. что бы мешало ей работать на ЕСП сразу "из коробки"

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

aidar_i пишет:

Сама конструкция:

 

а что помешало срзу сделать так:

01void setup()
02{
03}
04 
05void loop()
06{
07char textStr[] = "Текст строкой";
08LD.printString_18x16(textStr, 0, 0);
09         
10}

 

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

или хотя бы вот так, если уж очень хочется String

01void setup()
02{
03}
04 
05void loop()
06{
07String text = "Текст строкой";
08LD.printString_18x16(text.toCharArray(), 0, 0);
09         
10}

 

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

Или LD.printString_18x16(text.c_str, 0, 0); ?

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

sadman41 пишет:

Или LD.printString_18x16(text.c_str, 0, 0); ?

Не катит гипотенуза так

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

kholonkin пишет:

sadman41 пишет:

Или LD.printString_18x16(text.c_str, 0, 0); ?

Не катит гипотенуза так

 

вот так катит

char charBufVar[6];
tCube.toCharArray(charBufVar,tCube.length()+1);
LD.printString(charBufVar,RightFloat12(Temp1),0);
b707
Offline
Зарегистрирован: 26.05.2017

kholonkin пишет:

вот так катит

char charBufVar[6];
tCube.toCharArray(charBufVar,tCube.length()+1);
LD.printString(charBufVar,RightFloat12(Temp1),0);

так вы сразу свое значение в charBufVar пишите - и никакие пляски со стринг не понадобятся

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

kholonkin пишет:

sadman41 пишет:

Или LD.printString_18x16(text.c_str, 0, 0); ?

Не катит гипотенуза так

От так катит LD.printString_18x16(text.c_str(), 0, 0);

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

b707 пишет:

kholonkin пишет:

вот так катит

char charBufVar[6];
tCube.toCharArray(charBufVar,tCube.length()+1);
LD.printString(charBufVar,RightFloat12(Temp1),0);

так вы сразу свое значение в charBufVar пишите - и никакие пляски со стринг не понадобятся

 

Да там float преобразуем в стринг или вместо float строку пихаем типа "--.--"
В общем потом просто лень там что топроверять. 
В общем это вопрос вкуса.

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

DetSimen пишет:

kholonkin пишет:

sadman41 пишет:

Или LD.printString_18x16(text.c_str, 0, 0); ?

Не катит гипотенуза так

От так катит LD.printString_18x16(text.c_str(), 0, 0);

Яволь! :))))) 

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

kholonkin пишет:

Да там float преобразуем в стринг или вместо float строку пихаем типа "--.--"

да пишите уж сразу "я не умею" - это будет честнее :)

Флоат и в char* можно преобразовать запросто, а еще более вероятно. что и сам флоат вам вовсе не нужен.

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

Открой для себя dtostrf(...);

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

b707 пишет:

kholonkin пишет:

Да там float преобразуем в стринг или вместо float строку пихаем типа "--.--"

да пишите уж сразу "я не умею" - это будет честнее :)

Флоат и в char* можно преобразовать запросто, а еще более вероятно. что и сам флоат вам вовсе не нужен.

нужен float, там температура считается с датчиков Temp1=(float)((int)bufData_1[0] | (((int)bufData_1[1]) << 8))*0.0625+0.03125
 

Да, я не умею преобразовать float в массив char и мне не стыдно. :)
Да, я не знаю многих СИшных плюшек.
Знал бы, вопрос тут не задавал бы.
:)

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

#170

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

kholonkin пишет:

нужен float, там температура считается с датчиков Temp1=(float)((int)bufData_1[0] | (((int)bufData_1[1]) << 8))*0.0625+0.03125

вообще-то эту функцию можно записать в целых числах

((int)bufData_1[0] | (((int)bufData_1[1]) << 8))/16

 

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

b707 пишет:

kholonkin пишет:

нужен float, там температура считается с датчиков Temp1=(float)((int)bufData_1[0] | (((int)bufData_1[1]) << 8))*0.0625+0.03125

вообще-то эту функцию можно записать в целых числах

((int)bufData_1[0] | (((int)bufData_1[1]) << 8))/16

 

А зачем? Там результат температура, с точностью до 0,06 градуса, зачем целые числа?
Да и делые делить и умножать нужно аккуратно тут,  а то переполнение то еще чего, сразу не въезжаешь, от чего рузльтат не понятный :))))))))))))))))
Операциями с float я не злоупотребляю, посему зачем лишний реверанс?

 

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

kholonkin пишет:

Операциями с float я не злоупотребляю, посему зачем лишний реверанс?

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

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

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

b707 пишет:

kholonkin пишет:

Операциями с float я не злоупотребляю, посему зачем лишний реверанс?

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

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


Работает то в целых, а физическая величина, получаемая с них, не в целых, а в дробных.
У меня в проекте 5 float переменных. я понимаю что на 8-битах на float  кататься не совсем кошерно.

Но!
Sketch uses 18 708 bytes (60%) of program storage space. Maximum is 30 720 bytes.
Global variables use 901 bytes (43%) of dynamic memory, leaving 1 147 bytes for local variables. Maximum is 2 048 bytes.
И мне этого хватает выше крыши, и быстродействия тоже. 
Так что это вопрос больше вкуса. 
Tomat7
Offline
Зарегистрирован: 09.11.2018

b707 пишет:

aidar_i пишет:

И поддержку ESP8266 сделал.

можно узнать, в чем она заключалась? Вроде в этой библиотеке нет ничего. что бы мешало ей работать на ЕСП сразу "из коробки"

да ничего не мешает. так, ifdef'ы поправить

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

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

 

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

kholonkin пишет:

 Там результат температура, с точностью до 0,06 градуса, зачем целые числа?

Это с каким даччиком?

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

DetSimen пишет:

kholonkin пишет:

 Там результат температура, с точностью до 0,06 градуса, зачем целые числа?

Это с каким даччиком?

по описанию очень на ds18b20 похоже

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

b707 пишет:

DetSimen пишет:

kholonkin пишет:

 Там результат температура, с точностью до 0,06 градуса, зачем целые числа?

Это с каким даччиком?

по описанию очень на ds18b20 похоже


Он и есть. 18 b20

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

О какой точности ты тогда говоришь?  У него погрешность 0.5 гра.  В целых мерь, всё равно точнее не будет

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

DetSimen пишет:

О какой точности ты тогда говоришь?  У него погрешность 0.5 гра.  В целых мерь, всё равно точнее не будет


Точность измерения в абсолютных единицах и разрешающая способность, разные вещи и не надо их путать. И 0.06 это реально. Правда попадаются хрегоаые экземпляры, те плавают в пределах 0.15...0.2 гр.
Мне лично больше важно на сколько изменилась температура, а не ее абсолютное значение.

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

b707 пишет:

aidar_i пишет:

Сама конструкция:

 

а что помешало срзу сделать так:

01void setup()
02{
03}
04 
05void loop()
06{
07char textStr[] = "Текст строкой";
08LD.printString_18x16(textStr, 0, 0);
09         
10}

 


text у меня меняется и соответственно в дисплее изображение.

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

.

Цитата:
text у меня меняется и соответственно в дисплее изображение.

и что это меняет?

В любом случае промежуточные переменные лишние

Mikhail Lebedev
Offline
Зарегистрирован: 25.01.2019

Добрый день, подскажите команду как отключать дисплей

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

Тут не команда, тут или мозг или молоток нужен. Что есть?

Mikhail Lebedev
Offline
Зарегистрирован: 25.01.2019

В библиотеке SSD1306AsciiAvrI2c есть команда oled.ssd1306WriteCmd(SSD1306_DISPLAYOFF), отключающая дисплей.

Есть что то подобное в Asoled?

ПЫ сы Сам я абсолютный новичок в ардуино - пожалуйста давайте без сарказма обойдемся. Я обязательно дойду до тонкостей всех - но не сразу.

Mikhail Lebedev
Offline
Зарегистрирован: 25.01.2019

В библиотеке нашел setPowerOff() и setPowerOn(). Поменял функции с PRIVATE на PUBLIC. 

genia1991
Offline
Зарегистрирован: 25.12.2019

всем привет. помогите пожалуйста мучаюсь уже 3 день ничего не получается :(

скачал данную библиотеку. при команде LD.printString_6x8("текст");   отображается все хорошо и правильно.

Но у меня есть char с данными которые получаю с SD КАРТОЧКИ. Пытаюсь их вывести на экран. Такой командой:

LD.printString_6x8(theChar);   Но получаю ошибку компиляции.

 

кусок кода:

1char theChar;
2 
3  File dataFile = SD.open("test.txt");
4 
5theChar = dataFile.read();
6 
7LD.printString_6x8(theChar);                 //  ЭТА СТРОЧКА НЕ ХОЧЕТ КОМПИЛИРОВАТЬСЯ

сам я новичек в ардуино

или помогите в библиотеку SSD1306Ascii   подключить шрифт с поддержкой  английским и русским. 

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

theChar - это не "текст".

genia1991
Offline
Зарегистрирован: 25.12.2019

sadman41 пишет:

theChar - это не "текст".

а можно как нибудь вывести эти данные этой библиотекой?

 

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

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

 

Для начала сделайте это.

 

Судя по Вашему сообщению, Вам нужен вывод не только латиницы, но и кириллицы. Для вывода символа кириллицы нужен массив символов длиной 3, в последнем - 0, а в двух первых - код символа кириллицы (он двухбайтовый). 

 

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

genia1991
Offline
Зарегистрирован: 25.12.2019

спасибо. разобрался )

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

создам новую тему и есть 1 вопрос по русским шрифтам но в другой библиотеке .

спасибо за советы

 

DimaD
Offline
Зарегистрирован: 26.03.2015

Отличная библиотека!

А как организовать такое:

1void loop()
2{
3  long randNumber = random(30000);
4  //LD.clearDisplay();
5  LD.printNumber(randNumber, 0, 0);
6  delay(500);
7}
Если очищать дисплей, то происходит его "мерцание", есть не обновлять, то меньшее число не перекрывает более старшего порядка.

 

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

DimaD пишет:

Если очищать дисплей, то происходит его "мерцание", есть не обновлять, то меньшее число не перекрывает более старшего порядка.

 

не очищайте весь дисплей. просто выводите пробел в старшем разряде

DimaD
Offline
Зарегистрирован: 26.03.2015
1const char str1[] PROGMEM = "Start               .";

предлагаете выводить строку а остальные символы в строке (до 21-го) забивать пробелами?

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

DimaD пишет:

1const char str1[] PROGMEM = "Start               .";

предлагаете выводить строку а остальные символы в строке (до 21-го) забивать пробелами?

я вам такого не предлагал. Вы справшивали, как вылечить ситуацию, когда на экране после вывода "100" при выводе "99" остается лидирующая единица. Ответ - выводить " 99" с пробелом вначале.

А откуда вы взяли строчку из 21 пробела - это не ко мне

shpektr
Offline
Зарегистрирован: 18.02.2020

Доброго дня! Подскажите, пожалуйста, можно ли с помощью библиотеки вывести один пиксель с координатами (x,y)? 

Если нет, то возможно есть варианты как это сделать минуя библиотеку?

Смысл в том, что мне нужно выводить на экран только текст и график по координатам.

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

ты первое сапщение читал? 

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

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

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

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

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

shpektr, пиксельная графика на монохромных дисплеях требует возможности чтения с экрана. Если физически такой возможности нет (как на применяемом дисплее), то чтение можно производить не с экрана, а из экранного буфера. Т.е. для пискельной графики экранный буфер обязателен. Другое дело, что не обязательно буфер должен быть размером с экран, если пиксельная графика занимает лишь часть площади экрана.

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