GyverOLED. Вопросы по библиотеке

v.palchik

✩✩✩✩✩✩✩
22 Ноя 2020
5
0
тогда попробуйте beta там хоть понятно что всё учтено, честно в этой новой библиотеки подключен print.h, через него что-то работает... Если с https://github.com/AlexGyver/GyverLibs/tree/master/GyverOLED [beta] 7мая строка заработает, тогда надо будет копать.... просто напрямую я вообще не нашёл в этом классе функции println, если она и срабатывает, то где то через print.h
С библиотекой beta все работает. Спасибо! В таком случае буду использовать данную библиотеку, чтобы не тратить время на поиск ошибок в новой.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Попробуйте в новой работать через функции setcursor и write, думаю всё получится
 
  • Лойс +1
Реакции: v.palchik

AndrySmart

✩✩✩✩✩✩✩
12 Дек 2018
38
2
Киев
блин не все гладко с этой библиотекой.
у меня никак не возможно изменить координаты текста увеличенного.

хочу в первой строке слово "НАПРЯЖЕНИЕ" маленьким шрифтом а ниже само значение большим шрифтом ....

oled.setCursorXY
oled.setCursor
не действуют на большой шрифт.

подскажите реально ли как то это реализовать?

C++:
#include <GyverOLED.h>
// попробуй с буфером и без
GyverOLED<SSD1306_128x32> oled;
// можно передать адрес: GyverOLED oled(0x3C);
void setup() {
  Serial.begin(9600);
  oled.init();              // инициализация
  Wire.setClock(400000L);   // макс. 800'000
 
}

void loop() {
    oled.clear();
    oled.autoPrintln(true);
    oled.update();
    oled.setScale(0);
    oled.home();
    oled.setCursor(16, 0);
    oled.println("НАПРЯЖЕНИЕ");
    oled.setScale(3);
    oled.print("0.1234V");
    oled.update();
    delay(10000);
 }
 

AndrySmart

✩✩✩✩✩✩✩
12 Дек 2018
38
2
Киев
не вижу чтобы в коде вы переходили на строчку ниже при втором выводе
да сcqxfc в коде этого нет. но я перепробовал все.

oled.setCursorXY
oled.setCursor

это все не действует.

даже вместо
oled.print("НАПРЯЖЕНИЕ");
использовал
oled.println("НАПРЯЖЕНИЕ");
по идее переходит на следующую строку. но у меня этот переход слишком большой получается.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
А так можно? Если разные размеры шрифтов то и разное количество строк. Не хочу рыть код библиотеки, но такое чувство что надо сперва устанавливать размер, потом переходить на строку, как я понимаю у Вас "напряжение" занимает 3 строки, то есть попробовать сразу после вывода напряжения (использовать принт вместо принтлн) сделать новый размер шрифта и попробовать сеткурсор на строку 4, ну по крайней мере можно поэксперементировать. Сам не пробовал, но может получится.
 
  • Лойс +1
Реакции: bort707

bort707

★★★★★★✩
21 Сен 2020
3,066
914
по идее переходит на следующую строку. но у меня этот переход слишком большой получается.
разберитесь с функцией setCursor - у всех она работает, а у вас нет...
Приведите полный код скетча, где вы пробуете переходить на другую строку
 

AndrySmart

✩✩✩✩✩✩✩
12 Дек 2018
38
2
Киев
разберитесь с функцией setCursor - у всех она работает, а у вас нет...
Приведите полный код скетча, где вы пробуете переходить на другую строку
может вы просто покажете кусок кода, где у вас работает?
маленький текст позиционируется а вот большой нет.
вот как напечатать большим текстом в точке скажем 5,8?
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@AndrySmart, я не нашёл функции setScale в библиотеке, на которую была ссылка несколькими постами выше.
Beta-версия работает только с двумя размерами шрифтов, у Вас - setScale(3) - не ошибка?
 

AndrySmart

✩✩✩✩✩✩✩
12 Дек 2018
38
2
Киев
@AndrySmart, я не нашёл функции setScale в библиотеке, на которую была ссылка несколькими постами выше.
Beta-версия работает только с двумя размерами шрифтов, у Вас - setScale(3) - не ошибка?
смотря какая. первая да а вторая с 4мя.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
может вы просто покажете кусок кода, где у вас работает?
маленький текст позиционируется а вот большой нет.
вот как напечатать большим текстом в точке скажем 5,8?
Нет экрана под рукой. Просто скажите сколько строк в Вашем дисплее? тот, что 128х64 имеет 8 строк, от 0 до 7... Ещё вопрос, сколько строк занимает занимает большой шрифт. Сделайте скетч, который даст это понять. Алгоритм простой, сперва делаете большой шрифт, потом поставьте курсор в 0,0 и что нить выведете, допустим 123, потом сет курсор в 1,0, выведите 345. Был бы экран под рукой, я бы сам опробовал. Есть подозрение, что Вы выводите информацию вне экрана... Если большой шрифт занимает хотя бы 2 строки, то в точке 5,8можно что угодно напечатать, вот только это может оказаться за пределами экрана.
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@AndrySmart, в таком случае указывайте точно библиотеку, про которую пишете. Ссылку, например.
 
  • Лойс +1
Реакции: DAK

AndrySmart

✩✩✩✩✩✩✩
12 Дек 2018
38
2
Киев
вот эта библиотека

короче вся беда в позиционировании по У координате. по Х все работает а по У только с мелким шрифтом. с большими почему то очень большой шаг получается
 

a_vel

✩✩✩✩✩✩✩
29 Сен 2021
8
1
Всем привет!
Пытаюсь запилить меню. Посмотрел урок на канале, сделал похожий код -- и у меня, в отличие от примера из урока, строки выводятся со смещением.

Код:
C++:
#include <Arduino.h>
#include <Wire.h>
#include <TimeLib.h>
#include <time.h>
#include <DS1307RTC.h>
#include <GyverEncoder.h>
#include <GyverOLED.h>
// #include <U8x8lib.h>


#define EVERY_MS(x) \
  static uint32_t tmr;\
  bool flag = millis() - tmr >= (x);\
  if (flag) tmr += (x);\
  if (flag)


GyverOLED<SSD1306_128x64, OLED_BUFFER> oled(0x3C);


void setup() {
  Serial.begin(9600);
  oled.init();
  oled.setContrast(15);
  oled.clear();
}


void loop() {
  oled.clear();
  oled.home();
  oled.print
  (F(
    " date: 2021-09-29\n"
    " time: 14:20\n"
    " temp: 28c\n"
    " Ha: 65%\n"
    " Hs: 73%\n"
    " duration: 18:00\n"
    ));
  oled.update();
}
Фото отображения строк:
photo_2021-09-29_15-56-52.jpg

Подключение (пины не перепутаны, не волнуйтесь: SDA => A4, SCL => A5)

photo_2021-09-29_15-56-49.jpg

Плата -- noname Uno, купленная на радиорынке. Контроллер 328p.

Через PROGMEM работает вывод нормально (ещё бы, там ведь циклом)
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
Подключение (пины не перепутаны, не волнуйтесь: SDA => A4, SCL => A5)
А никто и не волнуется. У вас бы вообще отображения бы не было, если бы было перепутано.

По теме, сейчас китайцы выпускают ОЛЕД на кучке разных контроллеров. Все они между собой частично не совместимы. Возможно это ваш случай. Для начала определитесь какой контроллер у вас, потом ищите под него библиотеку. Как правило в более известные библиотеки, чем эта, поддержку вашего контроллера уже завезли.
 
  • Лойс +1
Реакции: a_vel

a_vel

✩✩✩✩✩✩✩
29 Сен 2021
8
1
Спасибо, kostyamat

в связи с вашей подсказкой -- вопрос: как выяснить модель? Знаю адрес i2c экрана, что-то туда кинуть можно?
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
@a_vel, а вот тут затрудняюсь помочь. Посмотрите на странице заказа, свяжитесь с продавцов. Они, как правило, эту информацию не скрывают, им смысла особо нет это делать. Еще на шлейфах цифры есть, можно по ним у Гугл спросить, бывает люди уже стыкались и делятся инфой.

oled.print (F( " date: 2021-09-29\n" " time: 14:20\n" " temp: 28c\n" " Ha: 65%\n" " Hs: 73%\n" " duration: 18:00\n" ));
Попробуйте убрать все " кроме первого и последнего. Что-то меня в таком виде все это смущает.
 
  • Лойс +1
Реакции: a_vel

a_vel

✩✩✩✩✩✩✩
29 Сен 2021
8
1
Попробовал, результат идентичен) в общем то, с помощью цикла выводить наверное даже правильно.

Теперь нужно функцию писать, которая будет какие-то параметры выводить в эти строки, а не тупо хардкод текст -- пока собираюсь идти путём модификации функции, которая собственно собирает буфф из progmem и печатает его.
 
  • Лойс +1
Реакции: kostyamat

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
\r (Возврат каретки) → перемещает курсор в начало строки, не переходя к следующей строке
\n (Подача строки) → перемещает курсор вниз к следующей строке, не возвращаясь к началу строки — В среде *nix \n перемещается к началу строки.
\r\n (Конец строки) → комбинация \r и \n

Попробуй в конце строки ставить \r\n.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
@a_vel, Ну вот. Получается, дисплей работал согласно своим функциям. Это фича, а не баг. :geek:
 

FrezerTop

✩✩✩✩✩✩✩
22 Июн 2021
1
0
Подскажите как поменять шрифт в GyverOled функция setFont не работает.
 

ru3gp

✩✩✩✩✩✩✩
6 Янв 2022
3
0
Всем здравствуйте!
Поясните пожалуйста, пытаюсь вывести текст в самый низ дисплея 128х64. Высота шрифта (1) = 7 пикселей, если указываю позицию у = 56, все отображается, но снизу остается еще один пиксель, а если указать у = 57, то ничего не отображается. Для наглядности нарисовал вертикальную линию на весь дисплей. Тоже самое и с шрифтом (2), но уже 2 пикселя остается снизу. В этой библиотеке так и должно быть? Или я чего то не допонимаю? Возможно это для разделения строк, чтобы не сливались.
C++:
#include <GyverOLED.h>

// примеры:
//GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;
GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;

void setup() {
  oled.init();  // инициализация
  oled.clear();   // очистить дисплей (или буфер)

  oled.line(0, 0,  0, 63);      // вертикальная линия на всю высоту
  //oled.fastLineV(0, 0, 63);   // верт. линия (x, y1, y2)

  oled.setScale(1);             // размер шрифта
  oled.setCursorXY(1, 57);      // курсор в позицию х=0  у=57
  oled.print("ABCDEFGH");

  oled.update();
}

void loop() {

}
Вот если использовать библиотеку <Adafruit_SSD1306.h>, там все нормально, текст ложится на последний пиксель. Тут надо заранее включить цвет текста, иначе не будет отображения. Но с ней весит в 2,5 раза больше, 13048 байт против 5858 байт c GyverOLED. Все же очень заметно)
C++:
#include <Adafruit_SSD1306.h>
/*------------------------------------------------*/
#define OLED_RESET 7
Adafruit_SSD1306 display(OLED_RESET);
/*------------------------------------------------*/
void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // инициализация дисплея по интерфейсу I2C, адрес 0x3C)
  display.clearDisplay(); // очистка дисплея
/*------------------------------------------------*/
  display.drawLine(0, 0, 0, 63, WHITE);

   display.setTextColor(WHITE); // установка цвета текста 
   display.setTextSize(1); // установка размера шрифта
   display.setCursor(1, 57); // установка курсора в позицию
   display.print ("ABCDEFGH");

   display.display();
}
 
void loop() {
 
}
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Поясните пожалуйста, пытаюсь вывести текст в самый низ дисплея 128х64. Высота шрифта (1) = 7 пикселей, если указываю позицию у = 56, все отображается, но снизу остается еще один пиксель, а если указать у = 57, то ничего не отображается.
Не понятно.
Скорее всего нумерация позиции при выводе текста идет с 1 а не с 0.
 

ru3gp

✩✩✩✩✩✩✩
6 Янв 2022
3
0
Тоже так думал, но отсчет идет в обоих вариантах с 0. Тут еще один момент вылез, в <GyverOLED.h> если наложить линию сверху текста, то текст весь пропадает, или не отображается, даже в моем варианте при у=56:

oled.setCursorXY(1, 56); // курсор в позицию х=0 у=56
oled.print("ABCDEFGH");
oled.line(0, 63, 120, 63);

хотя снизу еще один ряд пикселей, если поменять местами, то не происходит смешивание текста и линии, блок текста как бы стирает линию под собой.
В <Adafruit_SSD1306.h> все работает.

P.S. Режим OLED_BUFFER и oled.textMode(BUF_ADD) делает наложение текста, но этот последний пиксель очень нужен мне.
 
Изменено: