#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#include <IRremote.hpp>
#define EKRAN_GENISLIK 128
#define EKRAN_YUKSEKLIK 64
const int IR_ALICI_PIN = 13;
Adafruit_SSD1306 ekran(EKRAN_GENISLIK, EKRAN_YUKSEKLIK, &Wire, -1);
RTC_DS3231 rtc;
float mevcutFrekans = 100.0;
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
if (!ekran.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED Hatası!");
while (1);
}
if (!rtc.begin()) {
Serial.println("RTC Hatası!");
while (1);
}
rtc.adjust(DateTime(2026, 2, 21, 18, 27, 0));
IrReceiver.begin(IR_ALICI_PIN, ENABLE_LED_FEEDBACK);
ayarlaRadyoFrekansi(mevcutFrekans);
ekran.clearDisplay();
ekran.setTextColor(SSD1306_WHITE);
}
void loop() {
if (IrReceiver.decode()) {
uint32_t tus = IrReceiver.decodedIRData.decodedRawData;
if (tus != 0) {
if (tus == 0xF708FF00) mevcutFrekans += 0.1;
else if (tus == 0xA55AFF00) mevcutFrekans -= 0.1;
else if (tus == 0xAD52FF00) mevcutFrekans += 1.0;
else if (tus == 0xE718FF00) mevcutFrekans -= 1.0;
else if (tus == 0xE31CFF00) mevcutFrekans = 106.0;
if (mevcutFrekans > 108.0) mevcutFrekans = 87.5;
if (mevcutFrekans < 87.5) mevcutFrekans = 108.0;
ayarlaRadyoFrekansi(mevcutFrekans);
}
IrReceiver.resume();
}
guncelleEkran();
}
void guncelleEkran() {
DateTime simdi = rtc.now();
ekran.clearDisplay();
ekran.setTextSize(2);
ekran.setCursor(15, 0);
ekran.printf("%02d:%02d:%02d", simdi.hour(), simdi.minute(), simdi.second());
ekran.drawFastHLine(0, 22, 128, SSD1306_WHITE);
ekran.setTextSize(1);
ekran.setCursor(20, 30);
ekran.print("VFO: ");
ekran.setTextSize(2);
ekran.printf("%.1f", mevcutFrekans);
ekran.setTextSize(1);
ekran.print(" MHz");
ekran.drawFastHLine(0, 50, 128, SSD1306_WHITE);
ekran.setCursor(45, 55);
ekran.print("TA3UIS");
ekran.display();
}
void ayarlaRadyoFrekansi(float frekans) {
unsigned int frekansB = 4 * (frekans * 1000000 + 225000) / 32768;
Wire.beginTransmission(0x60);
Wire.write(frekansB >> 8);
Wire.write(frekansB & 0XFF);
Wire.write(0xB0); Wire.write(0x10); Wire.write(0x00);
Wire.endTransmission();
}