OLED диагональ 1.3

Logik
Offline
Зарегистрирован: 05.08.2014

Приехал. Хорош. Но.

Logik
Offline
Зарегистрирован: 05.08.2014

Была надежда что можна просто заменить экран с диагональю 0.96. Но 1.3 оказался совсем не пин-то-пин. Выводы питания и земли поменяли местами. Ну не идиоты?! Но ладно, так вот какая хрень. Код работающий на 0.96 не хочет работать с 1.3. Причем не совсес чтоб не работать, он его включает, но весь вывод идет только в первую страницу пикселей - верхние восем. Смотрим видео как один и тот же код на 2-х экранах отображает.

https://www.youtube.com/watch?v=8kUUTRA6pqs

https://youtu.be/gkoXtUhHpdc

Отсюда вопросы, что за контроллер стоит в 1.3 и чем он отличается от 0.96?

alex_r61
Offline
Зарегистрирован: 20.06.2012

У меня всё было указано в названии.

https://ru.aliexpress.com/item/1-3-inch-X-OLED-Schild-for-WeMos-D1-mini-...

SH1106 и адрес 0x3C, с мегой запустил, с ESP8266 пока с глюками. Там ссылка есть.

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

Logik пишет:

Была надежда что можна просто заменить экран с диагональю 0.96. Но 1.3 оказался совсем не пин-то-пин. Выводы питания и земли поменяли местами. Ну не идиоты?!

На самом деле все гораздо хуже: среди 0.96 тоже попадаются разведенные и так, т так. Один из 0.96 у меня уже лишился белого дыма именно по этой причине.

Цитата:

Но ладно, так вот какая хрень. Код работающий на 0.96 не хочет работать с 1.3. Причем не совсес чтоб не работать...

Там контроллер другой - SH1106. По крайней мере у моих, но внешние признаки такие же.

 

PS. Все никак руки не дойдут добавить в ASOLED поддержку этого дисплея.

Logik
Offline
Зарегистрирован: 05.08.2014

Хороше Вам! Я смотрел даташит на SH1106, у него регистры все совсем по другому, врядли он так бы даже  запустился. На самой плате у меня ниче полезного не написано, брал здесь https://ru.aliexpress.com/item/1PCS-1-3-OLED-module-blue-color-IIC-I2C-128X64-1-3-inch-OLED-LCD-LED/32683121416.html?spm=a2g0s.9042311.0.0.AAIT9E 

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

Один из тех дисплеев, что я покупал: https://ru.aliexpress.com/item/1-3-inch-oled-white-display-with-4PIN-4-SPI-default-I2C-Drive-IC-SH1106/32662696567.html

Там явно прописан тип контроллера, соответственно, нашел в И-нете библиотечку для него, проверил - работает. Ну а выяснять соответствие, повторюсь, руки не дошли.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Смотри что пишут в отзывах

 Контролер SH1106. Библиотека OLED_I2C с этим экраном не работает(Кому важно барите с контролером SSD1306 такие экраны есть на 0.96 дюйма) . ВСЁ РАБОТАЕТ КАК НАДО.

То есть контроллер всетаки другой.

В Ардуино замечательно работает под управлением Аdafruit, при чём библиотека именно под SH1106 там имеется специальная, а вот у U8G и U8G2 замечена неприятная особенность: изображение как бы сдвинуто на два пикселя влево, 

У меня к стати с контроллером SSD1306 тоже изображение было сдвинуто на 2х экранах как написано выше.

Logik
Offline
Зарегистрирован: 05.08.2014

Посмотрел на команды SH1106 пристальней. У него совпадает с 1306 включение -  Display OFF/ON    1 0 1 0 1 1 1 d. А остальное почти все не совпадает. Есть тема для справки - https://forum.arduino.cc/index.php?topic=256374.0 И там есть момент "There is only one small difference between SSD1306 and SH1106: The SH1106 controller has an internal RAM of 132x64 pixel. The SSD1306 only has 128x64 pixel." Может оттуда и растет корень проблемы со сдвигом на 2 пикселя.

Logik
Offline
Зарегистрирован: 05.08.2014

Расковырял маленько работу с экраном. Похоже да, таки SH1106. Либ на него посмотрел с гитхаба, все типа SSD1306&SH1106, внутри всех кроме одной - шлак. Люди пишут что попало, смешивают адреса регистров одного и второго. Вобщем програмные различия этих контролеров:

1. Часть регистров управления не совпадает. Часть совпадает, что видно и провоцирует бардак.

2. Буфер под экран в 132 пикселя - это по два невидимых по краям получается для 128-пиксельного, потому каждую страничку выводить начиная с смещения в два пикселя. Отсюда и смещения появляются при применении либ не с той "кривизной" что у железа. Правим запись в регистры SH1106 SETLOWCOLUMN и SETHIGHCOLUMN.

3. Самое неприятное. У SSD1306 была такая фишка. После записи последнего байта страницы, по адресу 127, следующий автоматом пишется в следующую страницу на адрес 0. Это позволяло загонять хоть все 1024 байта сразу, одной транзакцией. У SH1106 переход на следующую страницу не происходит, а адрес после 127 идет 128, что вполне логично, затем 129 и только потом 0. Потому передавать данные приходится постранично, с командами SET_PAGE_ADDRESS и SETLOWCOLUMN и SETHIGHCOLUMN перед каждой страницей.

Аdafruit - это та в которой?

static uint8_t buffer[SH1106_LCDHEIGHT * SH1106_LCDWIDTH / 8]

не. спасибо поблевал уже.

 

psn26
psn26 аватар
Offline
Зарегистрирован: 12.03.2014

Logik пишет:

...........

Правим запись в регистры SH1106 SETLOWCOLUMN и SETHIGHCOLUMN.

Если не сложно, расскажите подробней

slider
Offline
Зарегистрирован: 17.06.2014

psn26, скачайте с гитхаба либу u8g2 , это новая либа, в ней очень много поддержки всяческих OLED , и разного железа arduino, esp32,...  (как раз сегодня 5штук разных OLED диспов с помощью неё подключал, удачно)

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

На всякий случай отмечу и в этой теме: PS из сообщения №3, уже давно не актуален: http://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-displeya-128kh64-s-kirillitsei-utf-8 поддерживает и SH1106.

Logik
Offline
Зарегистрирован: 05.08.2014

psn26 пишет:

Logik пишет:

...........

Правим запись в регистры SH1106 SETLOWCOLUMN и SETHIGHCOLUMN.

Если не сложно, расскажите подробней

Так что там расскажеш. Тоска одна. Было просто

#define SSD1306_SEND(t,p,l,w,d)                 \
{                                               \
    SSD1306_INIT_SEND(0,t,p,l,w)                \
    sendStart(OLED_ADDR<<1);                    \
    writeByte(OLED_DATA_CONTINUE);              \
    for (int b=0; b<w*p; b++)		            \
    {                                           \
        writeByte(d);                           \
    }                                           \
    sendStop();                                 \
}

а стало сложно

#define SH1106_SEND(t,p,l,w,d)                              \
{                                                           \
    SH1106_INIT_SEND(0,t,p,l,w)                             \
	uint8_t i;                                              \
	uint16_t b;                                             \
	b=0;													\
	for (i=0;i<p; i++)                                      \
	{                                                       \
        sendTWIcommand(SH1106_SET_PAGE_ADDRESS+i+t);        \
	    sendTWIcommand(SH1106_SETLOWCOLUMN+((2+l)&0x0f));   \
	    sendTWIcommand(SH1106_SETHIGHCOLUMN+((2+l)>>4));    \
        sendStart(OLED_ADDR<<1);                            \
        writeByte(OLED_DATA_CONTINUE);                      \
		for (uint8_t a=0; a<w; a++,b++)		                \
		{                                                   \
			writeByte((uint8_t)d);                          \
		}                                                   \
		sendStop();	                                        \
	}                                                       \
}

 

 

psn26
psn26 аватар
Offline
Зарегистрирован: 12.03.2014

Logik пишет:

Так что там расскажеш. Тоска одна. Было просто

 

ОЧЕНЬ спасибо))

Ща попробую разобраться

Logik
Offline
Зарегистрирован: 05.08.2014

чтоб проще понималось дальше в коде

#ifdef SH1106_128_64
#define OLED_SEND(t,p,l,w,d) 		SH1106_SEND(t,p,l,w,d)
#define OLED_INIT_SEND(m,t,p,l,w) 	SH1106_INIT_SEND(m,t,p,l,w)
#else
#define OLED_SEND(t,p,l,w,d) 		SSD1306_SEND(t,p,l,w,d)
#define OLED_INIT_SEND(m,t,p,l,w) 	SSD1306_INIT_SEND(m,t,p,l,w)
#endif


void SSD1306Graphic::update(void)
{
	switch(FrameMode)
	{
		case FRAME_MODE_PGM:updatePGM();break;
		case FRAME_MODE_CALLBACK:updateCallBack();break;
		case FRAME_MODE_BUFER:updateBuf();break;
	}
}

void SSD1306Graphic::updateBuf(void)
{
    if(!Canva)
        return;
    OLED_SEND(Top, Pages, Left, Width, Canva[b]);
}

void SSD1306Graphic::updatePGM(void)
{
    if(!Canva)
        return;
    OLED_SEND(Top, Pages, Left, Width, pgm_read_byte(Canva));
}
void SSD1306Graphic::updateCallBack(void)
{
    if(!Canva)
        return;
    OLED_SEND(Top, Pages, Left, Width, ((byte (*)(uint16_t))Canva)(b))
}

 

m.ix
m.ix аватар
Offline
Зарегистрирован: 16.04.2019

на тихере тоже купил дисплей.

описание @@@@ ППЦ

на деле ISP по умолчанию, там без какой то там матери толком не запустишь торлком.

Да ещё и двухцветный.

Погуглил и кое как подключил по квадратной шине, там отпаять, туда перепаять, сям резистор туда то завести.

Logik
Offline
Зарегистрирован: 05.08.2014

И ради такого безценного сообщения регились?