Дисплеи OLED SH1106, обсуждение

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Есть неплохая библиотека U8g2 , но русские шрифты только для для той части , которая с буков G и занимает до фига много памяти, а та часть u8x8 маленькая, но шрифтов русских там нет.
Если у кого есть ссылка на нужную библиотеку (SH1106 , русские шрифты!) то поделитесь ссылкой.
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Уже знаешь, что нет... Библиотеки для того, что бы без танце с бубнами их пользовать. Вот в библиотеке
===== ДЕФАЙНЫ =====
OLED_NO_BUFFER - не использовать буфер вообще (активно по умолчанию)
OLED_HARD_BUFFER_64 - буфер на стороне дисплея (только для SSH1106)
OLED_SOFT_BUFFER_32 - буфер на стороне МК (для 128x32)
OLED_SOFT_BUFFER_64 - буфер на стороне МК (для 128x64)
USE_MICRO_WIRE - использовать библиотеку microWire.h (сильно облегчает код)
SH1106 ни с HARD 64 ни с SOFT 64 не работает - мусор на экране
SSD1306 с SOFT не заработал - мусор, а с HARD да! получил надпись из примера.
 

sshimko

✩✩✩✩✩✩✩
13 Май 2022
1
0
Добрый день!
Помогите пожалуйста дописать скетч термометра на катер...
Все мозги уже сломал, ничего не вышло...

Нужно чтобы при превышении порога температуры скажем 95 градусов включалась пищалка и экран инвертировался туда-сюда...
после снижения ниже указного порога пищалка и моргалка отключались...


image0.jpeg
OIL_Temp:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <GyverOLED.h>

#define ONE_WIRE_BUS 2 // номер пина к которому подключен DS18B20

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
GyverOLED<SSH1106_128x64> oled;

void setup() {
  sensors.begin();
  // устанавливаем разрешение датчика от 9 до 12 бит
  sensors.setResolution(12);
  oled.init();              // инициализация
 
}

void loop() {
  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0);
  oled.clear();
  oled.setScale(2);
  oled.setCursor(35, 0);
  oled.print("МАСЛО");
  oled.setScale(4);
  oled.setCursor(5, 4);
  oled.print(tempC);
  oled.update();
  delay(100);
 
}
 

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
91
9
Доброго дня!
Помогите , плиз, разобраться с дисплеями..
Интро: за несколько последовательных покупок купил экраны с алиэкспресс, выбирал по описанию товара, чтоб чип был SSD1306 чтоб воспользоваться библиотекой GyverOLED, по факту - получил экраны с непонятно какими чипами управления..

1.jpg
Первый слева - работает чётко , объявлял как GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
!!! хотя на али он подписан как SSH1106 - хотел именно это опробовать , ибо привлекла подпись в описании библиотеки :
- TODO: Буфер на стороне дисплея (только для SSH1106!!!)
Не понял про TODO - что это значит.. ?? короче купил первые экраны как 1106, а он заработал под <SSD1306_128x64, OLED_NO_BUFFER>.

Ну ладно, вроде работает... написал код - всё норм :
20230803_150746.jpg

-------------------------
Далее захотелось экран побольше , нашел с диагональю 1,3" - по описанию было указано , что у него чип SSD1306 - ну думаю - ништяк, чисто перекинуть экран и поехали дальше без переделок кода вообще -- но , как всегда китайские дядя передал привет с йух-ом завёрнутым в газетку (((
Переподключив экран получаем такое :
20230803_151425.jpg пляшущщий снег... видимо чип не 1306 , а 1106 - типо чипа не связан с типом подключения ?? Типо I2C - 4 пина и чип 1306, а SPI- 7 пинов и 1106 чип??как дело обстоит?(
Попробовал далее этот большой экран запустить как
GyverOLED<SSH1106_128x64> oled;

В итоге чето поменялось на том же самом коде стало вот что показывать :
20230803_151029.jpg Только заголовки меню написались, данные не вышли на экран..
Хотелось бы запустить именно большие экраны, если получится))

================================
И последний экран - по середине , по описанию на али шел как SSD1306 - но он не запускается ни с каким методом объявления (( - хз че делать , попробую еще пару экранов проверить , мож этот просто дохлый попался..
================================


Как исправить вывод когда на большой экран ?-
по примерам из библиотеки Алекса - oled_demo.ino там какраз вывод через
GyverOLED<SSH1106_128x64> oled;

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

Вот кусок кода, который выводит страницу , что на фотках :

Блок вывода меню + инфо:
if(f_mask_sheet == false){  // проверяет - написана ли маска меню , выводит , а потом только выводит дату, без перерисовки маски.
            tmp_disp=workMode;
            oled.setScale(1);
            oled.clear();
            oled.setCursor(5,0);
            oled.println(F(" ПРОГ>"));
            oled.println(F("\n-УР.Д1:"));
            oled.println(F("\n-УР.Д2:"));
            oled.println(F("\n-УР.ФТ:"));  // меню 0
            oled.update();
            Show_result(workMode,0);
            oled.setScale(1);
            oled.print(" (");
            oled.setScale(2);
            oled.print(status_D1_prog);
            oled.setScale(1);
            oled.print(":");
       
            oled.print(status_D2_prog);
            oled.print(") ");
            oled.print(status_D2_drop);
            oled.update();
            f_mask_sheet = true;
        }
        if( !f_modify && My_delay(500)){ // если страница активная, что выводит инфу м датчиков
            Show_result(analogRead(D1),2); // выводит напротив нужной подписи.
            Show_result(analogRead(D2),4);
            Show_result(analogRead(FT_PIN),6);
            //oled.update();
        }
//-----------------------------
boolean My_delay(uint16_t x){
  if((millis()-timer_data>= x)){
    timer_data = millis();
    return true;
  }else{
    return false;
  }
}
void Show_result(int32_t data, uint8_t str){
  oled.clear(50,str*8,122,(str*8+15)); // очистка области от старых данных
  oled.setCursor(50,str);
  oled.setScale(2);
  oled.print(data);
  oled.update();
}

Если есть мысли - помогите плиз раскидать такое 🙏

===================================
+
попробовал к большому экрану применить пример oled_demo через объявление SSH1106 - нормально работает.
тогда почему мой код выводится странно ?
искать буду дальше))

=============================

Разобрался чуть чуть :
При объявлении GyverOLED<SSH1106_128x64> oled; в памяти ардуины сразу бронируется дополнительно 1028 байт.. 1024 байта - на каждый пиксель экрана и плюс еще 4 байта непонятно на что.

А как сделать буфер на стороне дисплея, как была "затравочка" из описания ?))
Вот нашел , что человек сделал некий вывод без буфера на SSH1106/SH1106 - но в какую библиотеку это добавлено? как понять?
Вывод без буфера на SH1106/SSH1106
 
Изменено:

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
91
9
Экран 1,3" SSH1106 работает 🥳🥳 , но не так как хотелось бы ( в сравнении с экраном на чипе SSD1306) в части скорости вывода.

0.96" SSD1306 прекрасно работает на частоте 400k ,без зависаний и без буфера:
Wire.setClock(400000L);

Но 1,3" SSH1106 при частоте Wire более 90k - начинает зависать в разное время, то через 5 секунд..то через пару минут. - на частоте 90К экран прям вялый совсем, ощутимо медленно (( - что делать?
Как отключить буфер , чтоб вывод стал прямой вывод текста?
 

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
91
9
@Геннадий П,
Это что сделать нужно? не очень понимаю :)

@Эдуард Анисимов,

А на какой библиотеке работает и сколько памяти нужно будет ?

Щас вот так - с буфером в памяти :(

RAM: [========= ] 92.9% (used 1903 bytes from 2048 bytes) - из них 1028 байт на буфер под экран
Flash: [==========] 97.2% (used 29848 bytes from 30720 bytes)
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,799
579
44
@Mix_man, Подтягивающие резисторы, как правило 4.7 кОм. Проверьте, на модуле с дисплеем есть или нет.
1691351041436.png
 

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
91
9
@Геннадий П,
там 2 по 101 Ом - проверил прибором.
20230807_025429.jpg
Как выбрать - на сколько перепаивать ? разброс довольно большой 2-10кОм , почему так мало установлено , относительно рекомендаций на фото?
--------------------
ААА- я понял, что не то понял ))
Нарисовано жэш - паралельно к линии приделать резисторы , а не на плате чтото менять :) ,
и всёравно - сколько приделывать паралельно? и что это даст в итоге? - позволит работать экрану на более высокой частоте?

20230807_031721.jpg

Вот так будет правильно сделать?
вот какие есть номиналы резисторов - как определить более точно какой взять? :rolleyes:
 
Изменено:

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
91
9
@Эдуард Анисимов,
Ага, усвоил, попробую 4,7кОм припаять - что ожидать от этого действия?- станет стабильнее работать на более высокой частоте?
 

poty

★★★★★★✩
19 Фев 2020
2,956
886
Правильные резисторы померили? Нужно мерить между SDA и +5В, SCL и +5В.
 

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
91
9
@poty,
Замерил на экране между SDA и +5В, SCL и +5В. - получилось , что там по 3,370 МОм..
Что это даёт? :rolleyes:

---------
Резисторы ,которые 4,7 кОм тоже померил - один 4,604кОм , второй 4,642кОм - можно все 20 перемерить, найти более менее одинаковые пары, если прям надо )
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,695
472
Это значит, что на плате подтягивающих резисторов нет.
один 4,604кОм , второй 4,642кОм
Это погрешность, так и должно быть.
можно все 20 перемерить, найти более менее одинаковые пары, если прям надо )
Не надо ничего мерять. Припаивайте 2 штуки, между SDA и +5В, SCL и +5В. Потом работайте дальше с вашей схемой.
 

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
91
9
@PiratFox, Припаял, протестировал - теперь виснет на всех частотах . Чтото не в ту сторону копаем.

Тут же вот откусил резисторы - и экран заработал на старой частоте 90к.
А что на счёт отключения буфера для SSH1106? - частота работы не сильно критично, описание какбудто не доделанное в библиотеке GyverOLED, в шапке нигде нет информации про это, и на сайте в описаниях к библиотеке.

Вывод без буфера на SH1106/SSH1106

Экран, что посередине 0.96" GM009605 v4.2, который никак не хотел работать - оказался просто глюченным и попался самым первым из мешка🤣
взял другой - сразу всё пошло на стандартных настройках + без буфера + на высоком быстродействии Wire.setClock(400000L);
и с повышенной скоростью оцифровки setADCrate(4); // mode 4: 15.12 мкс (частота оцифровки 66 100 кГц) - не совсем чётко понятно для чего повышать скорость , стандартной хватало ,впринципе. Чтото из разряда: "может ?- ну тогда работай" 😜


-----
С быстродействием SSH1106 пока нет успехов.
 

Prosto_Alex

✩✩✩✩✩✩✩
23 Янв 2024
1
0
добрый день!
а как в этой библиотеке для i2c поменять пины? (использую esp32)
Та же u8g2 с моим SH1106 работает нормально, если указать (U8G2_R0, /* clock=/ 1, / data=*/ 12,..
Но есть проблема - она работает только с буфером, а значит - я не могу нормально обновлять текст на разных строках - только обновляя весь дисплейчик целиком, что крайне неудобно.
 
Изменено: