OLED дисплей на SSD1306 (SH1106?) кто нибудь юзал?

  • Васисуалий
  • 9 Окт 2025
Рещил я поднять тему... Затея не заброшена и медленно развивается. Я в смысле про индикатор и спрайты...

Ну для начала я порыл затырнеты и наткнулся на вот это >>  ссылка скрыта от публикации 

722-09.jpg


Мне понравилась эта шкала, хотя поменять ее можно в любой момент. Однако взяв ее за основу я написал (как смог) небольшую прожку, которая умеет редактировать дамп, который потом можно отправить на индикатор. Сам дамп я немного подправил под мои хотелки, хотя как таковых сформировавшихся хотелок пока и нет. Вот просто хочется сделать, а что получится я не знаю. Эксперимент, одним словом.

В общем пока все выглядит так.

индикатор+программа.jpg


Теперь надо создать набор этих самых спрайтов и попробовать реализовать идею...
 
  • 9 Окт 2025
Васисуалий сказал(а):
Получается, что мне таки продали SH1106

Согласно даташиту на эту фигню получается что инит выглядит несколько иначе. Вот пример инита для SSD1306

Оба девайса по несколько штук с али приехали, оба работают
Адресацией только отличались.
Исходник есть посмотреть реализацию

https://forum-monitor.net.ru/threads/690355/#post-6914618

Причем попались экземпляры где +Vcc c GND местами поменяны, умудрился воткнуть не глядя.
Как ни странно не спалил, работают.
Хотя ток 100 мА ограничил на всякий, помогло видать.
 
  • 10 Окт 2025
Ну пасибки, но я разобрался и с одним и с другим. Сейчас пока планирую допиливать свою мегапрограмму для создания большого дампа из таких вот кадров согласно стратегии. Посмотрим что будет(с)Д.Трамп. Если получится, то я вангую появление возможности применения совместно с этими дисплеями очень слабых микроконтроллеров с очень малыми обьемами внутренней памяти типа 16F84 или, скажем, 12F609.
 
  • 10 Окт 2025
А картинку можно сжать путём замены "черных" точек-нулей на конструкции вида (следующие Х бит ="0"). Память меньше занимает.
 
  • 10 Окт 2025
Если сильно захотеть, можно в космос полететь! (с)

А если серьезно, то "Уважаемые господа состоятельные кроты, а не посчитать ли нам..."(с) ...Значится так...

У нас 1 килобайт однобитовых точек! Светящихся среди них процентов десять! Если это как то сжать, то мы получим экономию! Таки да! Но надо будет еще в какую то память запихать программу для "разжимания" и скока это займет места? А работа процессора? Я же написал, что хочу попробовать использовать в этой задаче самый простой процессор, в идеале если это будет что то в корпусе SOT6 и память такую же. Но это потом. Сначала надо "откатать" алгоритм и вообще понять, оно получится?
 
  • 10 Окт 2025
Васисуалий сказал(а):
скока это займет места
Думаю менее килобайта.
 
  • 10 Окт 2025
Wladimir_TS сказал(а):
Думаю менее килобайта.

Подумай о чем то более "приземленном"! Например о счетчике на транзисторах! У тебя своих "проЖэктов" как того гуталина на гуталиновой фабрике! Или с тобой программкой поделиться? Поиграешься... Покритикуешь! :ma:
 
  • 10 Окт 2025
Васисуалий сказал(а):
Например о счетчике на транзисторах!
А мене надо на КМОП микросхемах - опять никто первое сообщение не читает.

Васисуалий сказал(а):
Или с тобой программкой поделиться? Поиграешься... Покритикуешь!
Я в ней ничего не пойму... :mrgreen::mrgreen::mrgreen:

Но если не хочешь, что-б я писал в твоих темах - скажи.
 
  • 10 Окт 2025
Wladimir_TS сказал(а):
Но если не хочешь, что-б я писал в твоих темах - скажи.

Наоборот хочу! Но еще желательно, что бы в написанных тобой буквах был практический смысл! И даже если я, может быть, по собственной узколобости этого смысла не вижу, то наверно надо тогда меня попытаться убедить в твоей правоте! Например, попытаться "скалькулировать" получаемую "выгоду" от озвученного предложения. За одно оценить "расходы" на реализацию.

Вот, например, было бы не плохо описать алгоритм сжатия, ну распаковки разумеется. Прикинуть его обьем и необходимые ресурсы используемого процессора. Сколько времени займет распаковка кадра в свете того, что я хочу выводить "спрайты" и их у мну по очень примерным прикидкам получается чуть более сорока в секунду. А сколько этих спрайтов можно в секунду распаковать каким то 12F609 с учетом того, что оперативной памяти у него как таковой нет! Ну то есть те жалкие считанные байты, которые у него есть, все равно придется занять переменными и прочими необходимостями самой программы работы всего устройства. Так в чем мы будем распаковывать? Или есть способ распаковки "на лету"? Предложи...
 
  • 10 Окт 2025
Я предложил только концепцию и способ упаковки. так как тёмных "пикселей" больше - то имеет смысл упаковывать их. Заменяя не некий байт сигнатуру невозможный в картинке - например "00h" и после него байт количества темных точек. Если их подряд более 255, то снова 00h и количество. Любое второе после 00h число - это число белых точек.

А как программа будет выглядеть я не знаю - ну не программист я . Писал в совсем позапрошлой жизни по ВМ80 и Z80 на ассемблере программы по паре десятков байт.
 
  • 10 Окт 2025
Ну вот теперь прикинем... У нас один пиксель равен одному биту. Т.е. никакой речи об яркостях и оттенках цвета не идет. Строго говоря пиксели выводятся на экран байтами т.е. пачками по восемь штук, но вертикально! Иначе говоря первый байт дает на экране сразу вертикальную полоску высотой в 8 пикселей и таких "строк" всего 8 или 64 пиксельных. Теперь по моей затее...

Обычно для вывода информации на экране в такой задаче надо иметь в процессоре поле бит равное полю в индикаторе. Потом на это поле "наносится" некий "паттерн", например, шкала. Рисовать этот паттерн какой то программой не имеет смысла т.к. он никогда не меняется. Паттерн надо тоже где то хранить. Разумеется это должно быть какое то ПЗУ. Далее надо поверх паттерна нанести стрелку. Определяем положение стрелки. Это положение определяется результатом преобразования в АЦП. Т.е. активируем цикл преобразования в АЦП и ждем его завершения. Забираем байт из АЦП (скорее всего мне хватит 8-битного преобразования) и дальше рисуем стрелку. Стрелку надо нарисовать под наклоном плюс нижняя точка (ось вращения) должна находиться ниже всего поля изображения. Разумеется, что сделать это на компе на любом языке программирования задача очень примитивная, но когда дело доходит до простого микроконтроллера, начинается небольшой затык. Опять же, например, попробуй вычислить координаты верхней точки стрелки с учетом ее длинны зная угол отклонения на ядре, которое умеет только складывать два однобайтных числа! А если учесть, что у этого контроллера всего 1 килограмм (не килобайт т.к. "слова" в памяти четырнадцатибитные, где восемь бит - аргумент "в споре", три - код операции и еще один или пара бит - флаги операции. И из ОЗУ всего пара сотен байт, половина которых реально-физически существующие регистры и их трогать нельзя т.к. "все настроено и работает" и куда писать эту всю прелесть? Разумеется можно взять более другой микроконтроллер!!! Есть же "Меги", "СТМы", и "Кортексы", но как то вливать в него потом "пингвина" ради примитивной картинки? Ну кто меня умным назовет?

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

Так что никакого сжатия я себе позволить не могу. Идея строго противоположная - отжать программу до буквально нескольких строк. Опять же это пока мои "прикидки" и общая "стратегия". На практике такого никто не делал. Почему, я не знаю и возможно в этой идее есть изьян, который я не понимаю. Но пока все выглядит радужно.

Добавлено:

Пысызы... Это я не упомянул про то, что перед выводом новой "стрелки" в случае ея прорисовки программно, надо старую стереть, а потом новую нарисовать. Прикол в том, что по факту надо иметь информацию о старой стрелке и вывести обратно на экран пиксели, согласно их состояния до накладывания на них стрелки, а потом вывести новую стрелку в новые координаты и попутно сохранить уже её для будущего удаления...
 
  • 10 Окт 2025
Васисуалий сказал(а):
Опять же, например, попробуй вычислить координаты верхней точки стрелки с учетом ее длинны зная угол отклонения на ядре, которое умеет только складывать два однобайтных числа!
А это вроде одно из применений алгоритма им. тов. Брезенхема.

 ссылка скрыта от публикации 

Это я помню - еще на спектруме линию рисовал.
 
  • 10 Окт 2025
Ты это попробуй сделать с использованием ОДНОЙ единственной команды сложения! Просто представь, что ты не можешь ничего вычесть, поделить или перемножить и все в размере одного байта с флагом при переполнении или опустошении. Все! Других команд нет!

Т.е. это не означает, что на PIC16F84 нельзя организовать натуральный логарифм с плавающим чем нибудь, просто все вычисления превращаются в довольно сложные подпрограммы. Вторая проблема - где хранить таблицу синусов? Опять же памяти практически нет!
 
  • 10 Окт 2025
Не нужно выводить всю шкалу в каждом кадре. Достаточно хранить и выводить часть в которой находится стрелка. Так можно память сэкономить и фпс повысить.
Т.е. чем более вертикальна стрелка тем меньше размер выводимого изображения и соотвественно в крайних положениях хранится и выводится максимум - полукадр.
 
  • 13 Окт 2025
Васисуалий сказал(а):
ы это попробуй сделать с использованием ОДНОЙ единственной команды сложения!

Как-то помню уже но вроде на Z80 можно было и вычитать (точно можно SUB и SBC). умножение точно делал по какой-то книжке про ВМ80

Естественно за 30 с хреном лет всё забыл, да и если найду кассеты с текстами тех программ - чем их считывать ??? Линия задавалась вида начальная точка и величина смещения по X и Y от неё (со знаком) и рисовало в цикле. Вычисляло нужный байт и бит в экранной памяти. Но это было очень давно. Всё делал по книжкам (книжке) типа "программирование для 580ВМ80".

Ну и в школе на информатики чему-то успели научить. Вот на таких программировали :  ссылка скрыта от публикации  Только у нас не в виде чемоданов а с черными пластиковыми корпусами и питанием 42 вольта.

Хотя у него и был выход на магнитофон (вроде), за отсутствием таковых, записать программу было невозможно. Так что до выключения питания. "Ассемблировали" в тетрадке понятно дало - потом долго и упорно вводили ибо клавиатура была с ужасным дребезгом. ..И по шагам выполняешь, сверяясь с тетрадкой...оппа - хрень - иди за парту - , свою программу вводит следующий.

Но корм не вошел в коня....и как-то у меня пути с программированием разошлись. Хотя когда появился свой спектрум - пытался что-то делать но энтузиазм слабел.
 
  • 6 Июл 2026
Васисуалий сказал(а):
Это я не упомянул про то, что перед выводом новой "стрелки" в случае ея прорисовки программно, надо старую стереть, а потом новую нарисовать.
На форуме  ссылка скрыта от публикации  много по работе с этими дисплеями. Бьётся через поиск.
В частности на асме в этой теме  ссылка скрыта от публикации  автор объясняет как работать со слоями и видеобуфером. Это именно про подвижную стрелку на дисплее. Вы стираете не изображение, а перерисовываете стрелку на одном слое.
Но ОЗУ у МК должно быть достаточно (не менее 2kb).
И просто так с ip рф на него сейчас не попасть к сожалению.
 
  • Like
sasok1970

Для ответов войдите или зарегистрируйтесь

 qtcreator, openocd, atmel-ice, отладка класса  Atmega8 регистры