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

bort707

★★★★★★✩
21 Сен 2020
3,093
916
Вы уже не первый, кто пишет что строчки на этой либе отображаются неверно.
для ОЛЕД много библиотек, поищите другую.
 
  • Лойс +1
Реакции: ru3gp

ru3gp

✩✩✩✩✩✩✩
6 Янв 2022
3
0
... для ОЛЕД много библиотек, поищите другую.
Спасибо! Попробовал различные варианты и с текстом и с фигурами, с буфером и без, и тоже пришел к такому же выводу. А жаль :(
Но в некоторых проектах возможно эта библиотека и вполне устроит.
 

wertfgh

✩✩✩✩✩✩✩
28 Май 2023
1
0
Можно ли как-то на этой библиотеке инвертировать всё на дисплее по иску ?
 

CHE77

✩✩✩✩✩✩✩
5 Ноя 2020
6
0
Максимальный размер букв 32 пикселя. Это пол экрана. Как сделать во весь экран? Если убрать ограничение масштаба в библиотеке, то криво рисует.
Также не могу вывести заглавную Ё с точками.
 
Изменено:

CHE77

✩✩✩✩✩✩✩
5 Ноя 2020
6
0
Подскажите, пожалуйста. Как вывести символ по его коду?
 

CHE77

✩✩✩✩✩✩✩
5 Ноя 2020
6
0
@CHE77, поясните что вы имеете в виду под символом и кодом - обычно для этого используются шрифты.
делаю обучающий планшет. Нужно по нажатию на матричную клавиатуру 6х6 выводить символ на экран.
Вот могу связать код клавиши с кодировкой ASCII, или по тому коду что в charMap.h (c 32 начинается) и что дальше?
Каким методом вывести символ в OLED?

кирилицу так вывожу
почему то надо создавать массив на 4 байта и затирать последние и даже что вне массива. Иначе полсе нужной буквы выводит мусор на 3 знака.
Понятно что костыль. Вот и решил узнать как правильно это делать.


//customKey с матричной клавитуры от 1 до 33 - кирилица

int j = 2;
char letter[4];
letter[j - 2] = 32;
letter[j - 1] = 32;
letter[j] = -48;
if (customKey < 7) {
letter[j + 1] = -113 + customKey;
} else {
letter[j + 1] = -114 + customKey;
}
letter[j + 2] = 13;
letter[j + 3] = 10;
oled.println(letter);
if (letter == 7) { // для точек Ё
oled.circle(60, 21, 2, OLED_FILL); // четвёртый аргумент: параметр фигуры
oled.circle(69, 21, 2, OLED_FILL); // четвёртый аргумент: параметр фигуры
}


вот думал что с латиницей будет просто
C++:
char letter[1];
customKey = 1;// для моей английской А
letter[0] = customKey + 64;
oled.println(letter);
но вот так выводит букву А
 

Вложения

vortigont

★★★★★★✩
24 Апр 2020
1,021
542
Saint-Petersburg, Russia
Функция печати ищет конец строки, нулевой байт, и будет печатать из памяти байты подряд пока не наткнется на нулл.
попробуйте так:

C++:
char mystring[2] = {0,0};
mysting[0] = 0x40;  // нужный acsii код
Serial.println(mysting);
 
Изменено:
  • Лойс +1
Реакции: CHE77

AdOrherwise1130

✩✩✩✩✩✩✩
31 Дек 2021
1
0
Подскажите размеры букв в зависимости от размера шрифта. В описание к библиотеке и в этой теме ничего не нашел. Опытным путем определил, что размер 2, равен одной строке с высотой 2. А как посчитать ширину? В том плане, что в случае вывода скажем температуры я нехочу обновлять весь дисплей, а только нужную область, только я не понимаю как посчитать точку начала обновляемой зоны.

Пример. Температура: 26. Логично же обновлять только 26 при изменении температурв
 

MIXSUZ

✩✩✩✩✩✩✩
22 Фев 2024
2
0
Подскажите пожалуйста почему не работают примеры из библиотеки ГайверОллед. На экране мусор. Спасибо.
 

MIXSUZ

✩✩✩✩✩✩✩
22 Фев 2024
2
0
Спасибо. Но дисплей подключен верно. Другие библиотеки работают. По поводу указания дисплея. Я ничего не указывал. Там же в примерах все указано. Или я чего то не понимаю, подскажите пожалуйста что может быть.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,280
1,304
Москва
C++:
// примеры:
//GyverOLED<SSD1306_128x32, OLED_BUFFER> oled;
//GyverOLED<SSD1306_128x32, OLED_NO_BUFFER> oled;
//GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;
//GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
//GyverOLED<SSD1306_128x64, OLED_BUFFER, OLED_SPI, 8, 7, 6> oled;
GyverOLED<SSH1106_128x64> oled;
В примерах стоит дисплей 1106 у меня так, я могу спецом его забить) , если дисплй другой, то его и надо выбрать
 

Виталийc

✩✩✩✩✩✩✩
4 Ноя 2024
5
0
Доброго времени суток!
Подскажите пожалуйста, какие строчки в коде gyveroled необходимо поменять, чтобы выводить информацию на дисплей с разрешением 96х16 пикселей?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,280
1,304
Москва
Тут скорее методом тыка. Как правило такие дисплеи корректно отзываются на работу если указать большее разрешение, но ограничивать надо самому уже. При этом будет некоторый перерасход памяти, если использовать буфер
 

Виталийc

✩✩✩✩✩✩✩
4 Ноя 2024
5
0
@Старик Похабыч, все верно, мой дисплей 96х16 корректно отображает символы при установке настроек для дисплея 128х32. Именно и нужно, что ограничить разрешение в данном коде, вот только не знаю какие строки за это отвечают. Допустим есть в коде функция которая понимает что строка закончилась на 127 и переводит на новую строку. Вот где нужно поменять со 127 на 95?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,280
1,304
Москва
По хорошему расковырять библиотеку и сделать свой вариант дисплея. Смотреть надо GyverOLED.h
Там вот есть такие строки:
C++:
#define SSD1306_128x32 0
#define SSD1306_128x64 1
#define SSH1106_128x64 2
...
// ============================ БЭКЭНД КОНСТАНТЫ ==============================
// внутренние константы
#define OLED_WIDTH 128
#define OLED_HEIGHT_32 0x02
#define OLED_HEIGHT_64 0x12
#define OLED_64 0x3F
#define OLED_32 0x1F
...
#define BUFSIZE_128x64 (128 * 64 / 8)
...
Вот надо добавлять поддержку своего варианта. Все нужное прописать и заставить работать.
 

Виталийc

✩✩✩✩✩✩✩
4 Ноя 2024
5
0
@Старик Похабыч, Спасибо за информацию! Однако выход из ситуации нашел путем выставления ограничения на количество символов отображаемых на одной строчке. Для 128х64 или 128х32 это значение было 20. Я же себе поставил 16 и все заработало.
 

LiOH

✩✩✩✩✩✩✩
10 Дек 2024
1
0
Всем привет. А как эту либу подружить с SSD1306 SPI 7 pin?
С либой <Adafruit_SSD1306.h> работает норм.

Пробовал так запускать, но дисплей даже не включается
C++:
#define OLED_SOFT_BUFFER_64

#include <GyverOLED.h>

GyverOLED<SSD1306_128x64, OLED_BUFFER, OLED_SPI, 6, 2, 3> oled;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  oled.init();  // инициализация

  // --------------------------
  oled.clear();   // очистить дисплей (или буфер)
  oled.update();  // обновить. Только для режима с буфером! OLED_BUFFER

  // --------------------------
  oled.home();            // курсор в 0,0
  oled.print("Hello!");   // печатай что угодно: числа, строки, float, как Serial!
  oled.update();
  delay(2000);
}

void loop() {
  // put your main code here, to run repeatedly:

}
 

ivan8811

✩✩✩✩✩✩✩
19 Фев 2025
2
0
здравствуйте, пользуюсь библиотекой GyverOLED (на другую переходить категорически не хочу) и возникла необходимость в функции, которая проверяет закрашен ли пиксель по указанным координатам. Решил дописать, нашел в аналогичной библиотеке(iarduinOLED) нужную функцию:

bool iarduinOLED::getPixel(int x, int y){ // Параметры: № колонки, № строки.
if(x<0 || x>127 || y<0 || y>63){return 0;} // Если заданы некорректные координаты, то выводим 0 (чёрный цвет пикселя).
uint16_t numByte = ( y/8 * 128 ) + x; // Определяем номер байта массива arrBuffer в котором находится пиксель.
uint8_t numBit = y%8; // Определяем номер бита в найденном байте, который соответсвует искомому пикселю.
return bitRead(arrBuffer[numByte], numBit); // Возвращаем цвет пикселя из бита numBit элемента numByte массива arrBuffer.
}

попытался пошаманить чтоб работало в GyverOLED(не получилось):

bool getPixel(int x, int y){ // Параметры: № колонки, № строки.
// if(x<0 || x>127 || y<0 || y>63){return 0;} // Если заданы некорректные координаты, то выводим 0 (чёрный цвет пикселя).
uint16_t numByte = ( y/8 * 128 ) + x; // Определяем номер байта массива arrBuffer в котором находится пиксель.
uint8_t numBit = y%8; // Определяем номер бита в найденном байте, который соответсвует искомому пикселю.
return bitRead(_oled_buffer[numByte], numBit); // Возвращаем цвет пикселя из бита numBit элемента numByte массива arrBuffer.
}

помогите, пожалуйста довести до ума.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
515
152
Решил дописать, нашел в аналогичной библиотеке(iarduinOLED) нужную функцию
Логичнее найти в GyverOLED функцию закраски точки и сделать по аналогии.
Но это тоже вариант "метода тыка", т.к. не известно, всегда ли используется буфер.
Есть функция Рисование точки (кусок из нее)
C++:
    void dot(int x, int y, byte fill = 1) {
        ....
        bitWrite(_oled_buffer[_bufIndex(x, y)], y & 0b111, fill);
Тогда логично предположить, что чтение точки
C++:
bool dotRead(int x, int y) {
    return bitRead(_oled_buffer[_bufIndex(x, y)], y & 0b111);
}
[/CODE]