#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define BTN_FREQ 4
#define BTN_SF 16
#define BTN_CR 17
#define BTN_SAVE 18
int freqIndex = 0;
const unsigned long freq[] = {
433112500, 433362500, 433612500,
433862500, 434112500, 434362500, 434612500
};
int spreadingFactor = 6;
int codingRateIndex = 0;
const String codingRate[] = {"4", "4/5", "4/6", "4/7", "4/8"};
bool settingsSaved = false;
void displayInitialSettings() {
lcd.setCursor(0, 0);
lcd.print("Freq:");
lcd.setCursor(6, 0);
lcd.print(freqIndex + 1);
lcd.setCursor(8, 0);
lcd.print(freq[freqIndex] / 1000000.0, 4);
lcd.print(" MHz");
lcd.setCursor(0, 1);
lcd.print("SF: ");
lcd.setCursor(4, 1);
lcd.print(spreadingFactor);
lcd.setCursor(7, 1);
lcd.print(" CR: ");
lcd.setCursor(12, 1);
lcd.print(codingRate[codingRateIndex]);
}
void updateFrequency() {
lcd.setCursor(6, 0);
lcd.print(freqIndex + 1);
lcd.setCursor(8, 0);
lcd.print(freq[freqIndex] / 1000000.0, 4);
lcd.print(" MHz");
}
void updateSpreadingFactor() {
lcd.setCursor(4, 1);
lcd.print(spreadingFactor);
lcd.print(" ");
}
void updateCodingRate() {
lcd.setCursor(12, 1);
lcd.print(codingRate[codingRateIndex]);
}
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
pinMode(BTN_FREQ, INPUT_PULLUP);
pinMode(BTN_SF, INPUT_PULLUP);
pinMode(BTN_CR, INPUT_PULLUP);
pinMode(BTN_SAVE, INPUT_PULLUP);
displayInitialSettings();
while (!settingsSaved) {
if (digitalRead(BTN_FREQ) == LOW) {
freqIndex = (freqIndex + 1) % 7;
updateFrequency();
delay(200);
}
if (digitalRead(BTN_SF) == LOW) {
spreadingFactor++;
if (spreadingFactor > 12) spreadingFactor = 6;
updateSpreadingFactor();
delay(200);
}
if (digitalRead(BTN_CR) == LOW) {
codingRateIndex = (codingRateIndex + 1) % 5;
updateCodingRate();
delay(200);
}
if (digitalRead(BTN_SAVE) == LOW) {
lcd.clear();
delay(100);
settingsSaved = true;
lcd.setCursor(0, 0);
lcd.print("Setting Berhasil");
delay(1000);
lcd.clear();
// Tampilkan pengaturan di Serial Monitor
Serial.println("Pengaturan Disimpan:");
Serial.print("Frekuensi: ");
Serial.print(freq[freqIndex]);
Serial.println(" Hz");
Serial.print("Spreading Factor: ");
Serial.println(spreadingFactor);
Serial.print("Coding Rate: ");
Serial.println(codingRate[codingRateIndex]);
}
}
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("Channel: ");
lcd.setCursor(9, 0);
lcd.print(freqIndex + 1);
lcd.setCursor(0, 1);
lcd.print("Freq: ");
lcd.setCursor(6, 1);
lcd.print(freq[freqIndex] / 1000000.0, 4);
lcd.print(" MHz");
delay(2000);
}