Cara Memakai Layar OLED (SSD1306): Teks, Bentuk, dan Grafik dengan Arduino
Bagaimana cara memakai layar OLED I2C 0,96 inci (SSD1306)? Pengkabelan dan alamat I2C (0x3C), library Adafruit SSD1306 dan GFX, menggambar teks, bentuk, nilai sensor, dan bitmap, serta kode ESP32 dan MicroPython di Pico.
Meskipun ukurannya hampir tidak lebih besar dari ujung jari, layar OLED 0,96 inci menampilkan gambar 128×64 piksel yang tajam dan merupakan salah satu layar paling populer untuk proyek Arduino. Berbeda dengan LCD karakter, layar ini bisa menggambar bukan hanya huruf, tetapi juga garis, lingkaran, ikon, grafik, bahkan game kecil. Layar ini ideal untuk jam tangan pintar, stasiun cuaca, remote, dan alat ukur portabel. Hampir semua layar ini memakai chip driver bernama SSD1306 dan cukup dihubungkan dengan dua kabel data (I2C).

Apa itu OLED, dan apa bedanya dengan LCD?
Pada layar OLED (Organic Light Emitting Diode), setiap piksel menghasilkan cahayanya sendiri; tidak ada lampu latar. Itulah sebabnya area hitam benar-benar hitam, kontrasnya sangat tinggi, layarnya terlihat tajam dari segala sudut, dan dayanya sangat kecil ketika sebagian besar gambar berwarna gelap. Resolusi 128×64 pikselnya memungkinkan grafik, ikon, dan gambar yang tidak bisa ditampilkan LCD berbasis karakter.
| Fitur | OLED 0,96 inci | OLED 0,91 inci | LCD 16x2 |
|---|---|---|---|
| Resolusi | 128×64 piksel | 128×32 piksel | 16×2 karakter |
| Grafik dan ikon | Ya | Ya | Tidak (hanya karakter) |
| Lampu latar | Tidak perlu | Tidak perlu | Perlu |
| Koneksi | I2C (ada juga versi SPI) | I2C | 4 kabel dengan modul I2C |
| Di bawah sinar matahari | Sulit dibaca | Sulit dibaca | Lebih mudah dibaca |
Spesifikasi
| Fitur | Nilai |
|---|---|
| Chip driver | SSD1306 |
| Layar | 0,96 inci 128×64 (versi 0,91 inci 128×32) |
| Warna | Monokrom: putih, biru, atau kuning di atas dan biru di bawah |
| Catu daya | 3,3–5 V (ada regulator di board) |
| Arus | Sekitar 10–25 mA (tergantung berapa banyak piksel yang menyala) |
| Alamat I2C | 0x3C (0x3D di beberapa model) |
| Pin | GND, VCC, SCL, SDA |
Pengkabelan layar OLED
| Pin OLED | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| GND | GND | GND | GND |
| VCC | 5V atau 3.3V | 3V3 | 3V3 |
| SCL | A5 | GPIO 22 | GP5 |
| SDA | A4 | GPIO 21 | GP4 |
Pada model dua warna, 16 baris teratas layar menyala kuning dan sisanya biru; warna ini tidak bisa diubah lewat software, jadi bagian atas akan terlihat bagus kalau didesain seperti bilah judul. Kalau kamu tidak yakin alamat layarnya, pakai sketch scanner I2C dari Cara Memakai Layar LCD I2C.
Menginstal library
- Buka Library Manager di Arduino IDE lalu cari Adafruit SSD1306.
- Ketika ditanya soal dependensi selama instalasi, pilih Install all supaya Adafruit GFX dan Adafruit BusIO ikut terinstal.
- Kalau mau, buka File > Examples > Adafruit SSD1306 > ssd1306_128x64_i2c dan coba dengan alamat layar diatur ke 0x3C.
Program pertama: menulis teks di layar
1#include <Wire.h>
2#include <Adafruit_GFX.h>
3#include <Adafruit_SSD1306.h>
4
5Adafruit_SSD1306 display(128, 64, &Wire, -1); // genişlik, yükseklik, I2C, reset pini yok / width, height, I2C, no reset pin
6
7void setup() {
8 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // I2C adresi / I2C address
9 for (;;); // ekran bulunamadı / display not found
10 }
11 display.clearDisplay();
12 display.setTextColor(SSD1306_WHITE);
13 display.setTextSize(2); // 2 kat büyük / double size
14 display.setCursor(0, 0);
15 display.println(F("BlueGrays"));
16 display.setTextSize(1);
17 display.setCursor(0, 24);
18 display.println(F("OLED 128x64 hazir!"));
19 display.display(); // tamponu ekrana gönder / push the buffer to the screen
20}
21
22void loop() {
23}Menggambar bentuk: fungsi Adafruit GFX
| Fungsi | Yang digambar |
|---|---|
| drawPixel(x, y, warna) | Satu piksel |
| drawLine(x0, y0, x1, y1, warna) | Garis |
| drawRect / fillRect(x, y, lebar, tinggi, warna) | Persegi panjang atau persegi panjang terisi |
| drawCircle / fillCircle(x, y, jari-jari, warna) | Lingkaran atau lingkaran terisi |
| drawRoundRect(x, y, lebar, tinggi, sudut, warna) | Persegi panjang dengan sudut membulat |
| drawTriangle(x0, y0, x1, y1, x2, y2, warna) | Segitiga |
| drawBitmap(x, y, larik, lebar, tinggi, warna) | Gambar siap pakai (bitmap) |
Sudut kiri atas layar adalah (0, 0) dan sudut kanan bawah adalah (127, 63). Untuk warna, kamu memakai SSD1306_WHITE (menyala), SSD1306_BLACK (mati), atau SSD1306_INVERSE (membalik).
Menampilkan nilai sensor: termometer langsung
Kekuatan OLED adalah menampilkan hasil pengukuran dengan angka besar dan grafik. Kode di bawah menulis suhu yang dibaca dari DHT11 dengan font besar dan menampilkan kelembapan sebagai grafik batang di bawahnya. Untuk pengkabelan sensornya, lihat Sensor Suhu dan Kelembapan DHT11.
1#include <Wire.h>
2#include <Adafruit_GFX.h>
3#include <Adafruit_SSD1306.h>
4#include <DHT.h>
5
6Adafruit_SSD1306 display(128, 64, &Wire, -1);
7DHT dht(2, DHT11);
8
9void setup() {
10 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
11 display.setTextColor(SSD1306_WHITE);
12 dht.begin();
13}
14
15void loop() {
16 float t = dht.readTemperature();
17 float h = dht.readHumidity();
18 display.clearDisplay();
19 display.setTextSize(1);
20 display.setCursor(0, 0);
21 display.print(F("Sicaklik / Temp"));
22 display.setTextSize(3);
23 display.setCursor(0, 16);
24 display.print(t, 1);
25 display.print(F("C"));
26 display.drawRect(0, 52, 128, 10, SSD1306_WHITE); // nem çubuğu çerçevesi / humidity bar frame
27 display.fillRect(2, 54, (int)(h / 100.0 * 124), 6, SSD1306_WHITE); // nem oranı kadar dolu / filled by humidity
28 display.display();
29 delay(2000);
30}Menggambar ikonmu sendiri: bitmap
Untuk menampilkan logo atau ikon, gambarnya diubah menjadi larik byte: setiap bit adalah satu piksel. Alat konversi seperti image2cpp langsung mengubah gambar hitam-putih menjadi larik Arduino. Ikon kecil juga bisa kamu tulis secara manual; larik 8×8 di bawah menggambar hati:
1const unsigned char PROGMEM heart[] = {
2 0b01100110,
3 0b11111111,
4 0b11111111,
5 0b11111111,
6 0b01111110,
7 0b00111100,
8 0b00011000,
9 0b00000000
10};
11
12// setup() ya da loop() içinde / inside setup() or loop()
13display.drawBitmap(60, 28, heart, 8, 8, SSD1306_WHITE);
14display.display();OLED dengan ESP32 dan Raspberry Pi Pico
Kode dan library Arduino yang sama berjalan di ESP32; pin I2C-nya adalah GPIO 21 (SDA) dan 22 (SCL). Karena memori ESP32 berlimpah, animasi dan grafik yang diperbarui cepat jauh lebih mulus. Di Pico dengan MicroPython, cukup salin file driver ssd1306.py (dari micropython-lib) ke Pico:
1from machine import Pin, I2C
2import ssd1306 # ssd1306.py Pico'da olmalı / must be on the Pico
3
4i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
5oled = ssd1306.SSD1306_I2C(128, 64, i2c) # adres varsayılan 0x3C / default address 0x3C
6
7oled.fill(0) # ekranı temizle / clear the screen
8oled.text("BlueGrays", 0, 0)
9oled.text("Pico + OLED", 0, 16)
10oled.rect(0, 40, 128, 20, 1) # çerçeve / frame
11oled.fill_rect(2, 42, 80, 16, 1) # dolu çubuk / filled bar
12oled.show() # ekrana gönder / push to the screenUmur layar dan burn-in
Piksel OLED kehilangan kecerahan seiring pemakaian. Kalau gambar yang sama terus berada di layar tanpa berubah selama berbulan-bulan, bayangan samar bisa terbentuk di piksel yang sering menyala. Untuk mencegahnya, matikan layar ketika tidak dipakai (display.ssd1306_command(SSD1306_DISPLAYOFF)), turunkan kecerahannya (display.dim(true)), geser konten statis beberapa piksel sesekali, atau pakai sensor PIR untuk menyalakan layar hanya ketika ada orang di dekatnya.
Ide proyek dengan layar OLED
- Stasiun cuaca mini: tampilkan suhu, kelembapan, dan tekanan udara dengan ikon.
- Game saku: mainkan game seperti Pong atau T-Rex runner dengan tombol atau joystick.
- Penampil cuaca: tampilkan cuaca yang kamu ambil dari internet dengan ESP32, lengkap dengan ikon.
- Layar sensor parkir: tampilkan jarak yang diukur HC-SR04 sebagai angka dan batang.
- Plotter sinyal: gambar nilai analogRead sebagai grafik bergulir di layar.
- Jam meja: satukan waktu dari internet, tanggal, dan cuaca hari ini di satu layar.
Kesalahan umum dan cara mengatasinya
- Layar tetap kosong: display.display() tidak dipanggil, alamatnya salah (0x3D, bukan 0x3C), atau SDA dan SCL tertukar.
- “SSD1306 allocation failed”: RAM Uno habis; buffer layar 128×64 memakan 1 KB. Tulis teks dengan F(), pindahkan larik besar ke PROGMEM, atau pakai library U8g2 yang hemat RAM.
- Gambarnya kacau atau hanya tampil setengah: layar 128×32 dideklarasikan sebagai 128×64 (atau sebaliknya); pakai ukuran yang benar di kode.
- Gambarnya terbalik: putar 180 derajat dengan display.setRotation(2).
- Memasang VCC dan GND terbalik: ini merusak layar secara permanen; baca label pin sebelum menghubungkan.
- Macet secara acak: kabel I2C yang panjang dan longgar; buat kabel tetap pendek dan turunkan kecepatan I2C jika perlu.
Layar OLED adalah cara termurah untuk memberi proyekmu tampilan profesional. Kalau kamu hanya perlu menampilkan angka, display 7-segmen adalah pilihan yang bagus, dan untuk teks yang harus terbaca di bawah sinar matahari, LCD I2C. Di aplikasi BlueGrays kamu akan menemukan game Pong dan T-Rex di OLED, penampil cuaca ESP32, sensor parkir, dan pencatat suhu, lengkap dengan skema rangkaian dan kode.
Pertanyaan umum
Alamat layar OLED-ku 0x3C atau 0x3D?
Sebagian besar modul OLED 128×64 memakai alamat 0x3C; beberapa menjadi 0x3D dengan pengaturan resistor di bagian belakang board. Kalau di bagian belakang tertulis “0x78”, itu notasi 8-bit dan sama dengan 0x3C di kode. Supaya yakin, jalankan sketch scanner I2C.
Apakah layar OLED bisa bekerja di 5 V?
Sebagian besar modul SSD1306 punya regulator di board, jadi bisa diberi daya dari 3,3 V atau 5 V dan dihubungkan langsung ke Arduino Uno. Di ESP32 dan Pico, memberi daya modul dari pin 3V3 juga membuat jalur I2C tetap di 3,3 V.
Kenapa muncul error “SSD1306 allocation failed”?
Library ingin mencadangkan frame buffer 1 KB untuk layar 128×64; kalau RAM 2 KB di Arduino Uno sudah terisi variabel lain, tidak ada tempat untuk buffer itu. Tulis teks tetap dengan makro F(), pindahkan larik besar ke PROGMEM, atau pakai library U8g2 yang menggambar halaman demi halaman.
Bisakah layar OLED menampilkan huruf beraksen atau karakter khusus?
Font bawaan Adafruit GFX tidak berisi huruf seperti ş, ğ, atau é. Library U8g2 bisa menampilkannya dengan dukungan UTF-8 dan font dengan set karakter yang besar; dengan Adafruit GFX kamu perlu membuat font kustom atau menggambar hurufnya sebagai bitmap.
Apakah ada layar OLED berwarna?
Layar SSD1306 monokrom; bahkan pada model dua warna, warnanya tetap. Untuk gambar berwarna, pakai OLED berwarna dengan driver SSD1331 atau SSD1351, atau layar TFT berwarna seperti ST7789 dan ILI9341.
Bisakah aku menghubungkan dua layar OLED ke satu Arduino?
Bisa. Kalau kamu mengubah alamat salah satu layar menjadi 0x3D dengan memindahkan resistor di bagian belakang, keduanya bisa berbagi bus I2C yang sama. Kalau alamatnya tidak bisa diubah, kamu bisa memakai bus I2C kedua di ESP32 dan Pico, atau menambahkan multiplexer I2C seperti TCA9548A.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
Game Bola Pemukul - SSD1306
Satu bola, dua pemukul, dan kamu: kamu bermain tenis meja, salah satu video game paling awal, di layar OLED kecil. Dua tombol menggerakkan pemukulmu di kanan ke atas dan ke bawah, sementara komputer m

OLED T-Rex Run: Game Dinosaurus Arduino
Game dinosaurus yang muncul ketika internetmu putus, sekarang ada di mejamu: dinosaurus berlari di layar OLED kecil, kaktus datang menghampiri, dan kamu melompat dengan satu tombol. Skormu naik secara

HTTPClient + API Cuaca ESP32 (dengan Layar OLED SSD1306)
Di proyek ini, kita memakai ESP32 untuk melakukan panggilan REST API ke API cuaca (wttr.in) lewat internet dengan HTTPClient.h. Berbeda dengan versi LCD I2C sebelumnya, di sini kita memakai layar OLED SSD1306 (128×64), yang memungkinkan font besar, ikon vektor, dan tampilan visual yang kaya di satu layar. Tujuh ikon vektor untuk kondisi cuaca (cerah, berawan sebagian, berawan, hujan, salju, badai, berkabut) digambar ketika program berjalan (tanpa file bitmap).

Deep Sleep ESP32: Hemat Baterai (OLED + Penghitung RTC RAM)
Mode Deep Sleep ESP32 menurunkan konsumsi arus hingga ~10 µA dengan mematikan CPU dan sebagian besar periferal, sehingga sangat penting untuk perangkat IoT bertenaga baterai. Di proyek ini, kita memakai tiga sumber bangun yang berbeda: timer (15 detik), pin eksternal (EXT0, tombol GPIO 33), dan sentuhan (T0/GPIO 4). Variabel yang ditandai RTC_DATA_ATTR dipertahankan selama deep sleep; penghitung boot, penghitung bangun karena timer, dan penghitung bangun karena tombol terus dilacak.

Penghitung Rakaat Salat ESP32 (HC-SR04 + OLED SSD1306 + 2 Tombol)
Kadang lupa sudah berapa rakaat ketika salat? Proyek ini membuat penghitung rakaat yang diletakkan di samping sajadah dan menghitung sujudmu ketika kamu mendekatkan tangan. Sensor ultrasonik HC-SR04 mendeteksi tangan yang mendekat, OLED SSD1306 menampilkan jumlah rakaat, dan dua tombol memilih 2, 3, atau 4 rakaat serta mereset hitungan. State machine dengan jeda debounce 2,5 detik dan algoritma "tangan menjauh" mencegah sujud yang sama terhitung dua kali.

Lampu Pencampur Warna ESP32 (3 Potensiometer + LED RGB + OLED)
Lampu pencampur warna pintar: campur warna apa pun dengan memutar tiga potensiometer di ESP32! Ketika potensiometer merah, hijau, dan biru diputar, LED RGB katoda bersama berubah warna secara real-time. OLED SSD1306 menampilkan nilai setiap warna dalam rentang 0–255, bar pengisi, dan kode warna web HEX (seperti #FF8040). Studio warna mini yang mengajarkan teori warna RGB, pembacaan ADC, pengaturan kecerahan dengan PWM, dan desain layar I2C sekaligus.

Lampu Pintar ESP32 (PIR + LDR + Relay + OLED)
Ubah lorong, kamar mandi, atau gudangmu menjadi lampu pintar dengan ESP32! Dengan sensor gerak PIR, sensor cahaya LDR, dan modul relay, kita membuat skenario klasik "lampu menyala ketika ada gerakan dalam gelap"; jika sudah terang, gerakan TIDAK menyalakan lampu, jadi energi hemat di siang hari. Lampu menyala 30 detik; jika gerakan berlanjut, timer diulang. OLED SSD1306 menampilkan status dengan font besar (NYALA / SIANG / MENUNGGU) dan hitung mundur.

Pencatat Data Suhu ESP32 (DHT22 + RTC DS1307 + microSD + OLED)
Buat pencatat suhu bercap waktu dengan ESP32! Baca suhu/kelembapan DHT22 setiap menit, ambil waktu sebenarnya dari RTC DS1307, dan catat ke kartu microSD sebagai CSV. OLED menampilkan suhu langsung (font besar), kelembapan, cap waktu, dan penghitung catatan. File /temp_log.csv bisa dibuka di Excel, Google Sheets, atau Python pandas; cocok untuk rumah kaca, suhu kamar, data laboratorium, penyimpanan makanan, atau sarang lebah.
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

