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