just sharing my life experiences

Welcome

Jumat, 28 Agustus 2026

Radio FM menggunakan RDA5807 dengan ESP32 dan oled 0.96 inch

 bahan :

ESP32, RDA5807FP atau RDA5807M, oled display 0.96inch, rotary encoder, kabel secukupnya, PCB dual layer (opsional)

kode cpp :

#include <Wire.h>

#include <RDA5807.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>


// Definisi Dimensi OLED

#define SCREEN_I2C_ADDR 0x3C

#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 64

#define OLED_RESET    -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


// Definisi Pin Rotary Encoder

#define PIN_CLK 14

#define PIN_DT  27

#define PIN_SW  26


//status baterai

#define PIN_BATTERY 34

int getBatteryPercentage() {

  // Ambil beberapa sampel pembacaan agar angka persentase stabil / tidak melompat-lompat

  long sum = 0;

  for (int i = 0; i < 10; i++) {

    sum += analogRead(PIN_BATTERY);

    delay(2);

  }

  float rawADC = sum / 10.0;

  

  // Konversi ADC (12-bit = 0-4095) ke Tegangan Baterai

  // Catatan: Jika persen baterai penuh terbaca kurang dari 100%, 

  // ubah angka 3.3 di bawah menjadi 3.15 atau 3.2 secara perlahan.

  float voltage = (rawADC / 4095.0) * 3.3 * 2.0; 

  

  // Rentang tegangan Li-ion 18650: 3.2V (0%) sampai 4.2V (100%)

  int percentage = map(voltage * 100, 320, 420, 0, 100);

  

  // Batasi agar tidak minus atau lebih dari 100%

  return constrain(percentage, 0, 100);

}


// animasi sinyal

#define FRAME_DELAY (42)

#define FRAME_WIDTH (64)

#define FRAME_HEIGHT (64)

#define FRAME_COUNT (sizeof(frames) / sizeof(frames[0]))

const byte PROGMEM frames[][512] = 

{

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,252,0,0,0,0,0,7,255,255,224,0,0,0,0,127,255,255,254,0,0,0,1,254,0,0,127,128,0,0,7,224,0,0,7,224,0,0,31,128,0,0,1,248,0,0,126,0,0,0,0,126,0,1,248,0,0,0,0,31,128,3,192,0,127,254,0,7,192,7,128,7,255,255,224,1,224,31,0,63,248,31,252,0,240,60,0,254,0,0,127,0,60,120,3,240,0,0,15,192,30,240,15,192,0,0,3,240,15,120,31,0,0,0,0,248,30,60,124,0,7,224,0,62,60,30,240,0,255,255,0,15,120,15,224,7,255,255,224,7,240,7,192,31,224,7,248,3,224,3,0,127,0,0,254,0,192,0,1,248,0,0,31,128,0,0,3,224,0,0,7,192,0,0,7,128,0,0,1,224,0,0,15,0,15,240,0,240,0,0,30,0,255,255,0,120,0,0,14,3,255,255,192,112,0,0,7,15,192,3,240,224,0,0,3,158,0,0,121,192,0,0,1,252,0,0,63,128,0,0,0,240,0,0,31,0,0,0,0,96,0,0,6,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,252,0,0,0,0,0,7,255,255,224,0,0,0,0,127,255,255,254,0,0,0,1,254,0,0,127,128,0,0,7,224,0,0,7,224,0,0,31,128,0,0,1,248,0,0,126,0,0,0,0,126,0,1,248,0,0,0,0,31,128,3,192,0,127,254,0,7,192,7,128,7,255,255,224,1,224,31,0,63,248,31,252,0,240,60,0,254,0,0,127,0,60,120,3,240,0,0,15,192,30,240,15,192,0,0,3,240,15,120,31,0,0,0,0,248,30,60,124,0,7,224,0,62,60,30,240,0,255,255,0,15,120,15,224,7,255,255,224,7,240,7,192,31,224,7,248,3,224,3,0,127,0,0,254,0,192,0,1,248,0,0,31,128,0,0,3,224,0,0,7,192,0,0,7,128,0,0,1,224,0,0,15,0,15,240,0,240,0,0,30,0,255,255,0,120,0,0,14,3,255,255,192,112,0,0,7,15,192,3,240,224,0,0,3,158,0,0,121,192,0,0,1,252,0,0,63,128,0,0,0,240,0,0,31,0,0,0,0,96,0,0,6,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,252,0,0,0,0,0,7,255,255,224,0,0,0,0,127,255,255,254,0,0,0,1,254,0,0,127,128,0,0,7,224,0,0,7,224,0,0,31,128,0,0,1,248,0,0,126,0,0,0,0,126,0,1,248,0,0,0,0,31,128,3,192,0,127,254,0,7,192,7,128,7,255,255,224,1,224,31,0,63,248,31,252,0,240,60,0,254,0,0,127,0,60,120,3,240,0,0,15,192,30,240,15,192,0,0,3,240,15,120,31,0,0,0,0,248,30,60,124,0,7,224,0,62,60,30,240,0,255,255,0,15,120,15,224,7,255,255,224,7,240,7,192,31,224,7,248,3,224,3,0,127,0,0,254,0,192,0,1,248,0,0,31,128,0,0,3,224,0,0,7,192,0,0,7,128,0,0,1,224,0,0,15,0,15,240,0,240,0,0,30,0,255,255,0,120,0,0,14,3,255,255,192,112,0,0,7,15,192,3,240,224,0,0,3,158,0,0,121,192,0,0,1,252,0,0,63,128,0,0,0,240,0,0,31,0,0,0,0,96,0,0,6,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,252,0,0,0,0,0,7,255,255,224,0,0,0,0,127,255,255,254,0,0,0,1,254,0,0,127,128,0,0,7,224,0,0,7,224,0,0,31,128,0,0,1,248,0,0,126,0,0,0,0,126,0,1,248,0,0,0,0,31,128,3,192,0,127,254,0,7,192,7,128,7,255,255,224,1,224,31,0,63,248,31,252,0,240,60,0,254,0,0,127,0,60,120,3,240,0,0,15,192,30,240,15,192,0,0,3,240,15,120,31,0,0,0,0,248,30,60,124,0,7,224,0,62,60,30,240,0,255,255,0,15,120,15,224,7,255,255,224,7,240,7,192,31,224,7,248,3,224,3,0,127,0,0,254,0,192,0,1,248,0,0,31,128,0,0,3,224,0,0,7,192,0,0,7,128,0,0,1,224,0,0,15,0,15,240,0,240,0,0,30,0,255,255,0,120,0,0,14,3,255,255,192,112,0,0,7,15,192,3,240,224,0,0,3,158,0,0,121,192,0,0,1,252,0,0,63,128,0,0,0,240,0,0,31,0,0,0,0,96,0,0,6,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,252,0,0,0,0,0,7,255,255,224,0,0,0,0,127,255,255,254,0,0,0,1,254,0,0,127,128,0,0,7,224,0,0,7,224,0,0,31,128,0,0,1,248,0,0,126,0,0,0,0,126,0,1,248,0,0,0,0,31,128,3,192,0,127,254,0,7,192,7,128,7,255,255,224,1,224,31,0,63,248,31,252,0,240,60,0,254,0,0,127,0,60,120,3,240,0,0,15,192,30,240,15,192,0,0,3,240,15,120,31,0,0,0,0,248,30,60,124,0,127,254,0,62,60,30,240,7,255,255,224,15,120,15,224,31,224,7,248,7,240,7,192,127,0,0,254,3,224,3,0,248,0,0,31,0,192,0,3,224,0,0,7,192,0,0,7,128,0,0,1,224,0,0,15,0,15,240,0,240,0,0,30,0,255,255,0,120,0,0,14,3,255,255,192,112,0,0,7,15,224,7,240,224,0,0,3,159,0,0,249,192,0,0,1,252,0,0,63,128,0,0,1,248,0,0,31,128,0,0,0,224,0,0,7,0,0,0,0,0,31,248,0,0,0,0,0,0,127,254,0,0,0,0,0,1,248,31,128,0,0,0,0,3,192,3,192,0,0,0,0,3,128,1,192,0,0,0,0,1,192,3,128,0,0,0,0,0,224,7,0,0,0,0,0,0,240,14,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,255,255,0,0,0,0,0,15,255,255,240,0,0,0,0,127,255,255,254,0,0,0,3,254,0,0,127,192,0,0,15,224,0,0,7,240,0,0,63,128,0,0,1,252,0,0,254,0,0,0,0,127,0,1,248,0,0,0,0,31,128,3,192,0,255,255,0,7,192,15,128,15,255,255,240,1,240,31,0,127,128,1,254,0,248,60,1,252,0,0,63,128,60,120,7,224,0,0,7,192,30,240,15,128,0,0,1,240,15,120,30,0,255,255,0,120,30,60,124,7,255,255,224,62,60,30,240,31,224,7,248,15,120,15,224,126,0,0,126,7,240,7,192,248,0,0,31,3,224,3,3,224,0,0,7,192,192,0,7,128,0,0,1,224,0,0,15,0,3,192,0,240,0,0,30,0,127,254,0,120,0,0,30,3,255,255,192,120,0,0,15,7,224,7,224,240,0,0,7,159,0,0,249,224,0,0,3,252,0,0,63,192,0,0,1,248,0,0,31,128,0,0,0,224,0,0,15,0,0,0,0,64,15,240,2,0,0,0,0,0,63,252,0,0,0,0,0,0,255,255,0,0,0,0,0,1,240,15,128,0,0,0,0,3,192,3,192,0,0,0,0,3,128,1,192,0,0,0,0,1,192,3,128,0,0,0,0,0,224,7,0,0,0,0,0,0,112,14,0,0,0,0,0,0,56,28,0,0,0,0,0,0,28,56,0,0,0,0,0,0,14,112,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,224,0,0,0,0,0,3,255,255,192,0,0,0,0,63,255,255,252,0,0,0,1,255,224,7,255,128,0,0,7,248,0,0,31,224,0,0,31,192,0,0,3,248,0,0,126,0,0,0,0,126,0,0,248,0,0,0,0,31,0,3,224,0,31,248,0,7,192,7,128,3,255,255,192,1,224,15,0,63,255,255,252,0,240,30,0,255,0,0,255,0,120,120,3,248,0,0,31,192,30,240,15,192,0,0,3,240,15,240,31,128,0,0,1,248,15,120,62,0,7,224,0,124,30,60,248,1,255,255,128,30,60,31,240,15,255,255,240,15,248,15,192,63,192,3,252,3,240,7,128,126,0,0,126,1,224,3,1,240,0,0,15,128,192,0,3,192,0,0,3,192,0,0,15,128,0,0,1,224,0,0,30,0,15,240,0,120,0,0,28,0,255,255,0,56,0,0,30,3,255,255,192,120,0,0,15,15,224,7,240,240,0,0,7,159,0,0,249,224,0,0,3,252,0,0,63,192,0,0,1,248,0,0,31,128,0,0,0,224,0,0,7,0,0,0,0,64,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,255,255,0,0,0,0,0,1,224,7,128,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,14,112,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,255,255,128,0,0,0,0,15,255,255,240,0,0,0,0,255,248,31,255,0,0,0,3,252,0,0,63,192,0,0,15,192,0,0,3,240,0,0,63,0,0,0,0,252,0,0,252,0,0,0,0,63,0,1,240,0,0,0,0,15,128,7,192,0,255,255,0,3,224,15,0,15,255,255,240,0,240,30,0,127,248,31,254,0,120,60,1,254,0,0,127,128,60,248,7,240,0,0,15,224,31,240,15,128,0,0,1,240,15,240,30,0,0,0,0,120,15,120,124,0,0,0,0,62,30,60,240,0,0,0,0,15,60,31,224,0,0,0,0,7,248,15,128,0,0,0,0,1,240,7,0,0,0,0,0,0,224,2,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,254,0,0,0,0,0,3,255,255,192,0,0,0,0,15,240,15,240,0,0,0,0,31,0,0,248,0,0,0,0,124,0,0,60,0,0,0,0,240,0,0,15,0,0,0,1,224,15,240,7,128,0,0,3,192,127,254,3,192,0,0,1,225,255,255,135,128,0,0,0,247,192,3,239,0,0,0,0,127,0,0,254,0,0,0,0,62,0,0,124,0,0,0,0,24,7,224,24,0,0,0,0,0,63,252,0,0,0,0,0,0,255,255,0,0,0,0,0,1,248,31,128,0,0,0,0,3,192,3,192,0,0,0,0,3,128,1,192,0,0,0,0,1,192,3,128,0,0,0,0,0,224,7,0,0,0,0,0,0,240,14,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,252,0,0,0,0,0,3,255,255,192,0,0,0,0,31,192,3,248,0,0,0,0,126,0,0,126,0,0,0,1,240,0,0,15,128,0,0,3,192,0,0,3,192,0,0,15,0,63,252,0,240,0,0,28,3,255,255,192,56,0,0,56,15,224,7,240,28,0,0,240,62,0,0,124,15,0,0,224,248,0,0,31,7,0,0,113,224,0,0,7,142,0,0,59,128,0,0,3,220,0,0,31,0,0,0,0,248,0,0,14,0,0,0,0,112,0,0,4,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,248,0,0,0,0,0,0,124,62,0,0,0,0,0,1,239,247,128,0,0,0,0,3,191,253,192,0,0,0,0,3,255,255,192,0,0,0,0,3,224,7,128,0,0,0,0,3,128,3,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,14,112,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,224,0,0,0,0,0,0,63,252,0,0,0,0,0,0,224,7,0,0,0,0,0,3,143,225,192,0,0,0,0,6,63,252,96,0,0,0,0,12,224,7,48,0,0,0,0,7,159,249,224,0,0,0,0,3,127,254,192,0,0,0,0,1,252,63,128,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,224,7,0,0,0,0,0,3,159,249,192,0,0,0,0,7,127,254,224,0,0,0,0,3,252,63,192,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,248,0,0,0,0,0,1,255,255,128,0,0,0,0,7,252,63,224,0,0,0,0,31,0,0,248,0,0,0,0,124,0,0,62,0,0,0,0,240,127,254,15,0,0,0,3,195,255,255,195,192,0,0,7,135,224,7,225,224,0,0,15,31,0,0,248,240,0,0,7,60,0,0,60,224,0,0,3,248,0,0,31,192,0,0,1,224,0,0,7,128,0,0,0,192,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,248,0,0,0,0,0,0,127,254,0,0,0,0,0,0,255,255,0,0,0,0,0,1,252,63,128,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,248,0,0,0,0,0,3,255,255,192,0,0,0,0,63,255,255,252,0,0,0,1,255,0,0,255,128,0,0,3,240,0,0,15,192,0,0,15,128,0,0,1,240,0,0,62,0,0,0,0,124,0,0,120,0,127,254,0,30,0,0,240,7,255,255,224,15,0,3,224,31,255,255,248,7,192,7,128,127,0,1,254,1,224,15,1,248,0,0,31,128,240,14,7,224,0,0,7,224,112,7,15,128,0,0,1,240,224,3,158,0,0,0,0,121,192,1,252,0,0,0,0,63,128,0,248,0,0,0,0,31,0,0,224,0,0,0,0,7,0,0,64,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,254,0,0,0,0,0,1,255,255,128,0,0,0,0,7,224,7,224,0,0,0,0,15,128,1,240,0,0,0,0,30,7,224,120,0,0,0,0,56,63,252,28,0,0,0,0,60,255,255,60,0,0,0,0,31,240,15,248,0,0,0,0,15,207,243,240,0,0,0,0,7,63,252,224,0,0,0,0,0,255,255,0,0,0,0,0,1,224,7,128,0,0,0,0,3,128,3,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,14,112,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,255,255,128,0,0,0,0,15,255,255,240,0,0,0,0,255,248,31,255,0,0,0,3,252,0,0,63,192,0,0,15,192,0,0,3,240,0,0,63,0,0,0,0,252,0,0,252,0,0,0,0,63,0,1,240,0,0,0,0,15,128,7,192,0,255,255,0,3,224,15,0,15,255,255,240,0,240,30,0,127,248,31,254,0,120,60,1,254,0,0,127,128,60,248,7,240,0,0,15,224,31,240,15,128,0,0,1,240,15,240,30,0,0,0,0,120,15,120,124,0,0,0,0,62,30,60,240,0,0,0,0,15,60,31,224,0,0,0,0,7,248,15,128,0,0,0,0,1,240,7,0,0,0,0,0,0,224,2,0,0,31,248,0,0,64,0,0,0,255,255,0,0,0,0,0,7,255,255,224,0,0,0,0,31,192,3,248,0,0,0,0,124,0,0,62,0,0,0,0,240,0,0,31,0,0,0,1,224,0,0,7,128,0,0,7,192,31,248,3,224,0,0,7,128,255,255,1,224,0,0,3,131,255,255,193,192,0,0,1,199,192,3,227,128,0,0,0,255,0,0,255,0,0,0,0,252,0,0,62,0,0,0,0,120,0,0,30,0,0,0,0,48,0,0,12,0,0,0,0,0,7,224,0,0,0,0,0,0,63,252,0,0,0,0,0,0,255,255,0,0,0,0,0,1,248,31,128,0,0,0,0,3,192,3,192,0,0,0,0,3,128,1,192,0,0,0,0,1,192,3,128,0,0,0,0,0,224,7,0,0,0,0,0,0,240,14,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,224,0,0,0,0,0,3,255,255,192,0,0,0,0,63,255,255,252,0,0,0,1,255,224,7,255,128,0,0,7,248,0,0,31,224,0,0,31,192,0,0,3,248,0,0,126,0,0,0,0,126,0,0,248,0,0,0,0,31,0,3,224,0,31,248,0,7,192,7,128,3,255,255,192,1,224,15,0,63,255,255,252,0,240,30,0,255,0,0,255,0,120,120,3,248,0,0,31,192,30,240,15,192,0,0,3,240,15,240,31,128,0,0,1,248,15,120,62,0,7,224,0,124,30,60,248,1,255,255,128,30,60,31,240,15,255,255,240,15,248,15,192,63,192,3,252,3,240,7,128,126,0,0,126,1,224,3,1,240,0,0,15,128,192,0,3,192,0,0,3,192,0,0,15,128,0,0,1,224,0,0,30,0,15,240,0,120,0,0,28,0,255,255,0,56,0,0,30,3,255,255,192,120,0,0,15,15,224,7,240,240,0,0,7,159,0,0,249,224,0,0,3,252,0,0,63,192,0,0,1,248,0,0,31,128,0,0,0,224,0,0,7,0,0,0,0,64,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,255,255,0,0,0,0,0,1,224,7,128,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,14,112,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,255,255,0,0,0,0,0,15,255,255,240,0,0,0,0,127,255,255,254,0,0,0,3,254,0,0,127,192,0,0,15,224,0,0,7,240,0,0,63,128,0,0,1,252,0,0,254,0,0,0,0,127,0,1,248,0,0,0,0,31,128,3,192,0,255,255,0,7,192,15,128,15,255,255,240,1,240,31,0,127,128,1,254,0,248,60,1,252,0,0,63,128,60,120,7,224,0,0,7,192,30,240,15,128,0,0,1,240,15,120,30,0,255,255,0,120,30,60,124,7,255,255,224,62,60,30,240,31,224,7,248,15,120,15,224,126,0,0,126,7,240,7,192,248,0,0,31,3,224,3,3,224,0,0,7,192,192,0,7,128,0,0,1,224,0,0,15,0,3,192,0,240,0,0,30,0,127,254,0,120,0,0,30,3,255,255,192,120,0,0,15,7,224,7,224,240,0,0,7,159,0,0,249,224,0,0,3,252,0,0,63,192,0,0,1,248,0,0,31,128,0,0,0,224,0,0,15,0,0,0,0,64,15,240,2,0,0,0,0,0,63,252,0,0,0,0,0,0,255,255,0,0,0,0,0,1,240,15,128,0,0,0,0,3,192,3,192,0,0,0,0,3,128,1,192,0,0,0,0,1,192,3,128,0,0,0,0,0,224,7,0,0,0,0,0,0,112,14,0,0,0,0,0,0,56,28,0,0,0,0,0,0,28,56,0,0,0,0,0,0,14,112,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,252,0,0,0,0,0,7,255,255,224,0,0,0,0,127,255,255,254,0,0,0,1,254,0,0,127,128,0,0,7,224,0,0,7,224,0,0,31,128,0,0,1,248,0,0,126,0,0,0,0,126,0,1,248,0,0,0,0,31,128,3,192,0,127,254,0,7,192,7,128,7,255,255,224,1,224,31,0,63,248,31,252,0,240,60,0,254,0,0,127,0,60,120,3,240,0,0,15,192,30,240,15,192,0,0,3,240,15,120,31,0,0,0,0,248,30,60,124,0,127,254,0,62,60,30,240,7,255,255,224,15,120,15,224,31,224,7,248,7,240,7,192,127,0,0,254,3,224,3,0,248,0,0,31,0,192,0,3,224,0,0,7,192,0,0,7,128,0,0,1,224,0,0,15,0,15,240,0,240,0,0,30,0,255,255,0,120,0,0,14,3,255,255,192,112,0,0,7,15,224,7,240,224,0,0,3,159,0,0,249,192,0,0,1,252,0,0,63,128,0,0,1,248,0,0,31,128,0,0,0,224,0,0,7,0,0,0,0,0,31,248,0,0,0,0,0,0,127,254,0,0,0,0,0,1,248,31,128,0,0,0,0,3,192,3,192,0,0,0,0,3,128,1,192,0,0,0,0,1,192,3,128,0,0,0,0,0,224,7,0,0,0,0,0,0,240,14,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,252,0,0,0,0,0,7,255,255,224,0,0,0,0,127,255,255,254,0,0,0,1,254,0,0,127,128,0,0,7,224,0,0,7,224,0,0,31,128,0,0,1,248,0,0,126,0,0,0,0,126,0,1,248,0,0,0,0,31,128,3,192,0,127,254,0,7,192,7,128,7,255,255,224,1,224,31,0,63,248,31,252,0,240,60,0,254,0,0,127,0,60,120,3,240,0,0,15,192,30,240,15,192,0,0,3,240,15,120,31,0,0,0,0,248,30,60,124,0,7,224,0,62,60,30,240,0,255,255,0,15,120,15,224,7,255,255,224,7,240,7,192,31,224,7,248,3,224,3,0,127,0,0,254,0,192,0,1,248,0,0,31,128,0,0,3,224,0,0,7,192,0,0,7,128,0,0,1,224,0,0,15,0,15,240,0,240,0,0,30,0,255,255,0,120,0,0,14,3,255,255,192,112,0,0,7,15,192,3,240,224,0,0,3,158,0,0,121,192,0,0,1,252,0,0,63,128,0,0,0,240,0,0,31,0,0,0,0,96,0,0,6,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,252,0,0,0,0,0,7,255,255,224,0,0,0,0,127,255,255,254,0,0,0,1,254,0,0,127,128,0,0,7,224,0,0,7,224,0,0,31,128,0,0,1,248,0,0,126,0,0,0,0,126,0,1,248,0,0,0,0,31,128,3,192,0,127,254,0,7,192,7,128,7,255,255,224,1,224,31,0,63,248,31,252,0,240,60,0,254,0,0,127,0,60,120,3,240,0,0,15,192,30,240,15,192,0,0,3,240,15,120,31,0,0,0,0,248,30,60,124,0,7,224,0,62,60,30,240,0,255,255,0,15,120,15,224,7,255,255,224,7,240,7,192,31,224,7,248,3,224,3,0,127,0,0,254,0,192,0,1,248,0,0,31,128,0,0,3,224,0,0,7,192,0,0,7,128,0,0,1,224,0,0,15,0,15,240,0,240,0,0,30,0,255,255,0,120,0,0,14,3,255,255,192,112,0,0,7,15,192,3,240,224,0,0,3,158,0,0,121,192,0,0,1,252,0,0,63,128,0,0,0,240,0,0,31,0,0,0,0,96,0,0,6,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,252,0,0,0,0,0,7,255,255,224,0,0,0,0,127,255,255,254,0,0,0,1,254,0,0,127,128,0,0,7,224,0,0,7,224,0,0,31,128,0,0,1,248,0,0,126,0,0,0,0,126,0,1,248,0,0,0,0,31,128,3,192,0,127,254,0,7,192,7,128,7,255,255,224,1,224,31,0,63,248,31,252,0,240,60,0,254,0,0,127,0,60,120,3,240,0,0,15,192,30,240,15,192,0,0,3,240,15,120,31,0,0,0,0,248,30,60,124,0,7,224,0,62,60,30,240,0,255,255,0,15,120,15,224,7,255,255,224,7,240,7,192,31,224,7,248,3,224,3,0,127,0,0,254,0,192,0,1,248,0,0,31,128,0,0,3,224,0,0,7,192,0,0,7,128,0,0,1,224,0,0,15,0,15,240,0,240,0,0,30,0,255,255,0,120,0,0,14,3,255,255,192,112,0,0,7,15,192,3,240,224,0,0,3,158,0,0,121,192,0,0,1,252,0,0,63,128,0,0,0,240,0,0,31,0,0,0,0,96,0,0,6,0,0,0,0,0,15,240,0,0,0,0,0,0,127,254,0,0,0,0,0,0,252,63,0,0,0,0,0,3,224,7,192,0,0,0,0,3,128,1,192,0,0,0,0,3,192,3,192,0,0,0,0,1,224,7,128,0,0,0,0,0,240,15,0,0,0,0,0,0,120,30,0,0,0,0,0,0,60,60,0,0,0,0,0,0,30,120,0,0,0,0,0,0,15,240,0,0,0,0,0,0,7,224,0,0,0,0,0,0,3,192,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}

};



//efek teks ketik berjalan

void printTypewriter(const char* str, uint16_t delayMs) {

  while (*str) {

    display.print(*str);

    display.display();

    delay(delayMs);

    str++;

  }

}


// deteksi IC RDA5807

uint8_t i2cAdd[5];

int i2cStatus;


// Inisialisasi Radio

RDA5807 rx;


// Variabel Kontrol Radio

uint16_t currentFrequency = 9200; // 100.00 MHz (dalam format kHz / 10)

uint8_t currentVolume = 5;        // Skala 0 - 63 pada RDA5807

bool isStereoMode = true;          // true = Stereo, false = Mono

uint16_t stepFreq = 10;            // Step 10 = 100 kHz (0.1 MHz), Step 5 = 50 kHz (0.05 MHz)


unsigned long lastRssiUpdate = 0;

const unsigned long RSSI_UPDATE_INTERVAL = 250; // Perbarui status RSSI setiap 250ms


// Modul Menu State

// 0: Tuning Frekuensi, 1: Volume, 2: Step Frekuensi (50k/100k), 3: Mono/Stereo

enum ModeMenu { TUNING, VOLUME, STEP_SELECT, AUDIO_MODE };

ModeMenu currentMenu = TUNING;


// Variabel Encoder State

int lastClkState;

unsigned long lastDebounceTime = 0;


void setup() {

  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_I2C_ADDR);

  

Serial.begin(115200);


  // Inisialisasi OLED

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {

    Serial.println(F("OLED SSD1306 gagal diinisialisasi!"));

    for (;;);

  }

  display.clearDisplay();

  display.setTextColor(SSD1306_WHITE);

  

  // Inisialisasi IC RDA5807

  i2cStatus = rx.checkI2C(i2cAdd); 

  if (i2cStatus == -1) {

    display.print(F("\nError while try to access the device.\n")); 

    while(1);

  }

  else if(i2cStatus == 0) {

    display.print(F("\nNo device was detected. Please, check your circuit!"));

    while(1);

  }

  else { 

    display.print(F("\n"));

    printTypewriter("RDA5807 found: \nStarting", 75);

    display.setCursor(0, 25);

    display.display();

    delay(1000);

display.clearDisplay();

  }

  

  // play animasi 

  unsigned long welcomeStartTime = millis();

  const unsigned long WELCOME_DURATION = 3500;

  int frame = 0;


  while (millis() - welcomeStartTime < WELCOME_DURATION) {

    display.clearDisplay();

    display.drawBitmap(32, 0, frames[frame], FRAME_WIDTH, FRAME_HEIGHT, 1);

    display.display();

    

    frame = (frame + 1) % FRAME_COUNT;

    delay(FRAME_DELAY); // Delay antar frame animasi

  }

  

  // Inisialisasi Pin Encoder

  pinMode(PIN_CLK, INPUT_PULLUP);

  pinMode(PIN_DT, INPUT_PULLUP);

  pinMode(PIN_SW, INPUT_PULLUP);

  lastClkState = digitalRead(PIN_CLK);


  // Inisialisasi Setup RDA5807

  rx.setup();

  rx.setVolume(currentVolume);

  rx.setBand(2); // 0 = Band FM World (87.5-108 MHz) atau 2 = 76-108 MHz tergantung konfigurasi

  rx.setFrequency(currentFrequency);

  //rx.setMono(false); // Mode Awal Stereo

  rx.setSoftmute(false);

  rx.setRdsFifo(true);

  rx.setBass(true);

  rx.setNewDemodulateMethod(true);

  rx.setAFC(true);

  rx.setSeekThreshold(50);

  

  delay(3000);

  updateDisplay();

}


void loop() {

  handleEncoder();

  handleButton();

  

if (millis() - lastRssiUpdate >= RSSI_UPDATE_INTERVAL) {

    lastRssiUpdate = millis();

    updateDisplay(); 

  }

}


// Handler Pembacaan Diputar Encoder

void handleEncoder() {

  int currentClkState = digitalRead(PIN_CLK);


  if (currentClkState != lastClkState && currentClkState == LOW) {

    if (digitalRead(PIN_DT) != currentClkState) {

      // Putar Kanan (Clockwise)

      processEncoderTurn(1);

    } else {

      // Putar Kiri (Counter-Clockwise)

      processEncoderTurn(-1);

    }

// updateDisplay();

  }

  lastClkState = currentClkState;

}


// Evaluasi Aksi Berdasarkan Menu Saat Ini

void processEncoderTurn(int direction) {

  switch (currentMenu) {

    case TUNING:

      if (direction > 0) {

        currentFrequency += stepFreq;

        if (currentFrequency > 10800) currentFrequency = 7600;

      } else {

        if (currentFrequency < 7600) currentFrequency = 10800;

        else currentFrequency -= stepFreq;

      }

      rx.setFrequency(currentFrequency);

  delay(30);

      break;


    case VOLUME:

      if (direction > 0) {

        if (currentVolume < 63) currentVolume++;

      } else {

        if (currentVolume > 0) currentVolume--;

      }

      rx.setVolume(currentVolume);

      break;


    case STEP_SELECT:

      // Toggle antara step 100 kHz (10) dan 50 kHz (5)

      stepFreq = (stepFreq == 10) ? 5 : 10;

      break;


    case AUDIO_MODE:

      isStereoMode = !isStereoMode;

      rx.setMono(!isStereoMode); // RDA5807 library: setMono(true) merubah ke MONO

      break;

  }

  updateDisplay();

}


// Handler Tombol Push Button Encoder

void handleButton() {

  if (digitalRead(PIN_SW) == LOW) {

    if (millis() - lastDebounceTime > 250) { // Simple Debounce

      // Pindah Mode Menu

      currentMenu = static_cast<ModeMenu>((currentMenu + 1) % 4);

      updateDisplay();

      lastDebounceTime = millis();

    }

  }

}


// Fungsi Khusus Menggambar Ikon Baterai Grafis + Persentase

void drawBatteryStatus(int x, int y) {

  int percent = getBatteryPercentage();


  // 1. Gambar Batang/Garis Luar Baterai (Panjang 12px, Tinggi 7px)

  display.drawRect(x, y, 12, 7, SSD1306_WHITE);

  // Gambar Kutub Positif kecil di sebelah kanan ikon

  display.drawFastVLine(x + 12, y + 2, 3, SSD1306_WHITE);


  // 2. Gambar Isi Baterai (Diisi berdasarkan persentase 0 - 100%)

  // Panjang isi maksimal adalah 8 piksel (di dalam garis luar)

  int fillWidth = map(percent, 0, 100, 0, 8);

  if (fillWidth > 0) {

    display.fillRect(x + 2, y + 2, fillWidth, 3, SSD1306_WHITE);

  }


  // 3. Tampilkan Angka Persentase di Sebelah Kanan Ikon Baterai

  display.setCursor(x + 16, y);

  display.print(percent);

  display.print(F("%"));

}



// Fungsi Utama Menggambar Tampilan Antarmuka

void updateDisplay() {

  display.clearDisplay();


  // --- 1. BARIS ATAS: STATUS STEREO/MONO & SIGNAL ---

  //display.setTextSize(1);

  //display.fillRect(0, 0, 24, 8, SSD1306_BLACK);

  //display.setCursor(0, 0);

display.setCursor(0, 36);

if (isStereoMode) {

  // Jika tombol diset ke Stereo, periksa apakah sinyal antena asli mendukung Stereo

  if (rx.isStereo()) {

    display.print(F("ST"));      // Sinyal bagus & suara Stereo

  } else {

    display.print(F("MO"));      // Sinyal lemah, otomatis jadi Mono

  }

} else {

  // Jika tombol diset ke Mono, suara pasti Mono karena dipaksa

  display.print(F("MONO")); 

}


  // Tampilkan Informasi Menu Aktif Saat Ini

  //display.fillRect(42, 0, 24, 8, SSD1306_BLACK);

  //display.setCursor(42, 0);

  display.setCursor(42, 36);

  switch (currentMenu) {

    case TUNING:      display.print(F("[TUNE]")); break;

    case VOLUME:      display.print(F("[VOL]")); break;

    case STEP_SELECT: display.print(F("[STEP]")); break;

    case AUDIO_MODE:  display.print(F("[MODE]")); break;

  }


  // Sinyal RSSI (0 - 63 dari RDA5807)

  /*char rssi[12];

  rx.convertToChar(rx.getRssi(), rssi, 3, 0, '.');

  strcat(rssi, "dB");

  //display.fillRect(98, 0, 18, 8, SSD1306_BLACK);

  //display.setCursor(98, 0);

  display.setCursor(98, 36);

  display.print(rssi);*/

  int nilaiRssi = rx.getRssi(); 

  display.setCursor(98, 36);

  display.print("      ");

  display.setCursor(98, 36);

  display.print(nilaiRssi);

  display.print("dB");

  

  // --- 2. BARIS TENGAH: FREKUENSI (3 DIGIT KOMA 2 DIGIT) ---

  float freqMHz = currentFrequency / 100.0;

  char freqStr[10];

  sprintf(freqStr, "%06.2f", freqMHz);

  //display.fillRect(5, 18, 72, 16, SSD1306_BLACK);

  display.setTextSize(2);

  display.setCursor(5, 18);

  display.print(freqStr);

  display.setCursor(85, 18);

  display.print(F("MHz"));


  // Sub-informasi volume

  display.setTextSize(1);

  //display.fillRect(0, 36, 32, 8, SSD1306_BLACK);

  //display.setCursor(0, 36);

  display.setCursor(0, 0);

  

  display.print(F("Vol:"));

  display.print(currentVolume);

  

  // Sub-info baterai

  drawBatteryStatus(40, 0);

  

  // Sub-informasi Step

  //display.fillRect(80, 36, 36, 8, SSD1306_BLACK);

  //display.setCursor(75, 36);

  display.setCursor(80, 0);

  

  display.print(F("Step:"));

  display.print(stepFreq == 10 ? F("100") : F("50"));


  // --- 3. BARIS BAWAH: SKALA JARUM VINTAGE ---

  drawVintageDial(currentFrequency);


// --- TAMPILAN PERSEN BATERAI ---

  display.setTextSize(1);

  display.setCursor(55, 0); // Atur koordinat X, Y sesuai area kosong di OLED

  display.print(getBatteryPercentage());

  display.print(F("%"));

  

  display.display();

}


/* Fungsi Gambar Jarum Analog Radio Vintage

void drawVintageDial(uint16_t freq) {

  int dialY = 52;

  int dialHeight = 10;

  

  // Border Skala Radio

  display.drawRect(0, dialY, 128, dialHeight, SSD1306_WHITE);


  // Menggambar garis-garis tick mark (skala)

  for (int x = 4; x < 124; x += 8) {

    display.drawLine(x, dialY, x, dialY + 3, SSD1306_WHITE);

  }


  // Kalkulasi Posisi Jarum Penunjuk (Mapping rentang 76.00-108.00 MHz ke koordinat pixel 2-125)

  int needleX = map(freq, 8700, 10800, 2, 125);

  needleX = constrain(needleX, 2, 125);


  // Gambar Jarum Penunjuk

  display.drawLine(needleX, dialY - 2, needleX, dialY + dialHeight + 1, SSD1306_WHITE);

  display.drawLine(needleX - 1, dialY - 2, needleX + 1, dialY - 2, SSD1306_WHITE); // Segitiga atas jarum

} */


void drawVintageDial(uint16_t freq) {

  int dialY = 52;

  int dialHeight = 10;

  

  // Menggambar TITIK skala

  for (int x = 4; x <= 124; x += 8) {

    display.fillRect(x, dialY + 4, 2, 2, SSD1306_WHITE);

  }


  // Kalkulasi Posisi Jarum Penunjuk

  int needleX = map(freq, 7600, 10800, 2, 125);

  needleX = constrain(needleX, 2, 125);


  // Gambar Jarum Penunjuk

  display.drawLine(needleX, dialY + 1, needleX, dialY + dialHeight + 1, SSD1306_WHITE);

  display.drawPixel(needleX, dialY - 3, SSD1306_WHITE);      

  display.drawLine(needleX - 1, dialY - 2, needleX + 1, dialY - 2, SSD1306_WHITE); 

  display.drawPixel(needleX, dialY - 1, SSD1306_WHITE);      

}


menampilkan : volume suara, baterai indikator, step frekuensi (50/100), Mono/Stereo Mode, kekuatan sinyal RSSI. jarum skala

fitur : deteksi oled, deteksi chipset RDA5807, logo startup, frekuensi 76 - 108 MHz; bisa nguping orang nge brik kalau antena dan lokasi mendukung; pilih mode stereo atau force mono atau otomatis mengikuti kekuatan sinyal.

- kontrol sepenuhnya menggunakan 1 rotary encoder. rencana penambahan sensor sentuh untuk kontrol mono/stereo dan volume, itupun klo ingat

- RDA5807FP wajib menggunakan resistor pullup 10K untuk jalur SDA dan SCL

- indikator baterai menggunakan resistor pembagi masing2 10K ke PIN_BATTERY 34 (pakai baterai 3,7v bekas laptop)

- library menggunakan pu2clr

foto penampakan menyusul klo ingat hehe

My Son