#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD adresi ve boyutu (16 sütun, 2 satır)
// Encoder pinleri
int encoderPinA = 2;
int encoderPinB = 3;
int buttonPin = 4;
// Menü seçenekleri
String menuSecenekleri[] = {"Reverb On", "Reverb Off", "Filter 1", "Filter 2", "Filter 3", "Delay", "Signal", "Octave"};
int menuSecimi = 0;
int menuSecenekSayisi = 8;
// Değişkenler
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
long lastencoderValue = 0;
unsigned long lastDebounceTime = 0; // Encoder debouncing süresi
unsigned long debounceDelay = 50; // Debouncing süre aralığı
void setup() {
lcd.init(); // LCD ekranı başlat
lcd.backlight(); // Arka ışığı aç
lcd.setCursor(0, 0); // İmleci başlangıç konumuna getir
lcd.print(" Arduino Menusu "); // Başlık
lcd.setCursor(0, 1); // İkinci satıra geç
lcd.print("> " + menuSecenekleri[menuSecimi] + " "); // Başlangıçta ilk menü öğesi seçili olacak
// Encoder pinlerini INPUT_PULLUP olarak ayarla
pinMode(encoderPinA, INPUT_PULLUP);
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(buttonPin, INPUT_PULLUP);
// Encoder pinlerine kesme (interrupt) atama
attachInterrupt(digitalPinToInterrupt(encoderPinA), updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoderPinB), updateEncoder, CHANGE);
}
void loop() {
// Menüyü güncelle
gosterMenu();
// Buton durumunu kontrol et
if (digitalRead(buttonPin) == LOW) {
secimiUygula(menuSecimi);
delay(200); // Buton debounce
}
}
void gosterMenu() {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("> " + menuSecenekleri[menuSecimi] + " ");
}
void secimiUygula(int secim) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(menuSecenekleri[secim] + " seçildi!");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Arduino Menusu ");
lcd.setCursor(0, 1);
lcd.print(">");
}
void updateEncoder() {
// Debouncing süresini kontrol et
if (millis() - lastDebounceTime > debounceDelay) {
int MSB = digitalRead(encoderPinA); // En önemli bit
int LSB = digitalRead(encoderPinB); // En az önemli bit
int encoded = (MSB << 1) | LSB; // Bitlerin birleştirilmesi (kod dönüşümü)
int sum = (lastEncoded << 2) | encoded; // Önceki ve yeni değerlerin birleştirilmesi
if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) {
encoderValue++;
}
if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) {
encoderValue--;
}
lastEncoded = encoded; // Önceki değerin güncellenmesi
// Menü seçimini güncelle
menuSecimi = (menuSecimi + 1) % menuSecenekSayisi; // Menü seçimini döngüsel olarak güncelle
lastDebounceTime = millis(); // Debouncing süresini güncelle
}
}