ESP32 İstasyon Günlüğü: Tasarım ve Teknik Ölçümler

TA3UIS

Doğan
Katılım
15 Kasım 2023
Mesajlar
3,087
ESP32 tabanlı içinde radyo, saat ve hava durumu olan kapsamlı bir projeye başlıyorum.

Sadece devreyi kurup geçmek yerine her aşamayı hobi masamdaki osiloskop, lojik analizör ve multimetrelerle analiz ederek ilerleyeceğim.
Sinyal kalitesi, güç tüketimi ve termal verileri merak edenler için süreci aşama aşama paylaşıyor olacağım.
 
Son düzenleme:
Aşama 1: Güç Katı Tasarımı ve Analiz (Breadboard limitasyonlarını da hesaplayarak)

ESP32 gibi hassas ve Wi-Fi akım pikleri olan bir modülü beslemek için alelade bir adaptör yerine, kendi regülatör katımı kurdum.

Kurulum: 5V girişten LM317 ile 3.3V hattı oluşturdum. Isınmayı minimize etmek için giriş voltajını 5V seviyesinde tuttum.

Test Verileri:

  • Ölçüm: Siglent SDM3065X multimetrem ile çıkışı 3.29153V olarak ölçtüm. Teorik hesaplamama (3.28V) çok yakın.
  • Gürültü Analizi: Siglent SDS1104X-E osiloskobumda AC coupling modunda yaptığım incelemede, çıkıştaki ripple (dalgalanma) değerinin sadece 6mV olduğunu gördüm. Bu, breadboard üzerindeki bir lineer regülatör için oldukça temiz bir sonuç.
  • Güvenlik: Rigol DP932A güç kaynağımı 55mA limitine kurdum, böylece olası bir hatada devre kendini anında korumaya alıyor.
Bir sonraki aşamada bu temiz hatta ESP32'yi dahil edip I2C haberleşme hattını kuracağım.

Malzemeler:

  • LM317 Regülatör
  • 240 Ohm Direnç
  • 390 Ohm Direnç
  • 100nF Kondansatör (Giriş filtresi)
  • 10uF Elektrolit Kondansatör (Çıkış filtresi)


WhatsApp Image 2026-02-20 at 23.59.36.jpeg


WhatsApp Image 2026-02-21 at 00.00.06.jpeg


WhatsApp Image 2026-02-20 at 23.59.46.jpeg


WhatsApp Image 2026-02-21 at 00.00.18.jpeg
 
Radyoyu SI4732 gibi bir entegre ile yapacaksınız sanırım. Bulabilirseniz hangi mağazadan temin ettiğinizi de yazarsanız iyi olur.

Hava durumunu internet üzerinden mi alacaksınız? Yoksa kendiniz sıcaklık, basınç ve nem bilgilerinden mi yola çıkarak tespit edeceksiniz?
 
Radyoda TEA5767 FM modülünü kullanıyorum, SI4732 kadar geniş bantlı (SSB/SW) olmasa da bu proje özelinde stabil bir FM performansı almayı hedefliyorum.

Hava durumu için ise hibrit bir yöntem izleyeceğim: ESP32 ile internet (OpenWeatherMap vb.) üzerinden bölgesel tahminleri alırken, yerel veriler için devreye eklediğim DHT22 sensörü ile odadaki anlık ısı ve nemi de dashboard üzerinden takip edeceğim kısmetse.
 
Radyoda TEA5767 FM modülünü kullanıyorum, SI4732 kadar geniş bantlı (SSB/SW) olmasa da bu proje özelinde stabil bir FM performansı almayı hedefliyorum.

Hava durumu için ise hibrit bir yöntem izleyeceğim: ESP32 ile internet (OpenWeatherMap vb.) üzerinden bölgesel tahminleri alırken, yerel veriler için devreye eklediğim DHT22 sensörü ile odadaki anlık ısı ve nemi de dashboard üzerinden takip edeceğim kısmetse.
Kullanıcı adınızda telsiz çağrı işareti gördüğüm için, SI4732 gibi bir yapı kullanırsınız diye düşünmüştüm.

DHT22 yerine BME280 de kullanabilirsiniz.
 
Aşama 2: I2C Haberleşme ve Sinyal Analizi


Projemin beyin nakli ve haberleşme altyapısını içeren 2. aşamasını az önce başarıyla tamamladım. Bu aşamada ESP32-WROOM modülünü merkeze alarak, 1.3" OLED ekran ve DS3231 Hassas RTC modülünü I2C veri yolu üzerinden konuşturmaya başladım.

İşte bu süreçteki teknik notlarım ve ölçüm sonuçları:

Besleme ve Kararlılık:
İlk denemelerde OLED ekranın beslemesinde ufak bir kararsızlık sezdim. VCC pinini doğrudan ESP32’nin 3.3V hattına taşıyarak regülasyonu stabilize ettim. Şu an sistem Rigol DP932A üzerinden izlediğim kadarıyla oldukça düşük ve kararlı bir akım çekiyor.

Fiziksel Katman Analizi (Osiloskop):
Haberleşmenin elektriksel kalitesini doğrulamak için Siglent SDS1104X-E ile hattı inceledim. Görüntüde de göreceğiniz üzere;

  • I2C hattındaki kare dalgaların genliği (Pk-Pk) tam 3.20V seviyesinde.
  • Yükselme süreleri (Rise-time) oldukça keskin, bu da hattaki kapasitif etkinin düşük olduğunu ve pull-up dirençlerinin (4.7k) görevini mükemmel yaptığını gösteriyor.
Mantıksal Katman Analizi (Lojik Analizör):
Sinyaldeki veriyi okumak için Saleae 24MHz 8CH Lojik Analizör’ü devreye aldım. Yapılan tarama sonucunda;

  • 0x3C: OLED Ekran
  • 0x68: DS3231 RTC
  • 0x57: RTC modülü üzerindeki EEPROM
    adreslerinden kusursuz ACK (onay) paketleri aldım. I2C veri yolunda hiçbir çakışma veya paket kaybı yok.

Saat tıkır tıkır ilerliyor, OLED ekran verileri saniyelik tazeliyor. Teorik hesaplamaların pratik ölçümlerle (3.20V Pk-Pk) bu kadar örtüşmesi, projenin sağlam bir temel üzerine oturduğunun kanıtı oldu.



WhatsApp Image 2026-02-21 at 05.05.45.jpeg
WhatsApp Image 2026-02-21 at 12.38.19.jpeg
WhatsApp Image 2026-02-21 at 12.38.45.jpeg
WhatsApp Image 2026-02-21 at 12.39.48.jpeg
Logic.png
Logic_2.png
WhatsApp Image 2026-02-21 at 12.43.44.jpeg
WhatsApp Image 2026-02-21 at 11.54.30.jpeg
 
Aşama 3: Analoga Giriş ve FM Radyo Sinyal Analizi

Projede dijitalden analoga geçtiğim, Radyo Frekansına adım attığım 3. aşamayı tamamladım. Bu bölümde sisteme TEA5767 FM Radyo modülünü dahil ettim. Bir radyo amatörü (TA3UIS) olarak, sadece ses duymakla yetinmeyip sinyalini test ettim.

İşte bu aşamanın teknik detayları ve ölçüm sonuçları:


I2C Hattı ve Donanım Entegrasyonu
TEA5767 modülünü, mevcut I2C veri yoluna (G 21-22) üçüncü bir cihaz olarak ekledim. Saat (DS3231) ve OLED ekran ile aynı bus üzerinde, 0x60 adresiyle sorunsuz bir şekilde haberleşiyor.


Fiziksel Katman ve Sinyal Analizi (Osiloskop Ölçümleri)
Haberleşmenin ötesinde, asıl farkı Siglent SDS1104X-E osiloskobum ile yaptığım analizlerde gördüm. Ses çıkışını (Audio Out) iki farklı durumda inceledim:

Hışırtı ve Gürültü Tabanı (Kanal Ayarlı Değil): Modül boş bir frekanstayken (hışırtı anı), 292mV Pk-Pk seviyesinde bir gürültü tabanı (Noise Floor) ölçtüm. Bu, devredeki dijital bileşenlerin analog hatta sızdırdığı breadboard ve jumper kabloları, termal ve anahtarlama gürültüsünü temsil ediyor.

Sinyal Kararlılığı (Kanal Kilitlendiğinde): Güçlü bir istasyona (100.0 MHz) kilitlendiğimde, demodüle edilmiş ses sinyali 508mV Pk-Pk genliğine ulaştı. Sinyalin gürültü tabanının yaklaşık iki katı üzerine oturması, temiz ve dinlenebilir bir ses çıkışı aldığımızın teknik kanıtı oldu(Breadboard limitasyonuyla).

Güç Yönetimi
Rigol DP932A güç kaynağım üzerinden analog katın voltajını filtreleyerek besledim. Wi-Fi sinyallerinin radyo çıkışında oluşturabileceği parazitleri (jitter/spike) minimize etmek için 100nF tek bypass kapasitörü ile hattı biraz daha stabilize ettim.

Şu an OLED ekranımızda hem hassas zamanı (RTC) hem de o an dinlediğimiz FM frekansını görebiliyoruz. Osiloskop görüntülerindeki bu net ayrım (292mV vs 508mV), projenin analog kısmının da en az dijital kısmı kadar sağlam kurulduğunu gösteriyor.


Bir sonraki aşamada IR Kumanda ve kullanıcı menü sistemi ekleyerek istasyonu tamamen kontrol edilebilir hale getireceğim.


ESP32 program kodları:

C++:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#include <DFRobotDFPlayerMini.h>

#define EKRAN_GENISLIK 128
#define EKRAN_YUKSEKLIK 64

Adafruit_SSD1306 ekran(EKRAN_GENISLIK, EKRAN_YUKSEKLIK, &Wire, -1);
RTC_DS3231 saatModulu;
HardwareSerial seriHaberlesme(2);
DFRobotDFPlayerMini mp3Calici;

float radyoFrekansi = 100.0;

void radyoFrekansiniAyarla(float hedefFrekans) {
  unsigned int frekansB = 4 * (hedefFrekans * 1000000 + 225000) / 32768;
  byte frekansYuksek = frekansB >> 8;
  byte frekansDusuk = frekansB & 0XFF;

  Wire.beginTransmission(0x60);
  Wire.write(frekansYuksek);
  Wire.write(frekansDusuk);
  Wire.write(0xB0);
  Wire.write(0x10);
  Wire.write(0x00);
  Wire.endTransmission();
  Serial.printf("Radyo: %.1f MHz ayarlandi.\n", hedefFrekans);
}

void setup() {
  Serial.begin(115200);
  seriHaberlesme.begin(9600, SERIAL_8N1, 16, 17);
  Wire.begin(21, 22);

  ekran.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  if (!saatModulu.begin()) {
    Serial.println("RTC Hatası!");
    while (1);
  }

  saatModulu.adjust(DateTime(2026, 2, 21, 16, 30, 0));

  radyoFrekansiniAyarla(radyoFrekansi);

  ekran.clearDisplay();
  ekran.display();
}

void loop() {
  DateTime simdi = saatModulu.now();

  char zamanMetni[9];
  sprintf(zamanMetni, "%02d:%02d:%02d", simdi.hour(), simdi.minute(), simdi.second());

  ekran.clearDisplay();

  ekran.setTextSize(2);
  ekran.setTextColor(SSD1306_WHITE);
  ekran.setCursor(16, 5);
  ekran.print(zamanMetni);

  ekran.setTextSize(1);
  ekran.setCursor(25, 30);
  ekran.print("FM: ");
  ekran.print(radyoFrekansi, 1);
  ekran.print(" MHz");

  ekran.setTextSize(2);
  ekran.setCursor(28, 45);
  ekran.print("TA3UIS");

  ekran.display();
 
  delay(1000);
}



WhatsApp Image 2026-02-21 at 14.18.36.jpeg
WhatsApp Image 2026-02-21 at 14.06.59.jpeg
WhatsApp Image 2026-02-21 at 16.30.32.jpeg
WhatsApp Image 2026-02-21 at 16.30.32 (1).jpeg
 
Aşama 4: Kızılötesi (IR) Kontrol Entegrasyonu ve Sinyal Analizi

İstasyon projemde 4. aşamayı tamamladım. Bu bölümde sisteme 38 kHz bir IR alıcı modül ekleyerek, cihazın tüm fonksiyonlarını (frekans değiştirme, ince ayar vb.) uzaktan kumanda edilebilir hale getirdim.

  • Sinyal Analizi: Kumandadan gelen kızılötesi paketleri Siglent SDS1104X-E osiloskobumda "Single Trigger" modunda yakaladım. Paylaştığım ekran görüntüsünde, protokolün karakteristik başlangıç darbesini ve ardından gelen 32-bitlik veriyi net bir şekilde görüyorum. Sinyalin 3.20V Pk-Pk genliği, ESP32’nin lojik seviyeleriyle tam uyumlu ve oldukça kararlı.
  • Protokol Çözümleme: Saleae Lojik Analizör ve seri port üzerinden yaptığım eş zamanlı takiplerle; yukarı/aşağı (1 MHz adım) ve sağ/sol (0.1 MHz adım) tuşlarını sisteme başarıyla tanıttım.
  • Entegrasyon: I2C veri yolu (Saat, Ekran, Radyo) ile IR kesme (interrupt) yönetimi arasındaki zamanlamayı optimize ederek, tuş basımıyla radyo frekansının değişimi arasındaki gecikmeyi minimuma indirdim.
Şu an cihaz; masamda bilgisayardan bağımsız, tamamen kumanda ile yönetilebilen bir radyo-saat konsoluna dönüştü. Teknik ölçümlerin, teorik kodlamayla bu denli örtüşmesi projenin en tatmin edici kısmı oldu.

WhatsApp Image 2026-02-21 at 18.00.20.jpeg



Logic.png


WhatsApp Image 2026-02-21 at 18.29.35.jpeg
WhatsApp Image 2026-02-21 at 18.29.34 (1).jpeg
WhatsApp Image 2026-02-21 at 18.29.34.jpeg
WhatsApp Image 2026-02-21 at 18.30.59.jpeg




Kumandanın yön tuşları ve tamam tuşunun HEX kodunu bulmak için kullandığım program kodları:
Tuş HEX Kodu: AD52FF00 yukarı
Tuş HEX Kodu: E718FF00 aşağı
Tuş HEX Kodu: F708FF00 sağ
Tuş HEX Kodu: A55AFF00 sol
Tuş HEX Kodu: E31CFF00 enter

C++:
#include <IRremote.hpp>

const int IR_ALICI_PIN = 13;

void setup() {
  Serial.begin(115200);
  IrReceiver.begin(IR_ALICI_PIN, ENABLE_LED_FEEDBACK);
  Serial.println("IR Alıcı Hazır..");
}

void loop() {
  if (IrReceiver.decode()) {
    Serial.print("Tuş HEX Kodu: ");
    Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
    IrReceiver.resume();
  }
}


genel kodlar

C++:
#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();
}
 
FİNAL AŞAMASI : Oda için nem, ısı takibi, bölgem için hava durumu çekimi.

DHT22 Nem ve Isı sensörünü istasyona taktım.
OPENWEATHER sitesinden ücretsiz api key aldım

  • Api key ile internetten bölgem için güncel hava durumunu çektim, ve ekrana yazdırdım.
  • DHT22 sensör ile podamdaki nem ve ısıyı da dönüşümlü olarak takip ediyorum.
  • Kumanda ile saat ayarı ve FM istasyon ayarı yapabiliyorum.
  • Rigol DL932A ile istasyonun tüm fonksiyonları çalışırken ve internete bağlanıp hava durumu çektiği an da dahil olmak üzere akımın grafik analizini çıkarttım.
    Maksimum 0.175mA akım çekildi.
İstasyon projem böylelikle bitmiş oldu. :)

Analyzer0.jpeg

WhatsApp Image 2026-02-22 at 00.43.08.jpeg
WhatsApp Image 2026-02-22 at 00.43.07.jpeg
WhatsApp Image 2026-02-22 at 00.06.37.jpeg
WhatsApp Image 2026-02-22 at 00.05.39.jpeg
WhatsApp Image 2026-02-22 at 00.04.34.jpeg
WhatsApp Image 2026-02-22 at 00.43.11.jpeg
WhatsApp Image 2026-02-22 at 00.43.09.jpeg






ESP32 yi programladığım kodlar:

C++:
#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();
}
 
Son düzenleme:

Forum istatistikleri

Konular
8,928
Mesajlar
145,154
Üyeler
3,596
Son üye
ata

Son kaynaklar

Back
Top