
Tutorial ESP32 / Arduino: Cara Membuat Dadu Digital Elektronik Interaktif dengan Layar OLED SSD1306, Rotary Encoder, Buzzer, & LED pada WOKWI
Pada bagian ini akan dibahas pembuatan proyek kreatif dadu digital interaktif (Digital Dice Simulator) berbasis mikrokontroler Arduino/ESP32, modul layar OLED SSD1306 (128×64 I2C), rotary encoder untuk pengaturan jumlah dadu (1 hingga 3 buah dadu), lampu LED indikator, buzzer efek suara (tick & jingle kemenangan), serta platform simulasi WOKWI. Skematik rangkaian ditunjukkan pada Gambar 1, program Arduino pada Kode 1, dan video pembuatan pada tautan Video 1. Sistem memungkinkan pengguna memilih jumlah dadu yang ingin dilempar dengan memutar rotary encoder, menekan tombol switch (SW) untuk memulai animasi pengocokan dadu realistis (lengkap dengan efek drop dari atas layar dan visual dot pola angka 1 sampai 6), serta menghasilkan umpan balik suara dan cahaya yang sinkron.
Gambar 1. Skematik rangkaian sistem
List Pin:
- Modul Rotary Encoder
CLK (Clock Pin) => Digital Pin 2 (CLK)
DT (Data Pin) => Digital Pin 3 (DT)
SW (Switch Pin) => Digital Pin 4 (SW – dengan internal pull-up)
VCC => 5V / 3.3V
GND => GND - Layar OLED Display I2C (128×64 SSD1306)
SDA => Pin SDA (GPIO 21 pada ESP32 / A4 pada Arduino Uno)
SCL => Pin SCL (GPIO 22 pada ESP32 / A5 pada Arduino Uno)
VCC => 5V / 3.3V
GND => GND - Aktuator Indikator & Audio
Buzzer Alarm (Positive Terminal) => Digital Pin 5 (BUZZER_PIN)
LED Indikator Dadu => Digital Pin 6 (LED_PIN via Resistor 220 Ohm)
List Virtual PIN:
- Proyek ini dirancang sebagai perangkat simulator dadu elektronik interaktif mandiri (standalone/offline) pada platform WOKWI menggunakan layar OLED, rotary encoder, dan buzzer tanpa koneksi internet/cloud. Oleh karena itu, pemetaan Virtual Pin Blynk tidak diterapkan pada modul proyek ini.
// =============================
// ALFIAN CENTER
// SUBSCRIBE
// DADU DIGITAL
// PROGRAM BAKAL DI SHARE KALO LIKE TEMBUS 50 DAN KOMEN 20
// ATAU BISA KIRIM EMAIL VIA KOMENTAR
// =============================
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include <Arduino.h>
#include <Encoder.h> // ✅ pakai library Encoder
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Rotary encoder pins
#define CLK 2
#define DT 3
#define SW 4
// LED + buzzer
#define LED_PIN 6
#define BUZZER_PIN 5
// Encoder object
Encoder encoder(CLK, DT);
long lastEncoderPos = 0;
// state
int encoderPos = 1;
bool swPressed = false;
int diceResult[3] = {1,1,1};
// ✅ Global variabel untuk ukuran dadu & jarak angka
int diceSize = 34;
int numberOffset = 8;
void setup() {
pinMode(SW, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Dadu Elektronik");
display.display();
delay(1000);
}
void loop() {
readEncoder();
if (digitalRead(SW) == LOW && !swPressed) {
swPressed = true;
rollDice();
} else if (digitalRead(SW) == HIGH) {
swPressed = false;
}
drawMenu();
}
void readEncoder() {
long newPos = encoder.read() / 4; // bagi 4 biar langkah nggak terlalu sensitif
if (newPos != lastEncoderPos) {
if (newPos > lastEncoderPos) {
encoderPos++;
} else {
encoderPos--;
}
if (encoderPos < 1) encoderPos = 1;
if (encoderPos > 3) encoderPos = 3;
lastEncoderPos = newPos;
}
}
void rollDice() {
// animasi roll (lebih lama, makin pelan)
for (int i=0; i<20; i++) {
for (int d=0; d<encoderPos; d++) {
diceResult[d] = random(1,7);
}
drawDiceInstant(false);
// efek suara + LED
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 800, 50); // tick pendek
delay(50);
digitalWrite(LED_PIN, LOW);
delay(80 + i*20);
}
// animasi turun dari atas layar
for (int offset=-40; offset<=0; offset+=4) {
drawDiceWithOffset(offset, false);
delay(50);
}
// tampilkan hasil akhir
drawDiceWithOffset(0, true);
// 🎶 Jingle akhir + LED sinkron
playJingle();
delay(2000);
}
void drawMenu() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,0);
display.println("Pilih jumlah dadu:");
display.setTextSize(2);
display.setCursor(50,20);
display.print(encoderPos);
display.display();
}
void drawDiceInstant(bool showNumber) {
drawDiceWithOffset(0, showNumber);
}
void drawDiceWithOffset(int offsetY, bool showNumber) {
display.clearDisplay();
int x[3], y = 10 + offsetY;
if (encoderPos == 1) {
x[0] = (SCREEN_WIDTH - diceSize)/2;
} else if (encoderPos == 2) {
x[0] = 15;
x[1] = SCREEN_WIDTH - diceSize - 15;
} else if (encoderPos == 3) {
x[0] = 5;
x[1] = (SCREEN_WIDTH - diceSize)/2;
x[2] = SCREEN_WIDTH - diceSize - 5;
}
for (int d=0; d<encoderPos; d++) {
drawSingleDice(x[d], y, diceSize, diceResult[d]);
if (showNumber) {
display.setTextSize(1);
display.setCursor(x[d] + diceSize/2 - 3, y + diceSize + numberOffset);
display.print(diceResult[d]);
}
}
display.display();
}
void drawSingleDice(int x, int y, int size, int value) {
display.drawRect(x, y, size, size, SSD1306_WHITE);
int cx = x + size/2;
int cy = y + size/2;
int r = 3;
switch(value) {
case 1:
display.fillCircle(cx, cy, r, SSD1306_WHITE);
break;
case 2:
display.fillCircle(x+8, y+8, r, SSD1306_WHITE);
display.fillCircle(x+size-8, y+size-8, r, SSD1306_WHITE);
break;
case 3:
display.fillCircle(x+8, y+8, r, SSD1306_WHITE);
display.fillCircle(cx, cy, r, SSD1306_WHITE);
display.fillCircle(x+size-8, y+size-8, r, SSD1306_WHITE);
break;
case 4:
display.fillCircle(x+8, y+8, r, SSD1306_WHITE);
display.fillCircle(x+size-8, y+8, r, SSD1306_WHITE);
display.fillCircle(x+8, y+size-8, r, SSD1306_WHITE);
display.fillCircle(x+size-8, y+size-8, r, SSD1306_WHITE);
break;
case 5:
drawSingleDice(x,y,size,4);
display.fillCircle(cx, cy, r, SSD1306_WHITE);
break;
case 6:
display.fillCircle(x+8, y+8, r, SSD1306_WHITE);
display.fillCircle(x+8, cy, r, SSD1306_WHITE);
display.fillCircle(x+8, y+size-8, r, SSD1306_WHITE);
display.fillCircle(x+size-8, y+8, r, SSD1306_WHITE);
display.fillCircle(x+size-8, cy, r, SSD1306_WHITE);
display.fillCircle(x+size-8, y+size-8, r, SSD1306_WHITE);
break;
}
}
void playJingle() {
int melody[] = {600, 800, 1000}; // nada naik
int duration[] = {200, 200, 400};
for (int i=0; i<3; i++) {
tone(BUZZER_PIN, melody[i], duration[i]);
digitalWrite(LED_PIN, HIGH);
delay(duration[i]);
digitalWrite(LED_PIN, LOW);
delay(50);
}
}
Kode Arduino 1. Kode Program

Video 1. Video tutorial pembuatan
TAG:
dadu digital arduino, digital dice oled display, rotary encoder arduino uno, oled ssd1306 128×64, blynk wokwi digital dice, tutorial arduino oled, iot game elektronik, dadu elektronik interaktif, library adafruit ssd1306, library encoder arduino, buzzer tone melodi dadu, led indikator dadu, pinout rotary encoder clk dt sw, i2c oled display arduino, animasi lempar dadu oled, fungsi draw single dice, random number generator arduino, tutorial wokwi indonesia, simulasi iot game, permainan dadu digital, oled screen graphics, datastream oled display, smart game appliances, proyek teknik elektro kreatif, mekatronika game digital, tugas akhir arduino oled, skripsi iot digital dice, ide proyek mikrokontroler, skematik dadu digital oled, diagram rangkaian encoder oled buzzer, source code dadu digital oled, program arduino oled dice, simulasi iot tanpa hardware, platform simulasi wokwi, wokwi arduino digital dice, alat permainan berbasis mikrokontroler, telemetry data oled screen, proyek sains elektro, portofolio mikrokontroler, praktikum arduino uno, modul oled ssd1306 i2c, pinout arduino oled encoder, indikator suara buzzer, grafik dadu oled, game digital konsol mini, efisiensi hiburan elektronik, panduan arduino oled display, belajar mikrokontroler online, simulator komponen elektronik oled, wokwi custom chip game, internet of things indonesia, iot smk teknik elektro, iot universitas teknik, prototipe dadu oled arduino, alat pengocok dadu otomatis, smart game project, arduino ide programming, tutorial arduino pemula, proyek elektro game digital, panduan lengkap wokwi oled, sensor encoder putar akurat, sistem animasi layar oled, logika pemilihan jumlah dadu, notifikasi suara jingle dadu, sistem hiburan interaktif, otomatisasi game elektronik, proyek mekatronika elektro, simulasi hardware digital dice, sistem dadu digital arduino, proyek arduino populer, kodingan game dadu otomatis, oled graphics library, rangkaian encoder dan oled, tutorial mikrokontroler pemula, wawasan teknik elektro, aplikasi oled display, konsol game mini arduino, koding logika switch oled, pemantauan status menu real time, arduino game management system
