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

Kamis, 12 Maret 2020

5G

Perkembangan dunia yang begitu cepat memaksa koneksi internet yang lebih cepat. Kecepatan tidak lagi diukur dengan satuan mega per detik, namun giga. Dengan ini, negara-negara di dunia harus segera menerapkan teknologi 5G di wilayah mereka.
Beberapa negara sudah menerapkan 5G, dan pabrikan smartphone pun tidak mau melewatkan kesempatan ini. Samsung, Oppo, Xiaomi, dan Huawei merespons dengan mengeluarkan produk-produk yang kompatibel dengan jaringan 5G. Produk tersebut adalah Oppo Reno 5G, Samsung S10 5G, Xiaomi Mi 9 Pro 5G, Mi Mix 4, dan Huawei Mate 30. Produk tersebut tergolong produk flagship, yang berarti harga produk tersebut termasuk tinggi.
Bagi yang belum tahu sebenarnya apa itu jaringan 5G, ini penjelasannya. 5G secara simpelnya adalah jaringan upgrade dari 4G, namun dengan kecepatan dan gelombang yang berbeda. 5G menggunakan gelombang milimeter yang kekuatannya 10-100 kali lebih kuat daripada 4G dan wi-fi.
Kecepatan jaringan 5G diperkirakan bisa mencapai 800 Gbps per detik

Artificial Intelligence


Kecerdasan Buatan atau Artificial Intelligence (AI) adalah cabang ilmu komputer yang menekankan pengembangan intelijen mesin, pola berpikir dan bekerja seperti manusia. Misalnya, pengenalan suara, pemecahan masalah, pembelajaran, dan perencanaan.
Dengan kemajuan teknologi, kita sudah terhubung dengan AI dalam satu atau lain cara — apakah itu Siri, Watson atau Alexa. Ya, teknologi ini sedang dalam tahap awal dan semakin banyak perusahaan yang menginvestasikan sumber daya dalam penelitian mesin, menunjukkan pertumbuhan yang kuat dalam produk dan penerapan teknologi kecerdasan buatan dalam waktu dekat.
Tidak seperti persepsi umum, contoh penerapan Artificial Intelligence (AI) tidak terbatas hanya pada industri IT atau teknologi; sebaliknya, banyak digunakan di bidang lain seperti medis, bisnis, pendidikan, hukum, dan manufaktur.
contoh penerapan kecerdasan buatan yang sudah gunakan saat ini : Siri, Tesla, Cogito, Netflix, Pandora, Nest Learning Thermostat (Google), Boxever, Flying Drones, Alexa

IoT


IoT

Internet of Things adalah suatu konsep dimana objek tertentu punya kemampuan untuk mentransfer data lewat jaringan tanpa memerlukan adanya interaksi dari manusia ke manusia ataupun dari manusia ke perangkat komputer.
Internet of Things lebih sering disebut dengan singkatannya yaitu IoT. IoT ini sudah berkembang pesat mulai dari konvergensi teknologi nirkabel, micro-electromechanical systems (MEMS), dan juga Internet.
IoT ini juga kerap diidentifikasikan dengan RFID sebagai metode komunikasi. Walaupun begitu, IoT juga bisa mencakup teknologi-teknologi sensor lainnya, semacam teknologi nirkabel maupun kode QR yang sering kita temukan di sekitar kita.
Apa saja kemampuan dari IoT? Adapun kemampuannya bermacam-macam contohnya dalam berbagi data, menjadi remote control, dan masih banyak lagi yang lainnya. Sebenarnya fungsinya termasuk juga diterapkan ke benda yang ada di dunia nyata, di sekitar kita. Apa saja contohnya? Contohnya adalah untuk pengolahan bahan pangan, elektronik, dan berbagai mesin atau teknologi lainnya yang semuanya tersambung ke jaringan lokal maupun global lewat sensor yang tertanam dan selalu menyala aktif.
Jadi, sederhananya istilah Internet of Things ini mengacu pada mesin atau alat yang bisa diidentifikasikan sebagai representasi virtual dalam strukturnya yang berbasis Internet
IoT bekerja dengan memanfaatkan suatu argumentasi pemrograman, dimana tiap-tiap perintah argumen tersebut bisa menghasilkan suatu interaksi antar mesin yang telah terhubung secara otomatis tanpa campur tangan manusia dan tanpa terbatas jarak berapapun jauhnya.

Rabu, 28 Desember 2016

Sound Clip TELOLET



Biar dibilang kenikian, nih saya upload berbagai macam klip suara TELOLET dalam format OGG dan MP3

daripada kudu nguber-uber bus yang lagi ngebut, mending save aja nih sound klip nya di telepon pintar mu, dengerin sampai PUASSS




supaya gampang downloadnya, saya upload NIH ke Google Drive GA PAKE IKLAN
langsung aja om sedooot om

Telolet MP3 [4Mb]

Telolet OGG [3Mb]

jangan lupa bagikan, klik like, dan tekan 1 di kolom komentar supaya masuk sorga :v :v

Kamis, 18 Agustus 2016

[Foto] Gunung Gambar - Ngawen, Gunung Kidul

setelah kurang lebih 10 tahun ga berkunjung kesini, akhirnya pada tgl 13 Agustus 2016 kami sekeluarga masih mempunyai kesempatan untuk berkunjung ke tanah kelahiran ibu kami sekaligus tempaat saya dibesarkan sampai kelas 1 SD yaitu Gunung Gambar, Ngawen, Gunung Kidul
untuk sejarah dan lain-lain sudah banyak dibahas di internet. jadi saya tidak menceritakannya disini
biarlah foto2 amatiran hasil jepretan HP jelek saya yang bercerita

berikut hasil jepretan Xiaomi Redmi 2 ditempat tersebut



































































































































































My Son