Arduino RTC and OLED Display — Arduino Uno simulation

A project featuring an Arduino Uno connected to a DS3231 RTC and an SSD1306 OLED display via I2C.

An interactive Arduino Uno circuit simulation you can run free in your browser on Velxio, by smekantri.

Components

Sketch code

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

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1 

// Inisialisasi OLED (Alamat I2C biasanya 0x3C)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Alamat I2C Arduino Uno ini
const int MY_ADDR = 8; 

// Variabel untuk menyimpan data dari Master
volatile boolean newData = false;
char timeData[15];

void setup() {
  Serial.begin(9600);
  
  // Inisialisasi I2C sebagai Slave dengan alamat 8
  Wire.begin(MY_ADDR); 
  Wire.onReceive(receiveEvent); // Daftarkan fungsi interrupt

  // Inisialisasi OLED
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("OLED gagal diinisialisasi"));
    for(;;);
  }
  
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Menunggu Data...");
  display.display();
}

void loop() {
  // Hanya update layar OLED jika ada data baru masuk
  // Kita melakukan update di loop() agar tidak membebani fungsi interrupt (receiveEvent)
  if (newData) {
    display.clearDisplay();
    
    // Header teks
    display.setTextSize(1);
    display.setCursor(25, 10);
    display.println("WAKTU SAAT INI");
    
    // Menampilkan Waktu (Data dari ESP32)
    display.setTextSize(2);
    display.setCursor(15, 30);
    display.print(timeData);
    
    display.display();
    
    Serial.print("Menerima dari Master: ");
    Serial.println(timeData);
    
    newData = false; // Reset status
  }
}

// Fungsi interrupt I2C saat data masuk dari ESP32
void receiveEvent(int howMany) {
  int i = 0;
  // Baca semua byte yang masuk
  while (Wire.available()) {
    char c = Wire.read();
    if (i < 14) {
      timeData[i] = c;
      i++;
    }
  }
  timeData[i] = '\0'; // Tambahkan null terminator agar menjadi string valid
  newData = true;     // Beri sinyal ke loop() bahwa ada data baru
}

More projects by smekantri