По умолчанию модуль использует 4-проводной режим связи SPI, т.е. , BS0 и BS1 по умолчанию подключены к 0 (1 и 0 не обозначают уровень, но сопротивление подключено или связано с методом сварки, конкретное подключение оборудования показано в таблице ниже):
Примечание. На рисунке выше показано сварка на оборудовании, а следующая таблица представляет собой фактическое подключение оборудования:
Режим связи | БС1/БС0 |
3-проводной интерфейс SPI | 0/1 |
4-проводной интерфейс SPI | 0/0 |
I2C | 1/0 |
Конкретная конфигурация оборудования следующая:
- Использование 4-проводного SPI:
То есть заводские настройки программы: BS0 и BS1 подключены к 0 и к земле, DIN подключен к 0 и к Raspberry Pi MOSI, а CLK подключен к 0 и к Raspberry Pi SCLK;
- Использование 3-проводного SPI:
Подключите BS0 к 1 и к VCC, подключите BS1 к 0 и к GND, подключите DIN к 0 и к Raspberry Pi MOSI, подключите CLK к 0 и к Raspberry Pi SCLK;
- Использование I2C:
BS0 подключается к 0 и к GND, BS1 подключается к 1 и к VCC (3,3 В), DIN подключается к 0 и к Raspberry Pi SDA, CLK подключается к 1 и к Raspberry Pi SCL;
При использовании I2C: высокое и низкое состояние постоянного тока может управлять адресом ведомого устройства. Если он подключен к GND, то 7-битный адрес I2C: 0x3C;
PS: Программа по умолчанию работает в режиме SPI. Если вам нужно переключить режим, измените DEV_Config.h. Подробности смотрите в описании программы - нижний аппаратный интерфейс - выбор интерфейса
PS: при использовании STM32 демонстрация I2C использует аналоговый I2C, обратите внимание на подключение.
/*
modified on Des 13, 2020
Modified by MohammedDamirchi from https://github.com/adafruit/Adafruit_SSD1306
Home
*/
/**************************************************************************
This is an example for our Monochrome OLEDs based on SSD1306 drivers
Pick one up today in the adafruit shop!
------> http://www.adafruit.com/category/63_98
This example is for a 128x32 pixel display using SPI to communicate
4 or 5 pins are required to interface.
Adafruit invests time and resources providing this open
source code, please support Adafruit and open-source
hardware by purchasing products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries,
with contributions from the open source community.
BSD license, check license.txt for more information
All text above, and the splash screen below must be
included in any redistribution.
**************************************************************************/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for SSD1306 display connected using software SPI (default case):
//#define OLED_MOSI 9
//#define OLED_CLK 10
//#define OLED_DC 11
//#define OLED_CS 12
//#define OLED_RESET 13
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
// OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
//Comment out above, uncomment this block to use hardware SPI
#define OLED_DC 8
#define OLED_CS 10
#define OLED_RESET 9
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
&SPI, OLED_DC, OLED_RESET, OLED_CS);
#define NUMFLAKES 10 // Number of snowflakes in the animation example
#define LOGO_HEIGHT 16
#define LOGO_WIDTH 16
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000 };
void setup() {
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
// Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
display.display();
delay(2000); // Pause for 2 seconds
// Clear the buffer
display.clearDisplay();
// Draw a single pixel in white
display.drawPixel(10, 10, SSD1306_WHITE);
// Show the display buffer on the screen. You MUST call display() after
// drawing commands to make them visible on screen!
display.display();
delay(2000);
// display.display() is NOT necessary after every single drawing command,
// unless that's what you want...rather, you can batch up a bunch of
// drawing operations and then update the screen all at once by calling
// display.display(). These examples demonstrate both approaches...
testdrawline(); // Draw many lines
testdrawrect(); // Draw rectangles (outlines)
testfillrect(); // Draw rectangles (filled)
testdrawcircle(); // Draw circles (outlines)
testfillcircle(); // Draw circles (filled)
testdrawroundrect(); // Draw rounded rectangles (outlines)
testfillroundrect(); // Draw rounded rectangles (filled)
testdrawtriangle(); // Draw triangles (outlines)
testfilltriangle(); // Draw triangles (filled)
testdrawchar(); // Draw characters of the default font
testdrawstyles(); // Draw 'stylized' characters
testscrolltext(); // Draw scrolling text
testdrawbitmap(); // Draw a small bitmap image
// Invert and restore display, pausing in-between
display.invertDisplay(true);
delay(1000);
display.invertDisplay(false);
delay(1000);
testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps
}
void loop() {
}
void testdrawline() {
int16_t i;
display.clearDisplay(); // Clear display buffer
for(i=0; i<display.width(); i+=4) {
display.drawLine(0, 0, i, display.height()-1, SSD1306_WHITE);
display.display(); // Update screen with each newly-drawn line
delay(1);
}
for(i=0; i<display.height(); i+=4) {
display.drawLine(0, 0, display.width()-1, i, SSD1306_WHITE);
display.display();
delay(1);
}
delay(250);
display.clearDisplay();
for(i=0; i<display.width(); i+=4) {
display.drawLine(0, display.height()-1, i, 0, SSD1306_WHITE);
display.display();
delay(1);
}
for(i=display.height()-1; i>=0; i-=4) {
display.drawLine(0, display.height()-1, display.width()-1, i, SSD1306_WHITE);
display.display();
delay(1);
}
delay(250);
display.clearDisplay();
for(i=display.width()-1; i>=0; i-=4) {
display.drawLine(display.width()-1, display.height()-1, i, 0, SSD1306_WHITE);
display.display();
delay(1);
}
for(i=display.height()-1; i>=0; i-=4) {
display.drawLine(display.width()-1, display.height()-1, 0, i, SSD1306_WHITE);
display.display();
delay(1);
}
delay(250);
display.clearDisplay();
for(i=0; i<display.height(); i+=4) {
display.drawLine(display.width()-1, 0, 0, i, SSD1306_WHITE);
display.display();
delay(1);
}
for(i=0; i<display.width(); i+=4) {
display.drawLine(display.width()-1, 0, i, display.height()-1, SSD1306_WHITE);
display.display();
delay(1);
}
delay(2000); // Pause for 2 seconds
}
void testdrawrect(void) {
display.clearDisplay();
for(int16_t i=0; i<display.height()/2; i+=2) {
display.drawRect(i, i, display.width()-2*i, display.height()-2*i, SSD1306_WHITE);
display.display(); // Update screen with each newly-drawn rectangle
delay(1);
}
delay(2000);
}
void testfillrect(void) {
display.clearDisplay();
for(int16_t i=0; i<display.height()/2; i+=3) {
// The INVERSE color is used so rectangles alternate white/black
display.fillRect(i, i, display.width()-i*2, display.height()-i*2, SSD1306_INVERSE);
display.display(); // Update screen with each newly-drawn rectangle
delay(1);
}
delay(2000);
}
void testdrawcircle(void) {
display.clearDisplay();
for(int16_t i=0; i<max(display.width(),display.height())/2; i+=2) {
display.drawCircle(display.width()/2, display.height()/2, i, SSD1306_WHITE);
display.display();
delay(1);
}
delay(2000);
}
void testfillcircle(void) {
display.clearDisplay();
for(int16_t i=max(display.width(),display.height())/2; i>0; i-=3) {
// The INVERSE color is used so circles alternate white/black
display.fillCircle(display.width() / 2, display.height() / 2, i, SSD1306_INVERSE);
display.display(); // Update screen with each newly-drawn circle
delay(1);
}
delay(2000);
}
void testdrawroundrect(void) {
display.clearDisplay();
for(int16_t i=0; i<display.height()/2-2; i+=2) {
display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i,
display.height()/4, SSD1306_WHITE);
display.display();
delay(1);
}
delay(2000);
}
void testfillroundrect(void) {
display.clearDisplay();
for(int16_t i=0; i<display.height()/2-2; i+=2) {
// The INVERSE color is used so round-rects alternate white/black
display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i,
display.height()/4, SSD1306_INVERSE);
display.display();
delay(1);
}
delay(2000);
}
void testdrawtriangle(void) {
display.clearDisplay();
for(int16_t i=0; i<max(display.width(),display.height())/2; i+=5) {
display.drawTriangle(
display.width()/2 , display.height()/2-i,
display.width()/2-i, display.height()/2+i,
display.width()/2+i, display.height()/2+i, SSD1306_WHITE);
display.display();
delay(1);
}
delay(2000);
}
void testfilltriangle(void) {
display.clearDisplay();
for(int16_t i=max(display.width(),display.height())/2; i>0; i-=5) {
// The INVERSE color is used so triangles alternate white/black
display.fillTriangle(
display.width()/2 , display.height()/2-i,
display.width()/2-i, display.height()/2+i,
display.width()/2+i, display.height()/2+i, SSD1306_INVERSE);
display.display();
delay(1);
}
delay(2000);
}
void testdrawchar(void) {
display.clearDisplay();
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0, 0); // Start at top-left corner
display.cp437(true); // Use full 256 char 'Code Page 437' font
// Not all the characters will fit on the display. This is normal.
// Library will draw what it can and the rest will be clipped.
for(int16_t i=0; i<256; i++) {
if(i == '\n') display.write(' ');
else display.write(i);
}
display.display();
delay(2000);
}
void testdrawstyles(void) {
display.clearDisplay();
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0,0); // Start at top-left corner
display.println(F("Hello, world!"));
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
display.println(3.141592);
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.print(F("0x")); display.println(0xDEADBEEF, HEX);
display.display();
delay(2000);
}
void testscrolltext(void) {
display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 0);
display.println(F("scroll"));
display.display(); // Show initial text
delay(100);
// Scroll in various directions, pausing in-between:
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrolldiagright(0x00, 0x07);
delay(2000);
display.startscrolldiagleft(0x00, 0x07);
delay(2000);
display.stopscroll();
delay(1000);
}
void testdrawbitmap(void) {
display.clearDisplay();
display.drawBitmap(
(display.width() - LOGO_WIDTH ) / 2,
(display.height() - LOGO_HEIGHT) / 2,
logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
display.display();
delay(1000);
}
#define XPOS 0 // Indexes into the 'icons' array in function below
#define YPOS 1
#define DELTAY 2
void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
int8_t f, icons[NUMFLAKES][3];
// Initialize 'snowflake' positions
for(f=0; f< NUMFLAKES; f++) {
icons[f][XPOS] = random(1 - LOGO_WIDTH, display.width());
icons[f][YPOS] = -LOGO_HEIGHT;
icons[f][DELTAY] = random(1, 6);
Serial.print(F("x: "));
Serial.print(icons[f][XPOS], DEC);
Serial.print(F(" y: "));
Serial.print(icons[f][YPOS], DEC);
Serial.print(F(" dy: "));
Serial.println(icons[f][DELTAY], DEC);
}
for(;;) { // Loop forever...
display.clearDisplay(); // Clear the display buffer
// Draw each snowflake:
for(f=0; f< NUMFLAKES; f++) {
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SSD1306_WHITE);
}
display.display(); // Show the display buffer on the screen
delay(200); // Pause for 1/10 second
// Then update coordinates of each flake...
for(f=0; f< NUMFLAKES; f++) {
icons[f][YPOS] += icons[f][DELTAY];
// If snowflake is off the bottom of the screen...
if (icons[f][YPOS] >= display.height()) {
// Reinitialize to a random position, just off the top
icons[f][XPOS] = random(1 - LOGO_WIDTH, display.width());
icons[f][YPOS] = -LOGO_HEIGHT;
icons[f][DELTAY] = random(1, 6);
}
}
}
}
Характеристики SPI дисплея на базе чипа SSD1306
Чип драйвера | SSD1306 |
---|---|
Интерфейс поддержки | SPI / IIC |
разрешение | 128×64 |
Размер дисплея | 0,96 дюйма |
Цвет дисплея | Белый свет / синий свет / желто-синий цвет |
Габаритные размеры | 27.5×27.8(mm) |
Размер стекла | 26.7×19.26×1.4(mm) |
Область отображения | 21,74 (Ш) × 10,864 (мм) |
Шаг точки | 0.17×0.17(mm) |
Размер точки | 0.15×0.15(mm) |
Количество контактов | 7-контактный |
Потребляемая мощность | Нормальное энергопотребление дисплея составляет 21 мА-28 МАКС. |
Рабочий ток | Ток составляет около 20 мА во время нормальной работы, а ток на уровне ua во время сна. |
Перспектива | Полный обзор |
Рабочая Температура | -20℃~70℃ |
температура хранения | -30℃~80℃ |
Рабочее напряжение | 2,8-5,5 В |
Определение интерфейса
ШТЫРЬ | УСЛОВНОЕ ОБОЗНАЧЕНИЕ | Описания |
1 | GND | Заземление питания |
2 | VDD | Положительный источник питания (2,8-5,5 В) |
3 | SCK | Линия часов |
4 | SDA | Линия передачи данных |
5 | RES | Сбросить строку |
6 | DC | Данные / команда |
7 | CS | Выбор чипа |
Экономичный качественный OLED дисплей 128x64 с высокой контрастностью 7 контактов. Кроме протокола I2C поддерживает SPI. Легко подключается, выскокое быстродействие, возможно подключение сразу нескольких дисплеев к любому микроконтроллеру или мини-компьютеру по шине I2C. Адрес можно выбрать перепайкой перемычки.
Характеристики OLED Дисплей 0.96 I2C SPI
- Драйвер дисплея: SSD1315 / совместимый со старым SSD1306
- Интерфейс: 7 pin из которых: 3-SPI, 4-проводный SPI, I2C
- Рабочее напряжение: 3,3В
- Напряжение интерфейсов: 3,3В
- Разрешение: 128*64
- Размер дисплея: 0.96-дюйма
- Цвета: Желто-синий/белый / Синий
- Угол обзора: >160°
- Размеры: 33мм*33.50мм
- Рабочая температура: 20-70
Как задать тип интерфейса?
Интерфейс | BS0/BS1 | DIN | SCK |
---|---|---|---|
3-проводный SPI | 1/0 | MOSI | SCLK |
4-проводный SPI | 0/0 | MOSI | SCLK |
I2C |
Питание модуля – 3.3 В, но на плате установлен стабилизатор с низким падением напряжения, что позволяет питать дисплей как от 5 В, так и от 3.3 В напрямую
Подключение OLED Дисплей 0.96 I2C SPI 128x64
- 1 VCC Напряжение питания (3,3В-5В)
- 2 GND
- 3 NC НЕ используется
- 4 DIN Вход данных
- 5 CLK Вход тактовых импульсов
- 6 CS Выбор кристалла, активный низкий уровень
- 7 D/C Выбор Команды/Данные. низкий уровень для команд, высокий для данных
- 8 RES Сигнал сброса, активный низкий уровень
Максимальное потребление (когда включены все пиксели дисплея) порядка 20 мА, поэтому при необходимости его можно питать прямо от пина микроконтроллера.
Драйвер качать тут: http://www.rinkydinkelectronics.com/
Библиотека U8gLib поддерживает большое количество контроллеров экрана, в числе которых и SSD1306
SPI шина более скоростная чем I2C. Подключение по SPI обеспечивает скорость соединения до 20 Мбит/с.
Видео: https://www.youtube.com/watch?v=-IFwwWj11Kw&t=742s
Нет отзывов о данном товаре.
Нет вопросов об этом товаре.
Общие сведения о магазине
Субъект хозяйствования - ФОП группа №3 без НДС (физическое лицо - предприниматель с расчетным счетом в банке). Место регистрации и склада г. Дрогобыч. Все данные можно проверить на сайте Министерства Юстиции
Частные умельцы и инженеры, любители самоделок, школы юных техников и группы технического творчества которые не связаны с коммерческими закупками крупных партий товаров. Склад магазина - небольшой. Юридические лица обслуживаются в полной мере (счет +накладная)
Магазин работает по принципу "Покупай, если понимаешь". В качестве консультации могут быть предложены направления технических решений но не схемы реализации и монтажа. При покупке руководствуйтесь общедоступными источниками информации из Интернета
Перейдите на страницу товара. Наличие указано над ценой. При наличии товара выберите модель если они есть под указателем цены. Нажмите синюю кнопку "В корзину". Количество товара отобразится рядом со значком корзины в правом верхнем углу. Когда корзина будет заполнена, перейдите к оформлению заказа нажав на кнопку "Оформить" или кнопку "Корзина". Заполните данные для отправки товара. Если товара положили больше чем есть на складе - система Вас предупредит и не даст заказать. После поправки количества в корзине нажмите синюю кнопку "Оформить" и потом "Подтвердить", При этом проверяется фактическое наличие товара на складе. Если товара не хватает появится предупреждение. Уменьшите товар в корзине до исчезновения предупреждения.
При успешном Заказе страница сайта поздравит Вас и автоматически отправит Заказ вам на емейл.
Магазин arduinka.biz.ua - инструмент ІТ коммуникаций без торгового зала. Способ официального диалога - е-mail. Письмо с текстом заказа - подтверждение заключения сделки. Письмо может попасть в СПАМ т.к. отсылается автоматически роботом сайта. Проверьте папку СПАМ! Письмо не придет, если адрес указан неправильно. При отсутствии письма обращайтесь в Viber или по телефону
Чтобы корректно заказать впишите в одну строку (например Фамилия) название, а в другую строку (например Имя) код ЗКПО и город получения /расположения. Выберите оплату на расчетный счет. В письме о заказе у вас появится кнопка "Распечатать счет" где и будут указаны ваши реквизиты получателя. Можете внести все данные в поле Комментарий к заказу
1. Сделайте другой заказ и в комментарии к нему укажите на необходимость отправить одной посылкой. Произведите оплату
2. Сообщите в магазин по телефону о желании добавить товар в существующую посылку. Оплатите товар после согласования с магазином
Важно! Товар заказанный сегодня до 21:00 - отправляется завтра. Товар передается ежедневно понедельник-суббота на "Нова пошта" по заказам предыдущего дня. "Укрпошта" - отправка по рабочим дням до 12:00
Форма оплаты - только безналичная, оплата - на бизнес-карту привязанную к счету, на расчетный счет или на счет через посредников финансовых услуг Интеркасса, Портмоне, Ликпей, Мастерпасс и т.п.
Способы: Интернет банкинг, терминалы самообслуживания, Быстрая оплата через сервис Sendmoney (межбанковский сервис Приватбанка)
Реквизиты оплаты приходят на емейл. Не переходите к оплате не получив сообщение об успешном заказе!
Наложка практикуется исключительно с постоянными клиентами магазина!