ESP32 සමඟ OLED Display එකක් භාවිතා කිරීම
SSD1306 128x64 I2C OLED — සම්පූර්ණ සිංහල මාර්ගෝපදේශය Wiring • Library Setup • Text Display • Scrolling • Shapes • Bitmap Images මූලාශ්රය: lastminuteengineers.com — Interfacing OLED Display with ESP32 පටුන (Table of Contents) සටහන: Word හි දී පටුන update කිරීමට එය මත right-click කර "Update Field" තෝරන්න.
1. හැඳින්වීම
ESP32 ව්යාපෘතියකට කුඩා, පැහැදිලි screen එකක් අවශ්ය වූ විට වඩාත්ම ජනප්රිය තේරීම වන්නේ SSD1306 OLED display එකයි. මිල අඩු, ඉතා අඩු power ප්රමාණයක් පරිභෝජනය කරන, ඉහළ contrast එකක් ඇති මෙම displays මගින් text, sensor readings, graphs, animations සහ custom images පවා display කළ හැක. මෙම මාර්ගෝපදේශයේදී OLED display එකක් ESP32 එකකට සම්බන්ධ කර, Adafruit libraries භාවිතයෙන් text ලිවීම, scrolling animations, shapes ඇඳීම සහ bitmap images display කිරීම පියවරෙන් පියවර ඉගෙන ගනිමු.
මෙම මාර්ගෝපදේශය තුළ ආවරණය වන කරුණු:
- OLED display එකක් ක්රියා කරන ආකාරය සහ SSD1306 driver එකේ specifications
- OLED module එකේ pinout එක සහ ESP32 එකට wiring කිරීම (I2C)
- Adafruit SSD1306 සහ Adafruit GFX libraries install කිරීම
- Text display කිරීම — size, color (inverted), numbers, ASCII symbols
- Text scrolling — horizontal සහ diagonal animations
- Shapes ඇඳීම — lines, rectangles, circles, triangles
- Bitmap images display කිරීම සහ image2cpp converter tool එක භාවිතය
1.1 අවශ්ය දෑ (Prerequisites)
- ESP32 Development Board එකක් (DevKit V1 හෝ ඒ හා සමාන)
- SSD1306 128x64 I2C OLED display module එකක් (0.96 inch)
- Breadboard එකක් සහ jumper wires හතරක්
- Micro-USB data cable එකක්
- Arduino IDE එක install කර, ESP32 Board Package එක add කර තිබීම (Boards Manager හි "esp32 by Espressif Systems" install කරන්න)
2. OLED Display Module එක ගැන
2.1 OLED තාක්ෂණය ක්රියා කරන ආකාරය
OLED (Organic Light-Emitting Diode) display එකක සෑම pixel එකක්ම තමන්ම ආලෝකය නිපදවන කුඩා LED එකකි. LCD displays වල මෙන් backlight එකක් අවශ්ය නොවේ. මේ නිසා OLED display එකක කළු පැහැය සැබෑ කළු (pixel එක සම්පූර්ණයෙන් OFF) වන අතර contrast එක ඉතා ඉහළය, viewing angles පුළුල්ය, power පරිභෝජනය ද ඉතා අඩුය — ආලෝකමත් වන pixels සඳහා පමණක් current වැය වේ.
2.2 SSD1306 Module එකේ Specifications
- Resolution: 128x64 pixels (128x32 versions ද ඇත)
- Driver chip: SSD1306 OLED controller එක
- Interface: I2C (මෙම මාර්ගෝපදේශයේ භාවිතා වන) හෝ SPI versions ලෙස ලැබේ
- Operating voltage: 3.3V සිට 5V දක්වා
- Current: සාමාන්යයෙන් 20mA පමණ (backlight එකක් නැති නිසා ඉතා අඩුය)
- Colors: White, blue සහ dual-color (yellow+blue) versions ලැබේ — monochrome, එනම් pixel එකක් ON හෝ OFF පමණි
2.3 Display Memory එක (GDDRAM)
SSD1306 chip එක තුළ GDDRAM (Graphic Display Data RAM) නම් 1KB (bytes 1,024 = bits 8,192) memory එකක් ඇත. 128x64 = pixels 8,192 නිසා එක් bit එකක් එක් pixel එකක් පාලනය කරයි. මෙම memory එක pages 8 කට (page 0 සිට page 7 දක්වා) බෙදී ඇති අතර, එක් page එකක columns 128 ක් සහ column එකකට සිරස් pixels 8 ක් අඩංගු වේ. Scrolling functions වලදී මෙම page අංක parameters ලෙස භාවිතා වන නිසා මෙම ව්යුහය මතක තබා ගැනීම වැදගත්ය.
Adafruit library එක ESP32 එකේ RAM එකේ මෙම GDDRAM එකට සමාන buffer එකක් පවත්වාගෙන යයි. drawPixel(), println() වැනි සියලු drawing functions වෙනස් කරන්නේ මෙම buffer එක පමණි; display.display() call කළ විට පමණක් buffer එකේ අන්තර්ගතය I2C හරහා display එකට යවනු ලැබේ.
3. OLED Module එකේ Pinout එක
I2C version එකේ OLED module එකේ ඇත්තේ pins හතරක් පමණි:
- VCC: Power supply pin එක — 3.3V හෝ 5V ලබා දිය හැක
- GND: Ground pin එක
- SCL (Serial Clock): I2C communication එකේ clock signal එක ගෙන යන line එක
- SDA (Serial Data): I2C communication එකේ data ගෙන යන line එක
I2C protocol එකේ ලොකුම වාසිය නම් wires දෙකකින් (SDA + SCL) devices කිහිපයක් වුවද එකම bus එකට සම්බන්ධ කළ හැකි වීමයි. සෑම I2C device එකකටම අනන්ය address එකක් ඇත — SSD1306 modules බොහොමයක default address එක 0x3C වන අතර සමහර ඒවායේ 0x3D වේ.
4. OLED Display එක ESP32 එකට සම්බන්ධ කිරීම (Wiring)
ESP32 එකේ default I2C pins වන්නේ GPIO 21 (SDA) සහ GPIO 22 (SCL) යන දෙකයි. පහත ආකාරයට connections හතර සිදු කරන්න:
- OLED VCC → ESP32 3.3V pin එකට
- OLED GND → ESP32 GND pin එකට
- OLED SCL → ESP32 GPIO 22 (D22) pin එකට
- OLED SDA → ESP32 GPIO 21 (D21) pin එකට
Module එක 5V tolerant වුවද ESP32 එකේ logic level එක 3.3V නිසා 3.3V pin එකෙන් power ලබා දීම නිර්දේශ කෙරේ. Connections හතර නිවැරදිව සම්බන්ධ වූ පසු code එක ලිවීමට සූදානම්.
5. Libraries Install කිරීම
SSD1306 driver chip එක සමඟ කෙලින්ම කතා කිරීම සංකීර්ණ වැඩකි. Adafruit ආයතනය විසින් නිර්මාණය කර ඇති libraries දෙකක් මෙම සංකීර්ණත්වය සම්පූර්ණයෙන් සඟවා සරල functions ලබා දෙයි:
- Adafruit SSD1306: SSD1306 controller එක initialize කිරීම, buffer management සහ display update කිරීම handle කරන ප්රධාන library එක
- Adafruit GFX: Text rendering, lines, shapes වැනි graphics primitives සියල්ල ලබා දෙන core graphics library එක
- Adafruit BusIO: I2C/SPI communication එක abstract කරන dependency library එක
5.1 Install කරන ආකාරය
- Arduino IDE එකේ Sketch → Include Library → Manage Libraries වෙත යන්න (හෝ වම් පස sidebar එකේ Library Manager icon එක click කරන්න)
- Search box එකේ adafruit ssd1306 ලෙස type කරන්න
- Adafruit SSD1306 library එක තෝරා Install click කරන්න
- Dependencies (Adafruit GFX සහ BusIO) install කිරීමට අසන dialog එකේ "Install All" තෝරන්න
6. පළමු Program එක: Text Display කිරීම
පළමු උදාහරණය ලෙස screen එකේ "Hello, ESP32!" ලෙස display කරන සරලම sketch එක ලියමු.
6.1 සම්පූර්ණ Code එක
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display එකේ පළල (pixels)
#define SCREEN_HEIGHT 64 // OLED display එකේ උස (pixels)
#define OLED_RESET -1 // Reset pin එකක් නැත (ESP32 reset එකම භාවිතා වේ)
#define SCREEN_ADDRESS 0x3C // OLED එකේ I2C address එක (සමහර modules වල 0x3D)
// SSD1306 display object එක නිර්මාණය කිරීම (I2C - Wire library එක හරහා)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Serial.begin(115200);
// Display එක initialize කිරීම
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("SSD1306 allocation failed");
for (;;); // Initialize වීම අසාර්ථක නම් මෙතැනම නවතී
}
display.clearDisplay(); // Buffer එක සම්පූර්ණයෙන් හිස් කිරීම
display.setTextSize(1); // Text size එක (1 = කුඩාම ප්රමාණය)
display.setTextColor(SSD1306_WHITE); // Text color එක සුදු ලෙස
display.setCursor(0, 28); // Text එක පටන් ගන්නා ස්ථානය (x=0, y=28)
display.println("Hello, ESP32!"); // Buffer එකට text ලිවීම
display.display(); // Buffer එකේ ඇති දේ screen එකට යැවීම
}
void loop() {
}
6.2 Code එක පැහැදිලි කිරීම (Code Explanation)
Libraries සහ Definitions
Wire.h library එක I2C communication සඳහාද, Adafruit_GFX.h සහ Adafruit_SSD1306.h libraries graphics සහ display control සඳහාද include වේ. SCREEN_WIDTH සහ SCREEN_HEIGHT මගින් display resolution එක define වේ — 128x32 module එකක් නම් height එක 32 ලෙස වෙනස් කරන්න. OLED_RESET අගය -1 ලෙස දී ඇත්තේ module එකේ වෙනම reset pin එකක් නොමැති නිසාය.
Display Object එක
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); — width, height, I2C interface එකට pointer එක (&Wire) සහ reset pin එක arguments ලෙස දී display object එක නිර්මාණය කරයි.
Display එක Initialize කිරීම
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS) — පළමු argument එක වන SSD1306_SWITCHCAPVCC මගින් 3.3V supply එකෙන් display එකට අවශ්ය ඉහළ voltage එක ජනනය කරන internal charge pump එක enable කරයි. දෙවන argument එක I2C address එකයි. Initialize වීම අසාර්ථක නම් function එක false return කරන නිසා error message එකක් print කර for(;;); infinite loop එකකින් program එක නවත්වයි.
Text ලිවීම සහ Display කිරීම
display.clearDisplay() — buffer එකේ ඇති සියල්ල මකයි (pixels සියල්ල OFF)
display.setTextSize(1) — text size එක සකසයි; size 1 = pixels 7x10 පමණ වන කුඩාම font එක
display.setTextColor(SSD1306_WHITE) — monochrome display එකක text color එක WHITE ලෙස සකසයි
display.setCursor(0, 28) — text එක පටන් ගන්නා pixel coordinates; (0,0) යනු ඉහළ වම් කෙළවරයි (x: 0–127, y: 0–63)
display.println("Hello, ESP32!") — text එක buffer එකට ලියයි; println() අවසානයේ ඊළඟ line එකට යන අතර print() එසේ නොයයි
- display.display() — වැදගත්ම line එක! Buffer එකේ අන්තර්ගතය physical screen එකට යවයි. මෙය call නොකළහොත් screen එකේ කිසිවක් නොපෙනේ
7. Text Formatting: Size, Color, Numbers සහ Symbols
පහත sketch එක text formatting හැකියාවන් සියල්ල එකින් එක demo කරයි — සෑම demo එකක්ම තත්පර 2 ක් display වේ.
7.1 සම්පූර්ණ Code එක
#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(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("SSD1306 allocation failed");
for (;;);
}
}
void loop() {
// ---- සාමාන්ය text (size 1) ----
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Normal text - size 1");
display.display();
delay(2000);
// ---- ලොකු text (size 2) ----
display.clearDisplay();
display.setTextSize(2); // සෑම dimension එකක්ම 2 ගුණයකින් විශාල වේ
display.setCursor(0, 0);
display.println("Size 2");
display.display();
delay(2000);
// ---- Inverted text (කළු අකුරු, සුදු background) ----
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Inverted text");
display.display();
delay(2000);
// ---- සංඛ්යා display කිරීම ----
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(2);
display.setCursor(0, 0);
display.println(123456789); // Integer අගයක් කෙලින්ම print කළ හැක
display.display();
delay(2000);
// ---- Number base (HEX / BIN / OCT / DEC) ----
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("HEX: ");
display.println(255, HEX); // FF ලෙස display වේ
display.print("BIN: ");
display.println(255, BIN); // 11111111 ලෙස display වේ
display.print("OCT: ");
display.println(255, OCT); // 377 ලෙස display වේ
display.display();
delay(2000);
// ---- ASCII symbols (write() function එක) ----
display.clearDisplay();
display.setTextSize(3);
display.setCursor(50, 20);
display.write(3); // ASCII code 3 = heart symbol එක
display.display();
delay(2000);
}
7.2 Text Size එක වෙනස් කිරීම
setTextSize(n) function එකේ parameter එක scaling multiplier එකකි. Size 1 හි font එක pixels 7x10 පමණ නම්, size 2 හිදී 14x20, size 3 හිදී 21x30 ලෙස සෑම dimension එකක්ම ගුණ වේ. ලොකු sizes වලදී text එක screen එකේ පළලට වඩා දිග නම් ඊළඟ line එකට wrap වේ.
7.3 Inverted Text
setTextColor(SSD1306_BLACK, SSD1306_WHITE) ලෙස arguments දෙකක් දුන් විට පළමු එක text (foreground) color එකද දෙවැන්න background color එකද වේ — එනම් සුදු කොටුවක කළු අකුරු display වේ. Menu එකක selected item එකක් highlight කිරීම වැනි අවස්ථාවලට මෙය ප්රයෝජනවත්ය.
7.4 සංඛ්යා Display කිරීම
print() / println() functions වලට strings පමණක් නොව සංඛ්යාද කෙලින්ම pass කළ හැක — 32-bit unsigned integers (4,294,967,295 දක්වා) සහ float අගයන් support වේ. දෙවන argument එකක් ලෙස HEX, BIN, OCT හෝ DEC constant එකක් දුන් විට සංඛ්යාව එම base එකෙන් display වේ. Float එකක් සමඟ print(3.14159, 2) ලෙස දුන් විට දශම ස්ථාන ගණන (මෙහිදී 2 ක්) පාලනය කළ හැක.
7.5 ASCII Symbols
write(asciiCode) function එකට ASCII code අංකයක් දීමෙන් font table එකේ ඇති special symbols display කළ හැක — උදාහරණයක් ලෙස write(3) මගින් heart symbol එකක් display වේ. Adafruit GFX font table එකේ codes 0 සිට 255 දක්වා characters ඇත.
8. Text Scrolling (Animations)
SSD1306 chip එකේම built-in hardware scrolling පහසුකමක් ඇත — එනම් scrolling animation එක chip එකම කරන නිසා ESP32 code එකෙන් frame by frame redraw කිරීමට අවශ්ය නැත. Scrolling functions වල parameters දෙක වන්නේ scroll විය යුතු start page එක සහ stop page එකයි (2.3 කොටසේ විස්තර කළ GDDRAM pages 0x00 සිට 0x07 දක්වා).
8.1 සම්පූර්ණ Code එක
#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(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("SSD1306 allocation failed");
for (;;);
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 24);
display.println("ESP32");
display.display();
delay(1000);
}
void loop() {
// දකුණට scroll කිරීම — pages 0x00 සිට 0x07 දක්වා (සම්පූර්ණ screen එකම)
display.startscrollright(0x00, 0x07);
delay(3000);
display.stopscroll(); // Scrolling එක නැවැත්වීම
delay(1000);
// වමට scroll කිරීම
display.startscrollleft(0x00, 0x07);
delay(3000);
display.stopscroll();
delay(1000);
// විකර්ණව (diagonal) දකුණට scroll කිරීම
display.startscrolldiagright(0x00, 0x07);
delay(3000);
// විකර්ණව වමට scroll කිරීම
display.startscrolldiagleft(0x00, 0x07);
delay(3000);
display.stopscroll();
delay(1000);
}
8.2 Scrolling Functions
startscrollright(0x00, 0x07) — pages 0–7 (සම්පූර්ණ screen එකම) දකුණට scroll කරයි
startscrollleft(0x00, 0x07) — වමට scroll කරයි
startscrolldiagright(0x00, 0x07) සහ startscrolldiagleft(0x00, 0x07) — විකර්ණව (horizontal + vertical එකවර) scroll කරයි
stopscroll() — scrolling එක නවත්වයි; මෙය call කරන තුරු animation එක අඛණ්ඩව සිදු වේ
Partial scrolling: Page range එක සීමා කිරීමෙන් screen එකේ කොටසක් පමණක් scroll කළ හැක. උදාහරණයක් ලෙස startscrollright(0x00, 0x00) මගින් scroll වන්නේ ඉහළම page එක (මුල් pixel rows 8) පමණි — ඉතිරි content එක නිශ්චලව පවතී.
9. Shapes ඇඳීම (Drawing Shapes)
Adafruit GFX library එක lines, rectangles, circles, triangles ඇතුළු graphics primitives රැසක් ලබා දෙයි. සෑම shape function එකකම draw version එක (outline පමණක්) සහ fill version එක (ඇතුළත සම්පූර්ණයෙන් පිරවූ) ලෙස දෙකක් ඇත. පහත sketch එක ඒ සියල්ල demo කරයි.
9.1 සම්පූර්ණ Code එක
#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(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("SSD1306 allocation failed");
for (;;);
}
}
void loop() {
// ---- Line එකක් ----
display.clearDisplay();
// drawLine(x1, y1, x2, y2, color) — (0,0) සිට (127,63) දක්වා
display.drawLine(0, 0, 127, 63, SSD1306_WHITE);
display.display();
delay(2000);
// ---- Rectangle (outline) ----
display.clearDisplay();
// drawRect(x, y, width, height, color)
display.drawRect(14, 12, 100, 40, SSD1306_WHITE);
display.display();
delay(2000);
// ---- Filled rectangle ----
display.clearDisplay();
display.fillRect(14, 12, 100, 40, SSD1306_WHITE);
display.display();
delay(2000);
// ---- Rounded rectangle ----
display.clearDisplay();
// drawRoundRect(x, y, width, height, cornerRadius, color)
display.drawRoundRect(14, 12, 100, 40, 10, SSD1306_WHITE);
display.display();
delay(2000);
// ---- Filled rounded rectangle ----
display.clearDisplay();
display.fillRoundRect(14, 12, 100, 40, 10, SSD1306_WHITE);
display.display();
delay(2000);
// ---- Circle (outline) ----
display.clearDisplay();
// drawCircle(centerX, centerY, radius, color) — කේන්ද්රය (64,32), radius 20
display.drawCircle(64, 32, 20, SSD1306_WHITE);
display.display();
delay(2000);
// ---- Filled circle ----
display.clearDisplay();
display.fillCircle(64, 32, 20, SSD1306_WHITE);
display.display();
delay(2000);
// ---- Triangle (outline) ----
display.clearDisplay();
// drawTriangle(x1, y1, x2, y2, x3, y3, color) — vertices තුනක coordinates
display.drawTriangle(64, 10, 24, 54, 104, 54, SSD1306_WHITE);
display.display();
delay(2000);
// ---- Filled triangle ----
display.clearDisplay();
display.fillTriangle(64, 10, 24, 54, 104, 54, SSD1306_WHITE);
display.display();
delay(2000);
// ---- Display invert කිරීම ----
display.invertDisplay(1); // සියලු pixels invert වේ
delay(2000);
display.invertDisplay(0); // නැවත normal state එකට
delay(2000);
}
9.2 Shape Functions වල Parameters
drawLine(x1, y1, x2, y2, color) — (x1,y1) සිට (x2,y2) දක්වා සරල රේඛාවක් අඳියි
drawRect(x, y, w, h, color) / fillRect(...) — (x,y) යනු rectangle එකේ ඉහළ වම් කෙළවර; w සහ h පළල හා උස pixels වලින්
drawRoundRect(x, y, w, h, radius, color) / fillRoundRect(...) — අමතර radius parameter එකෙන් corner curve එකේ ප්රමාණය තීරණය වේ; විශාල radius = වඩා rounded corners
- drawCircle(centerX, centerY, radius, color) / fillCircle(...) — rectangles මෙන් නොව circle එක define වන්නේ කේන්ද්රයේ coordinates සහ radius එකෙනි
drawTriangle(x1, y1, x2, y2, x3, y3, color) / fillTriangle(...) — vertices තුනේ coordinate යුගල තුනක් pass කරයි
invertDisplay(1) — screen එකේ සියලු pixels invert කරයි (සුදු → කළු, කළු → සුදු); invertDisplay(0) මගින් normal state එකට
10. Bitmap Images Display කිරීම
ඕනෑම image එකක් OLED එකේ display කිරීමට නම් එය පළමුව monochrome bitmap byte array එකක් බවට convert කළ යුතුය — සෑම byte එකක pixels 8 ක තත්ත්වය (ON/OFF) ගබඩා වේ. 128x64 සම්පූර්ණ screen image එකක් bytes 1,024 ක් (GDDRAM එකේ ප්රමාණයම) ගනී. මෙම conversion එක සඳහා වඩාත්ම ජනප්රිය tool එක වන්නේ image2cpp නම් නොමිලේ ලැබෙන online converter එකයි.
10.1 image2cpp Tool එක භාවිතා කරන ආකාරය
- Browser එකේ javl.github.io/image2cpp වෙත ගොස් ඔබගේ image එක (PNG, JPG ආදී) upload කරන්න
- Canvas size: 128 x 64 ලෙස ඇතුළත් කරන්න; Scaling option එකෙන් "scale to fit" (aspect ratio රැකේ) හෝ "stretch to fill" තෝරන්න
- Center options මගින් image එක horizontally/vertically මැදට ගත හැක; Flip options මගින් mirror කළ හැක
- Brightness threshold (0–255): මෙම අගයට වඩා දීප්තිමත් pixels සුදු ලෙසත් අඩු ඒවා කළු ලෙසත් convert වේ — preview එක බලමින් හොඳම detail එක ලැබෙන අගය තෝරන්න; Invert colors option එකෙන් සුදු/කළු මාරු කළ හැක
- Identifier field එකේ array එකට නමක් දී, Code output format එක Arduino code ලෙස තෝරා Generate Code click කරන්න — ලැබෙන byte array එක copy කරගන්න
10.2 සම්පූර්ණ Code එක
පහත sketch එකේ උදාහරණයක් ලෙස කුඩා 16x16 heart icon array එකක් යොදා ඇත — ඔබගේ image2cpp array එක paste කර drawBitmap() call එකේ width/height අගයන් ඒ අනුව වෙනස් කරන්න:
#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);
// image2cpp tool එකෙන් generate කරගත් byte array එක මෙතැනට paste කරන්න.
// පහත ඇත්තේ 16x16 heart icon එකක උදාහරණ array එකකි.
// PROGMEM keyword එකෙන් array එක RAM එකේ නොව flash memory එකේ ගබඩා වේ.
const unsigned char myBitmap[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x1c, 0x38, 0x3e, 0x7c,
0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe,
0x3f, 0xfc, 0x1f, 0xf8, 0x0f, 0xf0, 0x07, 0xe0,
0x03, 0xc0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00
};
void setup() {
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("SSD1306 allocation failed");
for (;;);
}
display.clearDisplay();
// drawBitmap(x, y, bitmapArray, width, height, color)
// (56, 24) ස්ථානයේ සිට 16x16 image එක buffer එකට අඳියි
display.drawBitmap(56, 24, myBitmap, 16, 16, SSD1306_WHITE);
display.display(); // Buffer එක screen එකට යැවීම
}
void loop() {
}
10.3 Code එක පැහැදිලි කිරීම
- const unsigned char myBitmap[] PROGMEM — array එක global scope එකේ (setup() එකට ඉහළින්) declare කරයි; PROGMEM keyword එක නිසා විශාල array එක RAM එකේ නොව flash memory එකේ ගබඩා වේ — ලොකු images වලට මෙය අත්යවශ්යයි
drawBitmap(x, y, bitmapArray, width, height, color) — (x,y) යනු image එකේ ඉහළ වම් කෙළවර display එකේ තැබෙන ස්ථානයයි; width/height යනු image එකේ pixel dimensions; color එක SSD1306_WHITE
- අනෙක් සියලු drawing functions මෙන්ම drawBitmap() ද ලියන්නේ buffer එකට පමණි — image එක පෙනීමට display.display() call කිරීම අනිවාර්යයි
- 128x64 full-screen image එකක් display කිරීමට drawBitmap(0, 0, myBitmap, 128, 64, SSD1306_WHITE) ලෙස call කරන්න
11. ගැටලු නිරාකරණය (Troubleshooting)
11.1 සුලභ ගැටලු
- "SSD1306 allocation failed" error එක: I2C address එක වැරදි වීම, wiring වැරැද්දක් හෝ module එකේ දෝෂයක් නිසා display.begin() අසාර්ථක වී ඇත. Address එක 0x3C වෙනුවට 0x3D ලෙස වෙනස් කර බලන්න; SDA/SCL wires මාරු වී ඇත්දැයි පරීක්ෂා කරන්න
- Screen එකේ කිසිවක් නොපෙනේ නම්: වඩාත්ම සුලභ හේතුව display.display() call කිරීමට අමතක වීමයි — drawing functions ලියන්නේ RAM buffer එකට පමණක් බව මතක තබාගන්න
- Text එක අමුතු තැනක/කැඩී පෙනේ නම්: setCursor() coordinates screen limits (x: 0–127, y: 0–63) තුළ දැයි බලන්න; 128x32 display එකකට SCREEN_HEIGHT එක 32 ලෙස define කළ යුතුය
- Display එක ක්ෂණිකව flicker වේ නම්: loop() එකේ අනවශ්ය ලෙස clearDisplay() + display() නැවත නැවත call වනවාදැයි බලන්න — content එක වෙනස් වූ විට පමණක් update කරන්න
11.2 I2C Address එක සොයා ගැනීම (I2C Scanner)
ඔබගේ module එකේ නියම I2C address එක නොදන්නේ නම් පහත I2C scanner sketch එක upload කර Serial Monitor එක (baud rate 115200) බලන්න — bus එකේ ඇති සෑම device එකකම address එක display වේ:
#include <Wire.h>
void setup() {
Wire.begin(); // I2C bus එක ආරම්භ කිරීම (SDA=21, SCL=22)
Serial.begin(115200);
Serial.println("I2C Scanner");
}
void loop() {
byte error, address;
int nDevices = 0;
Serial.println("Scanning...");
// 0x01 සිට 0x7F දක්වා සියලුම I2C addresses පරීක්ෂා කිරීම
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
nDevices++;
}
}
if (nDevices == 0) Serial.println("No I2C devices found");
delay(5000);
}
Scanner එකෙන් ලැබෙන address එක (උදා: 0x3C) sketch එකේ SCREEN_ADDRESS define එකට යොදන්න. "No I2C devices found" ලෙස පෙන්වයි නම් wiring එක නැවත පරීක්ෂා කරන්න.
12. සමාප්තිය
මෙම මාර්ගෝපදේශයෙන් ඔබ SSD1306 OLED display එකක සම්පූර්ණ භාවිතය ඉගෙන ගත්තා — I2C wiring එක, Adafruit SSD1306 / GFX libraries setup එක, buffer-based rendering සංකල්පය (display() call එකේ වැදගත්කම), text formatting (size, inverted colors, number bases, ASCII symbols), hardware scrolling animations, graphics primitives (lines, rectangles, circles, triangles) සහ image2cpp මගින් bitmap images display කිරීම. මෙම දැනුම පාදක කරගෙන sensor dashboards, menu systems, game displays, status monitors වැනි ඕනෑම ව්යාපෘතියකට professional display interface එකක් එකතු කිරීමට ඔබට හැකියාව ඇත.
මූලාශ්රය / වැඩිදුර කියවීමට: https://lastminuteengineers.com/oled-display-esp32-tutorial/
