PulseQrpArge

FM VERİCİLER VE RF TEKNİĞİ => FM-AM ALICILAR SSB ALICILAR => Konuyu başlatan: Yörük - Nis 16, 2026, 11:36 ÖÖ

Başlık: 20mtre ve 40mtre vfo
Gönderen: Yörük - Nis 16, 2026, 11:36 ÖÖ
Merhaba;
#include <Wire.h>
#include <si5351.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
// Pin Tanımlamaları
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Si5351 si5351;
// --- PARAMETRELER ---
unsigned long freq = 7000000;     
unsigned long stepSize = 1000;    
const unsigned long minFreq = 7000000;  
const unsigned long maxFreq = 14000000; 
String mode = "LSB";
int sMeterVal = 0;
unsigned long lastEepromWrite = 0;
bool needsEepromUpdate = false;
// Buton Tanımları (LCD Shield Standart)
#define BTN_RIGHT  0
#define BTN_UP     1
#define BTN_DOWN   2
#define BTN_LEFT   3
#define BTN_SELECT 4
#define BTN_NONE   5
int read_LCD_buttons() {
  int adc_key_in = analogRead(0);
  if (adc_key_in < 50)   return BTN_RIGHT; 
  if (adc_key_in < 250)  return BTN_UP;
  if (adc_key_in < 450)  return BTN_DOWN;
  if (adc_key_in < 650)  return BTN_LEFT;
  if (adc_key_in < 850)  return BTN_SELECT; 
  return BTN_NONE;
}
void setup() {
  lcd.begin(16, 2);
 
  // --- AÇILIŞ EKRANI (WELCOME SCREEN) ---
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("PULSEQRPARGE"); // Marka İsmi
  lcd.setCursor(1, 1);
  lcd.print("pulseqrparge.com");
 
  // Görsel yükleme efekti
  delay(1000);
  for(int i = 0; i < 16; i++) {
    lcd.setCursor(i, 1);
    // İsteğe bağlı: pulseqrparge.com yazısının üzerinden blok geçirme
    delay(100);
  }
  delay(500);
  lcd.clear();
  // --------------------------------------
  // EEPROM'dan son frekansı oku
  EEPROM.get(0, freq);
  if (freq < minFreq || freq > maxFreq) freq = 7100000;
  // Si5351 Başlatma
  if(!si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0)) {
    lcd.print("SI5351 HATASI!");
    while(1);
  }
  si5351.set_freq(freq * 100ULL, SI5351_CLK0);
  updateDisplay();
}
void loop() {
  int button = read_LCD_buttons();
  unsigned long oldFreq = freq;
  unsigned long oldStep = stepSize;
  String oldMode = mode;
  if (button != BTN_NONE) {
    switch (button) {
      case BTN_RIGHT: freq += stepSize; break;
      case BTN_LEFT:  if (freq >= stepSize + minFreq) freq -= stepSize; break;
      case BTN_UP:    stepSize = (stepSize >= 100000) ? 10 : stepSize * 10; delay(250); break;
      case BTN_DOWN:  stepSize = (stepSize <= 10) ? 100000 : stepSize / 10; delay(250); break;
      case BTN_SELECT:
        mode = (mode == "LSB") ? "USB" : "LSB";
        delay(300);
        break;
    }
   
    if (freq < minFreq) freq = minFreq;
    if (freq > maxFreq) freq = maxFreq;
   
    if (freq != oldFreq) {
      si5351.set_freq(freq * 100ULL, SI5351_CLK0);
      needsEepromUpdate = true;
      lastEepromWrite = millis();
    }
    updateDisplay();
    delay(50);
  }
  // S-Metre Okuma ve Güncelleme
  static unsigned long lastSMeterUpdate = 0;
  if (millis() - lastSMeterUpdate > 150) {
    sMeterVal = analogRead(1);
    drawSMeter();
    lastSMeterUpdate = millis();
  }
  // EEPROM Kaydı (Değişimden 5 sn sonra)
  if (needsEepromUpdate && (millis() - lastEepromWrite > 5000)) {
    EEPROM.put(0, freq);
    needsEepromUpdate = false;
  }
}
void updateDisplay() {
  // Alt Satır: Frekans
  lcd.setCursor(0, 1);
  float freqMHz = freq / 1000000.0;
  if (freqMHz < 10.0) lcd.print(" ");
  lcd.print(freqMHz, 4);
  lcd.print(" MHz");
  // Step Göstergesi
  lcd.setCursor(13, 1);
  if (stepSize >= 1000) { lcd.print(stepSize/1000); lcd.print("k"); }
  else { lcd.print(stepSize); lcd.print("H"); }
 
  // Mod Bilgisi
  lcd.setCursor(13, 0);
  lcd.print(mode);
}
void drawSMeter() {
  lcd.setCursor(0, 0);
  lcd.print("S:");
  int bars = map(sMeterVal, 0, 800, 0, 9);
  for (int i = 0; i < 9; i++) {
    if (i < bars) lcd.print((char)255);
    else lcd.print(" ");
  }
}

Güzel bir çalışma oldu detayları müsait olunca yükleyeceğim