Управление на OLED SSD1306 дисплей с Arduino UNO

Управление на OLED SSD1306 дисплей с Arduino UNO

Въведение

OLED SSD1306 е компактен и модерен дисплей, идеален за проекти с Arduino UNO. Той предлага висока резолюция и контраст, като е особено подходящ за проекти, където се изисква малък и енергоефективен дисплей. В тази статия ще разгледаме как да свържем този дисплей към Arduino UNO и как да използваме библиотеката на Adafruit, за да показваме различна информация върху него.

Можете да изтеглите библиотеката от официалното GitHub хранилище на Adafruit или директно от нашия уебсайт. С тази библиотека ще можем лесно да контролираме дисплея и да създаваме графики и текстови съобщения.

Управление на OLED SSD1306 дисплей с Arduino UNO библиотеки


За да използвате OLED SSD1306 дисплей с Arduino UNO, трябва да инсталирате библиотеката Adafruit SSD1306 в Arduino IDE. Това става по следния начин: отворете Arduino IDE и отидете в Sketch > Include Library > Manage Libraries. В полето за търсене напишете “Adafruit SSD1306” и изберете библиотеката, след което натиснете Install. Когато започне инсталацията, Arduino IDE ще ви попита дали искате да инсталирате и две допълнителни библиотеки — Adafruit GFX и Adafruit BusIO. Това са задължителни зависимости, така че трябва да ги инсталирате също. След като всички библиотеки са инсталирани, ще можете да използвате кода за управление на дисплея.

Съюо така може да ги инсталирате ръчно. Ако не знаете как може да научите как в нашата страница: Arduino IDE бърз преглед. Библиотеките може да свалите от тук.

Свързване и конфигурация на I2C

OLED SSD1306 използва I2C интерфейс, който изисква само два проводника (SCL и SDA). Стандартният I2C адрес на дисплея е 0x3C, но при необходимост може да бъде променен. Ако не сте сигурни за адреса, можете да използвате I2C скенер, за който можете да прочетете повече в нашата статия: Сканиране на I2C интерфейса с Arduino.

Схема на свързване на Arduino UNO към SSD1306 Oled дисплей

Управление на OLED SSD1306 дисплей с Arduino UNO схема

Свържете дисплея с Arduino UNO по следния начин:

  • VCC — към 5V на Arduino
  • GND — към GND на Arduino
  • SCL — към A5 на Arduino
  • SDA — към A4 на Arduino

Конфигурацията на пиновете на Arduino UNO може да намерите в това ревю на платформата.

Пълен код

Това е целия код, който демонстрира използването на различни функции за работа с дисплея:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(9600);
  
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }

  display.display();
  delay(2000);
  display.clearDisplay();

  drawRectangle();           // Очертаване на правоъгълна рамка (не запълнена)
  drawSquare();              // Очертаване на квадрат (не запълнен)
  drawFilledSquare();        // Очертаване на запълнен квадрат
  drawLine();                // Рисуване на линия
  displayAnalogSensor();     // Принтиране на стойност от аналогов сензор
  printString();             // Принтиране на стринг
  drawFilledCircle();        // Очертаване на запълнен кръг
  drawCircle();              // Очертаване на незапълнен кръг
  differentFontSizes();      // Различни големини на шрифтовете
  printInFilledBox();        // Принтиране на текст в запълнена рамка
  scrollTextAndValue();      // Скролиране на текст и стойност
}

void loop() {
  // Празен loop
}

// Може да замените "SSD1306_WHITE" с "1". ПРИМЕР -> display.drawRect(10, 10, 108, 44, 1);

// Функция за очертаване на правоъгълна рамка
void drawRectangle() {
  display.clearDisplay();
  display.drawRect(10, 10, 108, 44, SSD1306_WHITE); // Начална точка (10,10), ширина 108, височина 44
  display.display();
  delay(2000);
}

// Функция за очертаване на квадрат (не запълнен)
void drawSquare() {
  display.clearDisplay();
  display.drawRect(30, 20, 30, 30, SSD1306_WHITE); // Квадрат с размери 30x30 пиксела
  display.display();
  delay(2000);
}

// Функция за очертаване на запълнен квадрат
void drawFilledSquare() {
  display.clearDisplay();
  display.fillRect(40, 20, 30, 30, SSD1306_WHITE); // Запълнен квадрат с размери 30x30 пиксела
  display.display();
  delay(2000);
}

// Функция за рисуване на линия
void drawLine() {
  display.clearDisplay();
  display.drawLine(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1306_WHITE); // Диагонална линия през целия екран
  display.display();
  delay(2000);
}

// Функция за принтиране на стойност прочетена от аналогов сензор
void displayAnalogSensor() {
  display.clearDisplay();
  int sensorValue = analogRead(A0); // Четене от аналогов пин A0
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print("Sensor Value: ");
  display.println(sensorValue);
  display.display();
  delay(2000);
}

// Функция за принтиране на стринг
void printString() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Hello, OLED World!");
  display.display();
  delay(2000);
}

// Функция за очертаване на запълнен кръг
void drawFilledCircle() {
  display.clearDisplay();
  display.fillCircle(64, 32, 20, SSD1306_WHITE); // Запълнен кръг с радиус 20 пиксела в центъра на дисплея
  display.display();
  delay(2000);
}

// Функция за очертаване на незапълнен кръг
void drawCircle() {
  display.clearDisplay();
  display.drawCircle(64, 32, 20, SSD1306_WHITE); // Незапълнен кръг с радиус 20 пиксела в центъра на дисплея
  display.display();
  delay(2000);
}

// Функция за показване на текст с различни големини на шрифта
void differentFontSizes() {
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);

  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("Size 1");

  display.setTextSize(2);
  display.setCursor(0, 10);
  display.println("Size 2");

  display.setTextSize(3);
  display.setCursor(0, 30);
  display.println("Size 3");

  display.display();
  delay(3000);
}

// Функция за принтиране на текст в запълнена рамка
void printInFilledBox() {
  display.clearDisplay();
  display.fillRect(0, 0, SCREEN_WIDTH, 16, SSD1306_WHITE); // Запълнена рамка в горната част на дисплея
  display.setTextSize(1);
  display.setTextColor(SSD1306_BLACK); // Черен текст върху бяла рамка
  display.setCursor(2, 4);
  display.println("Text in Box");
  display.display();
  delay(2000);
}

// Функция за скролване на текст и стойност
void scrollTextAndValue() {
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Scrolling!");
  display.display();
  delay(1000);

  display.startscrollright(0x00, 0x0F); // Стартиране на скрол надясно
  delay(3000);
  display.stopscroll(); // Спиране на скрола
  delay(1000);

  display.startscrollleft(0x00, 0x0F); // Стартиране на скрол наляво
  delay(3000);
  display.stopscroll(); // Спиране на скрола
  delay(1000);
}

Включване на библиотеки

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
  1. #include <Wire.h> – Тази библиотека се използва за управление на I2C комуникация. OLED SSD1306 дисплеят използва I2C интерфейс, за да комуникира с Arduino.
  2. #include <Adafruit_GFX.h> – Това е основна графична библиотека, разработена от Adafruit, която осигурява функции за рисуване на различни графични елементи като линии, правоъгълници, кръгове и текст. Тази библиотека ни позволява лесно да работим с графични дисплеи.
  3. #include <Adafruit_SSD1306.h> – Тази библиотека е специфична за OLED дисплея SSD1306 и позволява взаимодействие с него, като използва функциите, предоставени от Adafruit_GFX. Тя предоставя специфични методи за инициализация и управление на SSD1306.

Дефиниране на параметри

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
  1. #define SCREEN_WIDTH 128 – Задава ширината на дисплея в пиксели. В случая дисплеят е с ширина 128 пиксела.
  2. #define SCREEN_HEIGHT 64 – Задава височината на дисплея в пиксели. Височината на дисплея е 64 пиксела.
  3. #define OLED_RESET -1 – Това е параметър за reset пин. Понеже не се използва хардуерен пин за ресет, стойността е зададена на -1, което означава, че софтуерът ще се справя без него.
  4. #define SCREEN_ADDRESS 0x3C – Този ред дефинира I2C адреса на дисплея. Адресът 0x3C е стандартен за OLED SSD1306. Ако се използва друг адрес, тук трябва да се направи съответната промяна.

Създаване на обект за дисплея

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
  1. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET) – Тук създаваме обект на клас Adafruit_SSD1306, наречен display. Този обект се използва за управление на дисплея.
    • SCREEN_WIDTH и SCREEN_HEIGHT – Задават размерите на дисплея.
    • &Wire – Указва, че дисплеят ще използва Wire (I2C) интерфейс.
    • OLED_RESET – Това е пинът за ресет. В този случай е зададено на -1, защото не се използва допълнителен хардуерен ресет.

setup() функция

void setup() {
  Serial.begin(9600);
  
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }

  display.display();
  delay(2000);
  display.clearDisplay();

  drawRectangle();
  drawSquare();
  drawFilledSquare();
  drawLine();
  displayAnalogSensor();
  printString();
  drawFilledCircle();
  drawCircle();
  differentFontSizes();
  printInFilledBox();
  scrollTextAndValue();
}
  1. Serial.begin(9600) – Стартира серийна комуникация със скорост 9600 бода. Този ред позволява да изпращаме и получаваме данни през серийния монитор на Arduino, което е полезно за диагностика.
  2. if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) – Този ред инициализира дисплея:
    • SSD1306_SWITCHCAPVCC – Указва на дисплея да използва вътрешното превключващо напрежение (3.3V), за да осигури стабилно захранване. SCREEN_ADDRESS – Адресът на дисплея в I2C шината, който е 0x3C.
    Ако инициализацията се провали, функцията ще върне false, което означава, че няма достъп до дисплея, и тогава се извършва следното действие:
  3. Serial.println(F("SSD1306 allocation failed")) – Ако инициализацията не успее, се отпечатва съобщение в серийния монитор, което указва, че не е успял да резервира памет за дисплея.
  4. for (;;); – Този безкраен цикъл задържа програмата в това състояние, ако не е успял да инициализира дисплея, предотвратявайки по-нататъшно изпълнение.
  5. display.display() – Тази команда визуализира всички текущи данни в буфера върху дисплея. След първоначалната инициализация тя показва всичко, което е в текущото състояние на дисплея.
  6. delay(2000) – Забавя изпълнението за 2000 милисекунди (или 2 секунди), за да даде време на потребителя да види началната информация на екрана.
  7. display.clearDisplay() – Изчиства съдържанието на дисплея, като го прави изцяло черен.

Извикване на функции за демонстрация на SSD1306

След инициализацията на дисплея, в setup() се извикват няколко функции, всяка от които демонстрира различна графична операция или функция:

  • drawRectangle() – Рисува правоъгълна рамка.
  • drawSquare() – Рисува квадрат (не запълнен).
  • drawFilledSquare() – Рисува запълнен квадрат.
  • drawLine() – Рисува линия.
  • displayAnalogSensor() – Чете и показва стойността от аналогов сензор, свързан към A0.
  • printString() – Показва стринг на дисплея.
  • drawFilledCircle() – Рисува запълнен кръг.
  • drawCircle() – Рисува незапълнен кръг.
  • differentFontSizes() – Демонстрира използване на различни размери на шрифта.
  • printInFilledBox() – Показва текст в запълнена рамка.
  • scrollTextAndValue() – Скролира текст на дисплея.

Всички тези функции илюстрират различни възможности на дисплея и как могат да се използват в реални проекти.

Обяснение на всяка функция

2. Функция drawRectangle()
void drawRectangle() {
  display.clearDisplay();
  display.drawRect(10, 10, 108, 44, SSD1306_WHITE);
  display.display();
  delay(2000);
}

Тази функция се използва за рисуване на правоъгълник. Използва се методът drawRect(x, y, width, height, color), който рисува правоъгълник с координати на началната точка (10, 10), ширина 108 пиксела и височина 44 пиксела. Цветът SSD1306_WHITE показва, че фигурата ще бъде бяла.

2. Функция drawSquare()
void drawSquare() {
  display.clearDisplay();
  display.drawRect(30, 20, 30, 30, SSD1306_WHITE);
  display.display();
  delay(2000);
}

Функцията drawSquare() е подобна на предишната, но рисува квадрат с размери 30x30 пиксела, започващ от координати (30, 20).

3. Функция drawFilledSquare()
void drawFilledSquare() {
  display.clearDisplay();
  display.fillRect(40, 20, 30, 30, SSD1306_WHITE);
  display.display();
  delay(2000);
}

Функцията drawFilledSquare() рисува запълнен квадрат. Методът fillRect(x, y, width, height, color) рисува квадрат със същите размери като drawSquare(), но този път той е изцяло запълнен.

4. Функция drawLine()
void drawLine() {
  display.clearDisplay();
  display.drawLine(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1306_WHITE);
  display.display();
  delay(2000);
}

Функцията drawLine() рисува диагонална линия през целия екран, започвайки от горния ляв ъгъл (0, 0) и завършвайки в долния десен ъгъл (SCREEN_WIDTH, SCREEN_HEIGHT).

5. Функция displayAnalogSensor()
void displayAnalogSensor() {
  display.clearDisplay();
  int sensorValue = analogRead(A0);
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print("Sensor Value: ");
  display.println(sensorValue);
  display.display();
  delay(2000);
}

Функцията displayAnalogSensor() чете стойността от аналоговия пин A0 и я показва на дисплея. Използва се методът analogRead(), който чете аналогова стойност и я отпечатва.

6. Функция printString()
void printString() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Hello, OLED World!");
  display.display();
  delay(2000);
}

Функцията printString() отпечатва текст “Hello, OLED World!” на дисплея. Тя използва методите setTextSize() за настройка на размера на текста и setTextColor() за цвета му.

7. Функция drawFilledCircle()
void drawFilledCircle() {
  display.clearDisplay();
  display.fillCircle(64, 32, 20, SSD1306_WHITE);
  display.display();
  delay(2000);
}

drawFilledCircle() рисува запълнен кръг в центъра на екрана с радиус 20 пиксела. Използва се методът fillCircle(x, y, radius, color).

8. Функция drawCircle()
void drawCircle() {
  display.clearDisplay();
  display.drawCircle(64, 32, 20, SSD1306_WHITE);
  display.display();
  delay(2000);
}

drawCircle() рисува незапълнен кръг със същите координати и радиус като drawFilledCircle(), но използва метода drawCircle().

9. Функция differentFontSizes()
void differentFontSizes() {
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);

  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("Size 1");

  display.setTextSize(2);
  display.setCursor(0, 10);
  display.println("Size 2");

  display.setTextSize(3);
  display.setCursor(0, 30);
  display.println("Size 3");

  display.display();
  delay(3000);
}

Функцията differentFontSizes() демонстрира как да се използват различни големини на шрифта, използвайки setTextSize(). На дисплея се отпечатват текстове с различни размери.

10. Функция printInFilledBox()
void printInFilledBox() {
  display.clearDisplay();
  display.fillRect(0, 0, SCREEN_WIDTH, 16, SSD1306_WHITE);
  display.setTextSize(1);
  display.setTextColor(SSD1306_BLACK);
  display.setCursor(2, 4);
  display.println("Text in Box");
  display.display();
  delay(2000);
}

Функцията printInFilledBox() първо рисува запълнена рамка, след което отпечатва текст в нея. Използва fillRect() за рамката и задава черен цвят за текста, за да се отличава на белия фон.

11. Функция scrollTextAndValue()
void scrollTextAndValue() {
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Scrolling!");
  display.display();
  delay(1000);

  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
}

Функцията scrollTextAndValue() използва метода startscrollright(start, stop) за скролиране на текст надясно. След известно време използва stopscroll() за да спре движението на текста.

Заключение

Използването на OLED SSD1306 с Arduino UNO може да бъде много лесно, благодарение на библиотеките на Adafruit. В този проект разгледахме различни техники за рисуване на графики и текст, които могат да бъдат полезни при създаването на интерактивни проекти. С този дисплей можете да визуализирате данни, да добавите графичен интерфейс или просто да направите вашите проекти по-забавни и интерактивни.

Translate »