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
Tidak ada komentar:
Posting Komentar