Nis 17, 2026, 04:09 ÖÖ

Haberler:

Dear site friends, our aim is to inform and develop the field of electronics. All messages containing links and advertisements, and members who share them, will be banned. With respect and love, PulseQRP R&D management.


20mtre ve 40mtre vfo

Başlatan Yörük, Dün, 11:36 ÖÖ

« önceki - sonraki »

0 Üye ve 4 Ziyaretçi konuyu incelemekte.

Yörük

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