Oled i2c не работает

Обновлено: 06.07.2024

Привет! Будучи любителем - энтузиастом электроники, я уверен, что всё что мы делаем – радиоэлектронные игрушки – самоделки, или большие проекты, все это от любопытства и лени. Любопытство стремится понять и постичь необъятное, не познанное, разобраться, как оно там работает, чего делает, как двигается. А лень изобретает, чтобы такого придумать, чтобы не вставать, не подходить, не поднимать, не запачкаться или еще чего ни будь важное.

Для тех, у кого тоже возникло подобное желание, - вот краткое руководство по подключению и проверке маленьких и не дорогих дисплеев OLED.
Далее речь пойдет об одной из широко доступных для радиолюбителей моделях OLED дисплеев, управляемых чипом SSD1306, с размером экрана 0,96-дюймов и разрешением 128*64 или 128*32 точки. Эти дисплеи идеально подходят для не больших радиолюбительских конструкций и самоделок.

Шаг 1: Основные понятия

  • OLED это Organic Light-Emitting Diode, т.е., полупроводниковый прибор из органических соединений, который начинает излучать свет при прохождении через него электрического тока.
  • ARDUINO - это платформа для обучения и построения систем автоматики и робототехники.
  • ArduinoIDE - среда разработки. Это бесплатная программа для программирования Arduino.
  • I2C – Inter-Integrated Circuits, межмикросхемная линия связи.
  • Скетч, он же, код, он же программа - терминология Arduino.

Шаг 2: Комплектующие

  • 1. Сам OLED дисплей 0,96” (можно купить на Aliexpress или Ebay, - долго, но дешево!).
  • 2. Arduino UNO / Nano (там же где дисплей).
  • 3. Соединительные провода (там же).
  • 4. Компьютер или ноутбук с установленной ArduinoIDE.

Вообще покупка деталей для различных проектов на Aliexpress и Ebay очень прикольная штука, пока занимаешься одним проектом, детали к другому уже на подходе. Главное не забыть сделать заказ.

Шаг 3: Подключение дисплея


Управление дисплеем осуществляет чип SSD1306, который поддерживает пять протоколов связи и один из которых I2C. Данные по этому протоколу передаются всего по двум проводам, а чем меньше проводов в корпусе, тем лучше, так что нам он вполне подходит. Но! Встречаются модули с протоколом SPI и даже с переключением протоколов, так что будьте внимательны при покупке данного модуля.

Используемые выводы:
OLED дисплей - SCL/SCK (clock) и SDA (data), «Плюс» питания (VCC) и «Минус» питания (GND).
  • Vcc - 5V
  • GND - GND
  • SDA - A4
  • SCL - A5

Шаг 4: Сканер I2C

Каждое устройство на шине I2C имеет шестнадцатеричный адрес, поменять нельзя, он вшит намертво, каждый ответственный производитель должен где-то на корпусе или в инструкции указать его. Бывают модули с переключателями и перемычками, которыми можно изменить адрес, но… если устройства дешевые, до безобразия, то производитель может и не удосужиться заниматься такой мелочью, поэтому его придется определять самостоятельно.

Всего на шине может использоваться до 127 адресов - 119 для устройств и 8 адресов служебных. Общение ведется по этим адресам. Есть главный, он же Master, а есть ведомый, он же Slave, - Мастера запрашивают, ведомые отвечают, все просто.
Поскольку на нашем OLED-дисплей используется протокол связи I2C, а адрес может быть и не указан, мы сами попробуем узнать этот самый адрес.

Это можно сделать, загрузив коротенький скетч на свою плату Arduino с подключенным OLED. НО!
Не торопитесь сразу заливать скетч в Arduino! Давайте для начала загрузим «драйвера», т.е. подключим библиотеки, а для этого сразу перейдем к «Шагу №5», а затем вернемся и продолжим.

Шаг 4: Продолжение:

Шаг 5: Загрузка и подключение библиотек

  • 1. В ArduinoIDE идем в меню Скетч / Sketch.
  • 2. Выбираем «Включить библиотеки» / Include Libraries.
  • 3.Выбираем «Управление библиотеками» / Managed Libraries.
  • 4. Находим ADAFRUIT GFX и устанавливаем их.
  • 5. Находим ADAFRUIT SSD1306 и устанавливаем их.

Шаг 6: Тестирование дисплея


Чтобы проверить, работает ли все так, как ожидалось, запустите пример для проверки из ArduinoIDE.
Для этого:
Перейти ФАЙЛ> ПРИМЕРЫ> SSD 1306> Выбрать 128x64 i2c
Если вы получите «Ошибку», попробуйте выбрать SSD 1306> 128x32 i2c.
Если снова «Ошибка» попробуйте изменит адрес I2C в строке 61, демонстрационного кода, и замените его адресом вашего дисплея, который вы определили на шаге №4.
Если снова ошибка, можно попробовать отредактировать файл Adafruit_SSD1306.h, он находится в папке с библиотеками Arduino.

Откройте файл Adafruit_SSD1306.h в текстовом редакторе и найдите строки:

Должно получиться так:

Если снова ошибка – необходимо проверить правильность соединений.
После окончания загрузки вы увидите тестовую анимацию на экране, это означает, что вы успешно настроили свой OLED дисплей.

Когда вы вдоволь насладитесь сей анимацией, можете переходить к следующему шагу.

Затем пишем протокол сброса:

В VOID SETUP указываем шестнадцатеричный адрес нашего дисплея 0x3C, который мы узнали на «Шаге №4».
Затем, инициализируем дисплей и очищаем его:

Выкладываю проект (см. ATmega48P + SSD1306.zip), сделан Atmel Studio 7 + схема Proteus 8.7

Для начала, почему он не хочет работать даже в Протеусе?

Подходящая ли протеуская модель?

Правильно ли подключены выводы в модели экрана, особенно к шине?

Если надо выложить дополнительно скрины пишите, выложу.

судя по фотке он по TWI работает. Какой еще ногодрыг?

JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Схема из Протеуса (на осциллографе самое начало передачи на экран ):

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

ну, разбирайся в этом ногодрыге сам. Я бы подключил его по TWI и не парился бы

Приглашаем 30 ноября всех желающих посетить вебинар о литиевых источниках тока Fanso (EVE). Вы узнаете об особенностях использования литиевых источников питания и о том, как на них влияют режим работы и условия эксплуатации. Мы расскажем, какие параметры важно учитывать при выборе литиевого ХИТ, рассмотрим «подводные камни», с которыми можно столкнуться при неправильном выборе, разберем, как правильно проводить тесты, чтобы убедиться в надежности конечного решения. Вы сможете задать вопросы представителям производителя, которые будут участвовать в вебинаре.

Мне показалось, что так будет проще.

А есть примеры подключения такого экрана по TWI на C/C++ в Atmel Studio?

Приглашаем всех желающих 25/11/2021 г. принять участие в вебинаре, посвященном антеннам Molex. Готовые к использованию антенны Molex являются компактными, высокопроизводительными и доступны в различных форм-факторах для всех стандартных антенных протоколов и частот. На вебинаре будет проведен обзор готовых решений и перспектив развития продуктовой линейки. Разработчики смогут получить рекомендации по выбору антенны, работе с документацией и поддержкой, заказу образцов.

А какая разница между ногодрыгом и TWI ? )) В код лезть всем лениво. )) Полезно знать как работать с устройством обоими способами, на случай если у вас много I2C устройств а шина одна,
и они между собой начинают глючить или адреса одинаковые, тогда некоторые можно повесить на другие выводы микроконтроллера.


Заработало с адресом 0b01111000 но глючно см. скрин (Глючный кот.jpg)
Выкладываю подправленный проект с которого сделан скрин (ATmega48P + SSD1306 (2).zip)

Каждый раз полоски в другом месте, один раз кот нарисовался нормально, почему так?

Цифры не выводятся вообще, почему?

Снижение частоты ,например, до 8мГц и 4мГц глюки не убирает.

Откуда на линии стробирования SCL берётся такая неравномерность битов
(промежутки плавно сокращаются в каждом байте, см. осциллограф на скрине)
это нормально ?

В на плате OLED экрана стоит стабилизатор на 3,3v и линии SCL SDA подтянуты к 3,3v резисторами по 10к.

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.

Vlad_os

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

Vlad_os

Пробовал, не помогает. Та же самая полоска и пустой экран.

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

Надо вытащить дисплей и замерить сопротивление между SDA и + , а так же между SCL и +. Должно быть 4.7кОм + -

Vlad_os

Там и близко такого нет. Замерил, получилось около 2 мом

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

Ну вот видимо нет подтяжки к +5 вольтам, а для Wite это надо. Попробуйте поставить 2 резистора на 4.7к от соотв. пинов к +5.

VICLER

Эта полоска у края экрана? Если да, то похоже, что выбран не правильный контроллер. Попробуйте выбрать SSD1306 вместо SH1106

Vlad_os

Эта полоска у края экрана? Если да, то похоже, что выбран не правильный контроллер. Попробуйте выбрать SSD1306 вместо SH1106

А, да точно. Вот я тупанул) Поменял мк, теперь её нет. Хотя резисторы тоже помогли эту полоску убрать. Но основная проблема была в неправильно выбранном мк. Спасибо!

О сайте

  • Официальное сообщество YouTube-канала AlexGyver. Здесь обсуждаются проекты автора и остальных участников форума, а также рождаются новые крутые идеи. У нас можно получить ответы на вопросы по техническим темам в разделе помощи, найти себе исполнителя или заказчика на разработку электроники и совместно заказать плату для проекта. Приятного общения!

Новые темы

  • Автор: Zari4
  • Вчера в 23:15
  • Ответы: 1
  • Автор: scripto
  • Вчера в 21:23
  • Ответы: 0

Статистика форума

На данном сайте используются файлы cookie, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.


Многие, наверное, знают о таких маленьких дешёвых (меньше $3) OLED дисплеях, которые можно найти в огромном ассортименте на ebay или aliexpress. В интернете существует множество различных статей о том, как подключать эти дисплеи к Arduino и другим МК, но для STM32f10x затруднительно найти даже библиотеку. Поэтому я решил написать эту статью.

Данный дисплей имеет разрешение 128х64 пиксела и контроллер SSD1306 и подклчается к микроконтроллеру по интерфейсу I2C.


Для STM32 была найдена библиотека для этого дисплея, но она была для серии f4xx — необходимо было модифицировать для f10x.

Исходные файлы модифицированной мной библиотеки можно взять тут.

ssd1306_i2c.c
ssd1306_i2c.h
Интерфейс для работы с I2C
ssd1306.c
ssd1306.h
Библиотека для работы с дисплеем. Представляет методы для рисования на дисплее, вывода текста, и вывода всего на oled.
fonts.c
fonts.h
Шрифты для вывода текста на экран. Там есть три шрифта, но можно создать любой свой при помощи этой программы или аналогов
Vcc +3.3V. Допустимое напряжение — от 3.3В до 5В
GND GND
SCL PB6
SDA PB7

image

Для работы с библиотекой нужно подключить заголовочный файл:


И перед использованием инициализировать:


Теперь можно что-нибудь нарисовать:


Всё, что мы нарисовали сейчас находится в буффере в оперативной памяти МК, чтобы вывести всё на дисплей необходимо вызвать:


После этого наш дисплей обновится и будет выводить надпись и кружок. После вызова SSD1306_UpdateScreen() буффер в МК не сбрасывается сам, поэтому новые рисунки будут поверх предыдущих, для сброса можно заполнить всё чёрным цветом:


Все функции библиотеки:


Доступные шрифты, но вы так же можете добавить свои, в том числе и русские:

  • Font_7x10
  • Font_11x18
  • Font_16x26

Использовал CooCox IDE. Готовый проект можно скачать тут: Яндекс.Диск.

P.S. с момента написания статьи и до её публикации из песочницы прошло довольно много времени(6 месяцев), за которое я успел несколько раз изменить библиотеку.

Более новую версию библиотеки с поддержкой DMA и тестовый проект для Keil и cubeMx можно взять здесь. Самую последнюю версию библиотеки вы найдёте тут.

Читайте также: