#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#include <IRremote.hpp>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <DHT.h>
const char* wifiAdi = "WİFİ ADI";
const char* wifiSifre = "WİFİ ŞİFRESİ.";
String apiAnahtari = "OPENWEATHER API KEYİ";
String sehir = "Izmir"; // Istanbul VS..
#define DHT_PIN 4
#define DHT_TIPI DHT22
DHT dht(DHT_PIN, DHT_TIPI);
#define EKRAN_GENISLIK 128
#define EKRAN_YUKSEKLIK 64
const int IR_PIN = 13;
Adafruit_SSD1306 ekran(EKRAN_GENISLIK, EKRAN_YUKSEKLIK, &Wire, -1);
RTC_DS3231 rtc;
float frekans = 100.0;
String havaSicakligi = "--", havaDurumu = "";
float odaSicakligi = 0, odaNem = 0;
unsigned long sonHavaGuncelleme = 0, sonDHTGuncelleme = 0, sonEkranDegisim = 0;
int ekranModu = 0;
int menuModu = 0;
int ayarSaat = 0, ayarDakika = 0;
String turkceKarakterDuzenle(String metin) {
metin.replace("ç", "c"); metin.replace("ğ", "g"); metin.replace("ı", "i");
metin.replace("ö", "o"); metin.replace("ş", "s"); metin.replace("ü", "u");
return metin;
}
void ayarla() {
Serial.begin(115200);
Wire.begin(21, 22);
dht.begin();
ekran.begin(SSD1306_SWITCHCAPVCC, 0x3C);
rtc.begin();
ekran.clearDisplay();
ekran.setTextSize(1);
ekran.setTextColor(SSD1306_WHITE);
ekran.setCursor(20, 10);
ekran.println("TA3UIS ISTASYONU");
ekran.setCursor(0, 30);
ekran.println("WiFi Baglaniyor...");
ekran.display();
WiFi.begin(wifiAdi, wifiSifre);
int tekrar = 0;
while (WiFi.status() != WL_CONNECTED && tekrar < 30) {
delay(500);
ekran.print(".");
ekran.display();
tekrar++;
}
if (WiFi.status() == WL_CONNECTED) {
ekran.println("\nBaglandi!");
ekran.display();
delay(1000);
}
rtc.adjust(DateTime(2026, 2, 21, 23, 30, 0));
IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);
radyoFrekansAyarla(frekans);
havaAl();
}
void dongu() {
if (IrReceiver.decode()) {
uint32_t komut = IrReceiver.decodedIRData.decodedRawData;
if (komut != 0) {
if (komut == 0xE31CFF00) {
menuModu++;
if (menuModu == 1) { DateTime simdi = rtc.now(); ayarSaat = simdi.hour(); ayarDakika = simdi.minute(); }
if (menuModu > 2) {
DateTime simdi = rtc.now();
rtc.adjust(DateTime(simdi.year(), simdi.month(), simdi.day(), ayarSaat, ayarDakika, 0));
menuModu = 0;
}
}
if (menuModu == 0) {
if (komut == 0xAD52FF00) frekans += 1.0;
else if (komut == 0xE718FF00) frekans -= 1.0;
else if (komut == 0xF708FF00) frekans += 0.1;
else if (komut == 0xA55AFF00) frekans -= 0.1;
if (frekans > 108.0) frekans = 87.5;
if (frekans < 87.5) frekans = 108.0;
radyoFrekansAyarla(frekans);
}
else if (menuModu == 1) {
if (komut == 0xAD52FF00) ayarSaat = (ayarSaat + 1) % 24;
else if (komut == 0xE718FF00) ayarSaat = (ayarSaat + 23) % 24;
}
else if (menuModu == 2) {
if (komut == 0xAD52FF00) ayarDakika = (ayarDakika + 1) % 60;
else if (komut == 0xE718FF00) ayarDakika = (ayarDakika + 59) % 60;
}
}
IrReceiver.resume();
}
if (millis() - sonDHTGuncelleme > 2000) {
odaSicakligi = dht.readTemperature();
odaNem = dht.readHumidity();
sonDHTGuncelleme = millis();
}
if (millis() - sonHavaGuncelleme > 1800000) {
havaAl();
sonHavaGuncelleme = millis();
}
if (millis() - sonEkranDegisim > 5000) {
ekranModu = (ekranModu + 1) % 3;
sonEkranDegisim = millis();
}
ekranGuncelle();
}
void havaAl() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "http://api.openweathermap.org/data/2.5/weather?q=" + sehir + "&appid=" + apiAnahtari + "&units=metric&lang=tr";
http.begin(url);
if (http.GET() == 200) {
DynamicJsonDocument doc(2048);
deserializeJson(doc, http.getString());
havaSicakligi = String((float)doc["main"]["temp"], 1);
const char* rawDesc = doc["weather"][0]["description"];
havaDurumu = turkceKarakterDuzenle(String(rawDesc));
havaDurumu.toUpperCase();
}
http.end();
}
}
void ekranGuncelle() {
DateTime simdi = rtc.now();
ekran.clearDisplay();
ekran.setTextColor(SSD1306_WHITE);
if (menuModu == 0) {
ekran.setTextSize(2);
ekran.setCursor(15, 0);
ekran.printf("%02d:%02d:%02d", simdi.hour(), simdi.minute(), simdi.second());
} else {
ekran.setTextSize(1);
ekran.setCursor(30, 0);
ekran.print(menuModu == 1 ? "[SAAT AYARI]" : "[DAKIKA AYARI]");
ekran.setTextSize(2);
ekran.setCursor(35, 10);
ekran.printf("%02d:%02d", ayarSaat, ayarDakika);
if (millis() % 1000 < 500) ekran.drawFastHLine(menuModu == 1 ? 35 : 75, 27, 22, SSD1306_WHITE);
}
ekran.drawFastHLine(0, 28, 128, SSD1306_WHITE);
ekran.setTextSize(1);
ekran.setCursor(10, 35);
ekran.print("VFO: ");
ekran.setTextSize(2);
ekran.printf("%.1f", frekans);
ekran.setTextSize(1);
ekran.print(" MHz");
ekran.drawFastHLine(0, 52, 128, SSD1306_WHITE);
ekran.setCursor(0, 56);
if (ekranModu == 0) { ekran.setCursor(45, 56); ekran.print("TA3UIS"); }
else if (ekranModu == 1) { ekran.printf("ODA: %.1fC %%%0.f Nem", odaSicakligi, odaNem); }
else if (ekranModu == 2) { ekran.print(sehir + ": " + havaSicakligi + "C " + havaDurumu.substring(0, 10)); }
ekran.display();
}
void radyoFrekansAyarla(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();
}