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

Vik_k

✩✩✩✩✩✩✩
1 Авг 2019
2
0
1106.jpg
вот оно. на той плате понятно два адрес 0х3С и 0х3D.
Перемычки то есть, но хотелось бы знать наверняка. Перерыл весь интернет, неужели ни кому не понадобилось подключать более одного дисплея к ардуино?
 

Zuker

★✩✩✩✩✩✩
10 Янв 2024
75
17
А как сделать буфер на стороне дисплея, как была "затравочка" из описания ?))
Вот нашел , что человек сделал некий вывод без буфера на SSH1106/SH1106 - но в какую библиотеку это добавлено? как понять?
Вывод без буфера на SH1106/SSH1106
Алярм! Ссылочка больше недоступна. Как можно допилить библиотеку гайвера, чтобы SH1106 работал без буфера по SPI?
Нашлась минимальная библиотека без буфера только для I2C-4-контактов (жрет всего 1% памяти) https://github.com/notisrac/SH1106Lib
Для SPI-7-контактов есть разве что u8glib. Но она жрет уже 20%.
 
Изменено:

Dreman

★✩✩✩✩✩✩
25 Апр 2024
15
16
tesanoff.klah.ru
Кстати, комментарий не со всем в тему, но если нужен 1.3" дисплей, то в природе существует вот это: https://sl.aliexpress.ru/p?key=ClOiGym
Там 1306, со всеми сопутствующими плюшками. Я лично проверил и купил себе в запас пару таких экранов.
 
  • Лойс +1
Реакции: Zuker

Krion

✩✩✩✩✩✩✩
6 Янв 2025
1
0
Такой же дисплей попался, писали что 1306, но оказалось 1106. Подошла библиотека #include <OLED_SH1106.h>, брал отсюда
https://duino.ru/oled-sh1106.html/sketch/ или 1106
 

Zuker

★✩✩✩✩✩✩
10 Янв 2024
75
17
@Dreman, заказал 2 шт, действительно 1306. Но есть большой минус - оба экрана заметно мерцают, даже при яркости 255. Впервые вижу такое на OLED. Брак!?
 

Azalis

✩✩✩✩✩✩✩
8 Окт 2019
18
0
Посмотреть вложение 50637
вот оно. на той плате понятно два адрес 0х3С и 0х3D.
Перемычки то есть, но хотелось бы знать наверняка. Перерыл весь интернет, неужели ни кому не понадобилось подключать более одного дисплея к ардуино?
Есть библиотека https://www.google.com/url?sa=t&sou...//github.com/ThingPulse/esp8266-oled-ssd1306/ для 1106 и 1306 но она под esp8266. Там последний пример с двумя экранами
 

VitalyXXL

✩✩✩✩✩✩✩
15 Янв 2021
4
0
@Эдуард Анисимов,Так то оно так .... Только вот беда с ними . Если подключаем по SPI и ещё нужно работать с Serial1/2 портом - на процессоре ESP32 ....конфликтуют . Уже все возможные драйвера пробовал ,.... А с дисплеем по I2C - всё ОК : чтение данных из UART1/2 правильное .Все байты достаёт как надо . Не режет буфер . Как только tftf.init() - всё ,из UART то 9 байт то 10 то15 ... вместо стандартного (с другого устройства) пакета в 24 байта ....Приходится сейчас переписывать код под OLED I2C дисплей . Очень сильно функционал урезается ищ-за разрешения , отсутствия цвета и .... размера .
 

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

★★★★★★★
23 Сен 2019
2,505
1,002
60
Марий-Эл
@VitalyXXL, Был на форуме вопрос по конфликтам в ESP. Там это решили.
И что это за чип такой, где всё друг с другом конфликтует? Если драйвера не подходят, значит нужно написать свой.
 

VitalyXXL

✩✩✩✩✩✩✩
15 Янв 2021
4
0
Чип - HLW8032 . Измеритель для AC-сети . Выплёвывает на скорости 4800 24 байта . их разбираю - читаю где ток , напряжение и т д . Там стандартная библиотека HLW8032 . Есть в Ардуино на GitHUB . Работает правильно . И всё что с экраном по SPI тоже работает правильно . Вместе - не хотят .Я всё лишнее поубирал и выяснил , что при добавлении tft.init() сразу в порт идёт что-то неправильно .

Если не затруднит и вспомните как где кто решил эту проблему ,буду благодарен :)
 

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

★★★★★★★
23 Сен 2019
2,505
1,002
60
Марий-Эл
@VitalyXXL, Если каждая библиотека по отдельности работают, а вместе не хотят.
Это идёт переинициализация портов.
Одна библиотека проинициализировала порты. Подключается вторая библиотека и переинициализирует их по своему. Первая библиотека перестаёт работать.
Решилось переключением SPI на другой порт.
 

VitalyXXL

✩✩✩✩✩✩✩
15 Янв 2021
4
0
Другой порт ? Я не силён в тонкостях "железа" ESP32.... Но как может SPI-библиотека вредить UART-ам . и наоборот ... ? С точки зрения инициализации и задействованных ресурсов . Выводы ESP32 никак не "пересекаются"
В моём коде дисплей ST7789 подключен на выводы GPIO,указанные явно .
Так сделано устройство:
DS - GPIO32
RESET - GPIO33
SDA - GPIO25
SCL - GPIO26
CS - -1 для дисплея без CS, или GPIO13 для плат с наличием CS ;

тестировались оба вида TFT-дисплеев . работают одинаково правильно
Соответственно , в коде есть #define с указанием этих выводов .
Тестирование устройства показало что всё инициализируется и работает как нужно.

Для Serial1 (или Serial2 , не важно ) - используются другие ноги , нежели по дефолту :

RX (приём данных ) - GPIO27
TX (передача данных , но нам она не нужна , мы только принимаем поток данных ) - GPIO14

при инициализации UART - скорость , контроль данных , вводы TX/RX задаются верно ; приём и разбор данных осуществляется без проблем . В точном соответствии с протоколом обмена HLW8032 . Что примеры из соотв.библиотеки , что из моего кода .
Разумеется , имеется согласование уровней 5в микросхемы HLW8032 и нашего 3.3в ESP32 . Иначе и данные не проходили бы (в лучшем случае)

Среда разработки - IDE Arduino 2.0 или Platformio - программа ведёт себя одинаково : по отдельности - всё работает . вместе - нет . как только "включаю" дисплей ( tft.init() ) данные в UART либо не доходят либо неверные .... дисплей при этом работает нормально .
Порядок инициализации тоже не влияет .
что

HLW.begin(....);
затем
tft.init();

что наоборот :
tft.init();
HLW.begin();

ничего не меняет в работе .

Как это победить ... ума не приложу
Если нужно , вечером могу скинуть кода программы для тестирования ....
 

VitalyXXL

✩✩✩✩✩✩✩
15 Янв 2021
4
0
Разумеется . Выбрал незадействованные для других дел выводы ... Всё-ж раздельно работает . и SPI-Дисплей и UART принимает данные ... Если бы ноги были неверно выбраны - не заработало бы :)
Тут уже 200 раз перепроверял .
Вопрос именно в конфликте UART и SPI при одновременной работе ...
китайцы , мать их :(
 

Serg13

✩✩✩✩✩✩✩
20 Фев 2026
3
0
Есть неплохая библиотека U8g2 , но русские шрифты только для для той части , которая с буков G и занимает до фига много памяти, а та часть u8x8 маленькая, но шрифтов русских там нет.
Если у кого есть ссылка на нужную библиотеку (SH1106 , русские шрифты!) то поделитесь ссылкой.
Здравствуйте! Вероятно, для Вас уже не актуально. Вопрос.
Предыстория: понадобился дисплейчик поболее 0,91”. Купил 1,3” (подобный https://community.alexgyver.ru/threads/displei-oled-sh1106-obsuzhdenie.2632/post-175240), думал что ssd1306, и даже запустил его с U8g2, правда с небольшими огрехами - смещение по X на 5 пикселей и справа два столбца с постоянной подсветкой (подумал - брак). Но попался отзыв в «магазине», где сообщалось, что этот дисплей оказывается с SH1106. Проверил на ADAFRUIIT и U8g2 - действительно всё корректно отображает (у меня с ESP32-C3).
Теперь суть вопроса. Собрал как-то кириллические шрифты из описания к библиотеке U8g2 и некоторые цифры (разместил в отдельной вкладке скетча для удобства)
:
C++:
//Кириллические шрифты для u8g2_lib (W-ширина, H-высота, B-bold/жирный):
// ------------------------------------------------------------------
// Шрифты Crox закодированы в соответствии со стандартом ISO 8859-5
// https://en.wikipedia.org/wiki/ISO/IEC_8859-5
// Все остальные шрифты с кириллическими символами закодированы Юникодом
// https://en.wikipedia.org/wiki/Cyrillic_script_in_Unicode
// ------------------------------------------------------------------
/*
 u8g2.setFont(u8g2_font_4x6_t_cyrillic);            //W4 H6     UTF
 u8g2.setFont(u8g2_font_5x7_t_cyrillic);            //W5 H7     UTF
 u8g2.setFont(u8g2_font_5x8_t_cyrillic);            //W5 H8     UTF
 u8g2.setFont(u8g2_font_pxplustandynewtv_t_all);    //W8 H8     UTF
 u8g2.setFont(u8g2_font_t0_11_t_all);               //W6 H11    UTF
 u8g2.setFont(u8g2_font_haxrcorp4089_t_cyrillic);   //W8 H11    UTF
 u8g2.setFont(u8g2_font_boutique_bitmap_9x9_bold_t_gb2312b); //W11 H11  UTF
 u8g2.setFont(u8g2_font_6x12_t_cyrillic);           //W6 H12    UTF
 u8g2.setFont(u8g2_font_6x13_t_hebrew);             //W6 H13    UTF
 u8g2.setFont(u8g2_font_6x13B_t_cyrillic);          //W6 H13    UTF
 u8g2.setFont(u8g2_font_7x13_t_cyrillic);           //W7 H13    UTF
 u8g2.setFont(u8g2_font_8x13_t_cyrillic);           //W8 H13    UTF
 u8g2.setFont(u8g2_font_crox1c_mf);                 //W8 H13    ISO
 u8g2.setFont(u8g2_font_crox1c_tf);                 //W8 H13    ISO
 u8g2.setFont(u8g2_font_crox1cb_mf);                //W9 H13    ISO
 u8g2.setFont(u8g2_font_crox1cb_tf);                //W9 H13  B ISO
 u8g2.setFont(u8g2_font_crox1t_tf);                 //W10 H13   ISO
 u8g2.setFont(u8g2_font_crox1h_tf);                 //W11 H13   ISO
 u8g2.setFont(u8g2_font_crox1tb_tf);                //W11 H13 B ISO
 u8g2.setFont(u8g2_font_crox1hb_tf);                //W12 H13 B ISO
 u8g2.setFont(u8g2_font_boutique_bitmap_7x7_t_all); //W16 H14   UTF
 u8g2.setFont(u8g2_font_9x15_t_cyrillic);           //W9  H15   UTF
 u8g2.setFont(u8g2_font_nine_by_five_nbp_t_all);    //W10 H15   UTF
 u8g2.setFont(u8g2_font_pxplusibmvga8_m_all);       //W8  H16 B UTF
 u8g2.setFont(u8g2_font_pxplusibmvga8_t_all);       //W8  H16 B UTF
 u8g2.setFont(u8g2_font_pxplusibmvga9_m_all);       //W9  H16 B UTF
 u8g2.setFont(u8g2_font_pxplusibmvga9_t_all);       //W9  H16 B UTF
 u8g2.setFont(u8g2_font_crox2c_mf);                 //W9  H16   ISO
 u8g2.setFont(u8g2_font_mercutio_basic_nbp_t_all);  //W10 H16   UTF
 u8g2.setFont(u8g2_font_mercutio_sc_nbp_t_all);     //W10 H16   UTF
 u8g2.setFont(u8g2_font_crox2cb_mf);                //W10 H16 B ISO
 u8g2.setFont(u8g2_font_glasstown_nbp_t_all);       //W12 H16   UTF
 u8g2.setFont(u8g2_font_crox2h_tf);                 //W13 H16   ISO
 u8g2.setFont(u8g2_font_crox2t_tf);                 //W13 H16   ISO
 u8g2.setFont(u8g2_font_crox2hb_tf);                //W14 H16 B ISO
 u8g2.setFont(u8g2_font_crox2tb_tf);                //W14 H16 B ISO
 u8g2.setFont(u8g2_font_unifont_t_cyrillic);        //W16 H16   UTF
 u8g2.setFont(u8g2_font_unifont_t_gb2312b);         //W16 H16   UTF
 u8g2.setFont(u8g2_font_boutique_bitmap_9x9_bold_t_all); //W20 H16  UTF
 u8g2.setFont(u8g2_font_Born2bSportySlab_t_all);    //W16 H16   UTF
 u8g2.setFont(u8g2_font_boutique_bitmap_9x9_t_all); //W20 H16   UTF
 u8g2.setFont(u8g2_font_rosencrantz_nbp_t_all);     //W11 H17   UTF
 u8g2.setFont(u8g2_font_guildenstern_nbp_t_all);    //W11 H17   UTF 
 u8g2.setFont(u8g2_font_shylock_nbp_t_all);         //W12 H17   UTF
 u8g2.setFont(u8g2_font_crox3t_tf);                 //W18 H19   ISO *
 u8g2.setFont(u8g2_font_crox3tb_tf);                //W19 H19 B ISO
 u8g2.setFont(u8g2_font_10x20_t_cyrillic);          //W10 H20   UTF           
 u8g2.setFont(u8g2_font_crox3c_mf);                 //W12 H20   ISO
 u8g2.setFont(u8g2_font_crox3cb_mf);                //W13 H20   ISO
 u8g2.setFont(u8g2_font_crox3h_tf);                 //W15 H20   ISO
 u8g2.setFont(u8g2_font_crox3hb_tf);                //W16 H20 B ISO
 u8g2.setFont(u8g2_font_crox4t_tf);                 //W17 H21   ISO
 u8g2.setFont(u8g2_font_crox4tb_tf);                //W18 H21 B ISO
 u8g2.setFont(u8g2_font_cu12_t_cyrillic);           //W21 H22   UTF
 u8g2.setFont(u8g2_font_crox4h_tf);                 //W18 H24   ISO
 u8g2.setFont(u8g2_font_crox4hb_tf);                //W19 H24 B ISO
 u8g2.setFont(u8g2_font_crox5t_tf);                 //W23 H27   ISO
 u8g2.setFont(u8g2_font_crox5tb_tf);                //W24 H27 B ISO
 u8g2.setFont(u8g2_font_crox5h_tf);                 //W24 H29   ISO
 u8g2.setFont(u8g2_font_crox5hb_tf);                //W25 H29 B ISO
 u8g2.setFont(u8g2_font_inr24_t_cyrillic);          //W20 H38   UTF
 u8g2.setFont(u8g2_font_inr27_t_cyrillic);          //W22 H42   UTF
 u8g2.setFont(u8g2_font_inr30_t_cyrillic);          //W24 H47   UTF
 u8g2.setFont(u8g2_font_inr33_t_cyrillic);          //W26 H50   UTF
 u8g2.setFont(u8g2_font_inr38_t_cyrillic);          //W30 H58   UTF
 u8g2.setFont(u8g2_font_inr42_t_cyrillic);          //W33 H64   UTF
 u8g2.setFont(u8g2_font_inr46_t_cyrillic);          //W36 H70   UTF
 u8g2.setFont(u8g2_font_inr49_t_cyrillic);          //W39 H75   UTF
 u8g2.setFont(u8g2_font_inr53_t_cyrillic);          //W42 H81   UTF
*/
/*  Применение:
 u8g2.clearBuffer();                   // очистка буфера дисплея
 u8g2.setFont(u8g2_font_crox2tb_tf);   // W14 H16 B ISO  (Шрифты выбираем во вкладке Fonts_Cyrillic)
  PrintRusStr(7, 12, "Ваш текст", 1);  // Х(7), Y(12), последний параметр 1 - ISO, 0 - UTF  шрифт
 u8g2.sendBuffer();                    // Отображаем содержимое буфера дисплея
 */
// ------------------------------------------------------------------
// ЦИФРЫ (и латиница):
// ------------------------------------------------------------------
/*
 u8g2.setFont(u8g2_font_10x20_mr);            //W10 H20
 u8g2.setFont(u8g2_font_crox3hb_tf);          //W16 H20 B
 u8g2.setFont(u8g2_font_helvB18_tn);          //W13 H22
 u8g2.setFont(u8g2_font_courB18_tr);          //W16 H22
 u8g2.setFont(u8g2_font_crox4h_tr);           //W18 H24
 u8g2.setFont(u8g2_font_crox4hb_tf);          //W19 H24 B
 u8g2.setFont(u8g2_font_courB24_tn);          //W18 H28
 u8g2.setFont(u8g2_font_crox5h_tr);           //W23 H29
 u8g2.setFont(u8g2_font_crox5hb_tf);          //W25 H29 B
 u8g2.setFont(u8g2_font_ncenB24_tn);          //W19 H30
 u8g2.setFont(u8g2_font_timB24_tn);           //W17 H31
 u8g2.setFont(u8g2_font_helvB24_tn);          //W17 H31
 u8g2.setFont(u8g2_font_7_Seg_33x19_mn);      //W19 H31   цифры сегментные (начало координат - с левого верхнего! сегмента глифа)
 u8g2.setFont(u8g2_font_courB24_tf);          //W22 H33
 u8g2.setFont(u8g2_font_calblk36_tr);         //W22 H33
 u8g2.setFont(u8g2_font_t0_40_tr);            //W18 H38
 u8g2.setFont(u8g2_font_t0_40_me);            //W18 H39
 u8g2.setFont(u8g2_font_t0_40b_me);           //W18 H39
 u8g2.setFont(u8g2_font_7_Seg_41x21_mn);      //W21 H39   цифры сегментные (начало координат - с левого верхнего! сегмента глифа)
 u8g2.setFont(u8g2_font_t0_40_me);            //W18 H40
 u8g2.setFont(u8g2_font_7Segments_26x42_mn);  //W32 H42   цифры сегментные (начало координат - с левого нижнего! сегмента глифа)
 u8g2.setFont(u8g2_font_logisoso62_tn);       //          цифры  - на весь экран (128x64)!
 
 u8g2.setFont(u8g2_font_unifont_t_emoticons); //W16 H16   смайлики 32/0020   144/0090
 u8g2.setFont(u8g2_font_emoticons21_tr);      //W21 H21   смайлики 32/0020   48/0030 -0037
*/ // ------------------------------------------------------------------
 
/*  // в цикле рисуем смайлики (по коду символов)
  u8g2.setFont(u8g2_font_unifont_t_emoticons); //W16 H16   смайлики от 32/0020 до 144/0099
  for (int g = 1, x = 1, a = 0x0029; g < 9; g++, x += 16, a += 1) { // выводим первые 8 смайлов
  int y = 16;
  u8g2.drawGlyph(x, y, a); // x, y - координаты; a - код символа
  }
*/
Нашёл функцию для отображения ISO-шрифтов и чуть изменил для однообразия (добавил последний параметр):
C++:
/*Пример (с изменениями) применения драйвера U8G2_SH1106_128X64 к OLED 1,3"
  и вывода на печать кириллических шрифтов
  PrintUTF8.ino
  Use the (Arduino compatible) u8g2 function "print"  to draw a text.
  Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)
*/
 
#include <Arduino.h>
#include <U8g2lib.h>
 
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
 
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
 
//------------------------------------------------------------------------------------------------------
// функция печатает русскими буквами Шрифты Crox, закодированные в соответствии со стандартом ISO 8859-5
// Источник: https://github.com/olikraus/u8g2/issues/1815 ; Автор: https://github.com/andreydk1981
// Изменено: добавлен четвёртый параметр
//------------------------------------------------------------------------------------------------------
void PrintRusStr(int x, int y, String source, bool M_ISO) // последний параметр 1 - ISO, 0 - UTF
{
  if (M_ISO) {  //если флаг 1, печатаем шрифт ISO
    int i, k;
    String target;
    unsigned char n;
    char m[2] = {'0', '\0'};
    k = source.length();
    i = 0;
    
    while (i < k)
    {
      n = source[i];  i++;
      if (n >= 0xC0)
      {
        switch (n)
        {
        case 0xD0:
          n = source[i];  i++;
          if (n == 0x81) { n = 0xA8;  break; }
          if (n >= 0x90 && n <= 0xBF) { n = n + 0x30; }
          break;
          
        case 0xD1:
          n = source[i];  i++;
          if (n == 0x91) { n = 0xB8;  break;  }
          if (n >= 0x80 && n <= 0x8F) { n = n + 0x70; }
          break;
        }
      }
      m[0] = n;  target = target + String(m);
      u8g2.drawStr(x, y, target.c_str());
    }
 
  } else {  // печатаем шрифт UTF8
    u8g2.setCursor(x, y);
    u8g2.print(source.c_str());
  }
} //-----------Конец  PrintRusStr()-----------
 
void setup(void) {
  u8g2.begin();
  u8g2.enableUTF8Print();   // enable UTF8 support for the Arduino print() function
}
 
void loop(void) {
  u8g2.setFont(u8g2_font_unifont_t_chinese2);  // use chinese2 for all the glyphs of "你好世界"
  u8g2.setFontDirection(0);
  u8g2.clearBuffer();
  u8g2.setCursor(0, 15);
  u8g2.print("Hello World!");
  u8g2.setCursor(0, 40);
  u8g2.print("你好世界");   // Chinese "Hello World"
  //u8g2.setFont(u8g2_font_5x7_t_cyrillic);       // W5 H7    UTF
(Шрифты выбираем во вкладке Fonts_Cyrillic)
   u8g2.setFont(u8g2_font_crox1hb_tf);            //W12 H13 B ISO
  PrintRusStr(0, 60, "Привет, МИР!",  1);         // последний параметр 1 - ISO, 0 - UTF
  u8g2.sendBuffer();
 
  delay(1000);
}
По уму - надо бы избавиться от параметра и сделать автоматическое определение типа шрифта (ISO-UTF). Можно ли и как? Благодарю заранее за любые подсказки.