int RE_B = 7; //(DATA Pini Olarak:) Arduino UNO'nun 7. Pinini Rotary Encoder'ın B Pinine Atadık
int RE_A = 2; //(CLK Pini Olarak:) Arduino UNO'nun 2. Pinini (0 Nolu Yani 1. İnterrupt Pinini) Rotary Encoder'ın A Pinine Atadık
int RE_Bt = 3; // Arduino UNO'nun 3. Pinini (1 Nolu Yani 2. İnterrupt Pinini) Rotary Encoder'ın Button Pinine Atadık
int PinB; //PinB RE_B Pininin Durumunu Kaydetmek İçin PinB Değişkenini Tanımladık
int Sayac1 = 0; //Rotary Encder Buttonu'nun Hareketini Saymak İçin Sayac1 Değişkenini Tanımladık
int Sayac = 0; //Rotary Encder Dönüş Hareketini Saymak İçin Sayac Değişkenini Tanımladık
int DebounceSuresi = 100;
String Yon="Bos"; //Rotary Encder Dönüş Yönünü Belirlemek İçin Yon Değişkenini Tanımladık
boolean Oldu = 0; //Kesme Meydana Gelip Gelmediği Bilgisini Bazı İşlemlerde Kullanmak Üzere Tutmak İçin "Oldu" Değişkenini Tanımnladık
void setup() {
cli();//Kurulum Tamamlanana Kadar Tüm Interrupt'ları Durdurduk
pinMode (RE_A,INPUT_PULLUP); //RE_A Pinini INPUT ve PULLUP Olarak Ayarladık
pinMode (RE_B,INPUT_PULLUP); //RE_B Pinini INPUT ve PULLUP Olarak Ayarladık
pinMode (RE_Bt,INPUT_PULLUP); //RE_Bt Pinini INPUT ve PULLUP Olarak Ayarladık
attachInterrupt(0, Encoding, FALLING);
//Arduino UNO 2. Pinine Bağlı 0 Nolu Interrupt'a Encoding Fonksiyonunu Atadık. Kesme Tetiklenince Bu Fonksiyona Dallanacak
//Pin PULLUP Olarak Ayarlandığı İçin FALLING İle Sinyalin GND'ye Çekildiğinde Kesmenin Aktif Olmasını Ayarladık
attachInterrupt(1, Bt_Pushed, FALLING);
//Arduino UNO 3. Pinine Bağlı 1 Nolu Interrupt'a Bt_Pushed Fonksiyonunu Atadık. Kesme Tetiklenince Bu Fonksiyona Dallanacak
//Pin PULLUP Olarak Ayarlandığı İçin FALLING İle Sinyalin GND'ye Çekildiğinde Kesmenin Aktif Olmasını Ayarladık
Serial.begin (9600);
//Burada Değişkenlerimizin Taşıdıkları Değerleri Herhangi Bir Kesme Meydana Gelinceye Kadar Gözleyebilmemiz İçin Kontrol Amacıyla Ekrana Yazdırıyoruz
Serial.print(Yon);
Serial.print("; Sayac: ");
Serial.println(Sayac);
Serial.print("Button: ");
Serial.println(Sayac1);
sei();//Kurulum Tamamlandığı İçin Tüm Interrupt'ları Aktive Ettik
}
void Encoding(){//0 Nolu Interrupt Arduino UNO 2. Pinindeki Sinyalin GND'ye Çekilmesiyle Tetiklendi ve Buraya Dallandı
cli(); //Bu Interrupt İçindeki İşlemleri Tamamlayana Kadar Yeni bir Interrupt Meydana Gelmemesi İçin Tüm Interrupt'ları Durdurduk
PinB=digitalRead(RE_B); //Kesme Meydana Geldiği Anda DATA Pini Durumunu Bu Komutla PinB Değişkenine Atadık
//Rotary Encoder Herbir Tık Hareketinde CLK (Yani A Pini) ve DATA (Yani B Pini) Pinlerini Sıralı Olarak Tetikler.
//Bu Pinler Tıpkı Binary Sayılar Gibi 0 (LOW) ve 1 (HIGH) Durumlar Aldığı İçin 2 Bitlik/Basamaklı BINARY Bir Sayı Gibi Okunabilir
//Soldan İlk Bit/Basamak CLK Pini ve Diğer Bit/Basamak DATA Pini Değerini Tutar
//Pinler PULLUP Olduğu İçin Kesme Öncesi İlk Durumlarının Karşılığı 11 Olacaktır. CLK Pini GND'ye Çekildiğinde Interrupt Tetiklenir
//Encoder'in SAĞ'a (Saat Yönünde) Dönüşünde:
/*------------------------------
0- CLK: 1, DATA: 1 => BINARY: 11 Burası Kesme Meydana Gelmeden Hemen Önceki Durum
1- CLK: 0, DATA: 1 => BINARY: 01 Burası Kesme Meydana Geldiği Andaki Durum
2- CLK: 0, DATA: 0 => BINARY: 00
3- CLK: 1, DATA: 0 => BINARY: 10
4- CLK: 1, DATA: 1 => BINARY: 11
--------------------------------*/
//Şeklindeki Akışla Bir Tık Tamamlanır
//Encoder'in SOL'a (Saatin Tersi Yönde) Dönüşünde:
/*------------------------------
0- CLK: 1, DATA: 1 => BINARY: 11
1- CLK: 1, DATA: 0 => BINARY: 10 Burası Kesme Meydana Gelmeden Hemen Önceki Durum
2- CLK: 0, DATA: 0 => BINARY: 00 Burası Kesme Meydana Geldiği Andaki Durum
3- CLK: 0, DATA: 1 => BINARY: 01
4- CLK: 1, DATA: 1 => BINARY: 11
--------------------------------*/
//Şeklindeki Akışla Bir Tık Tamamlanır
//Bu Tetikleme Esnasında Pinlerin Birbirbiri İle Olan Durumlarına Göre Dönüş Yönünü Belirlenir.
//Interrupt, CLK Pininin LOW'a Çekilmesiyle Tetikleneceğinden Yukarıdaki BINARY Verilerden CLK Pininin 0'a Döndüğü Anlar Kesmenin Meydana Geldiği Anlar Olacaktır.
//***** EĞER Interrupt FALLING Yerine RISING Olarak Yani CLK Pininin LOW'dan HIGH'a (0'dan 1'e) Döndüğünde Tetiklenecek Olsaydı Bu Akışlar Tersine Dönecekti.*****
//Buna Göre:
//SAĞ Yönde CLK Pininin 1'den 0'a Dönmesiyle Kesmenin Tetiklendiği 1. Durumda DATA Pininin 1
//SOL Yönde CLK Pininin 1'den 0'a Dönmesiyle Kesmenin Tetiklendiği 2. Durumda DATA Pininin 0 Değerinde Olduğu Görülecektir.
//CLK Pininin 1'den 0'a Dönüşü Kesmeyi Tetiklerken DATA Pininin 1 veya 0 Oluşu Dönüş Yönünü Göstermektedir
//Biz de Aşağıdaki IF-ELSE Yapısı İle DATA Pininin İki Durumunu Karşılaştırarak Dönüş Yönünü Tespit Edecğiz
if (PinB) {
Yon="Sag"; //PinB Kesme Anında 1 Durumunda İSE Dönüşün SAĞ Yönde Olduğunu Tespit Ediyoruz
Sayac++; //PinB Kesme Anında 1 Durumunda İSE Sayac Değişkenini Artırıyoruz
} else {
Yon="Sol"; //PinB Kesme Anında 1 Durumunda DEĞİL İSE Dönüşün SOL Yönde Olduğunu Tespit Ediyoruz
Sayac--; //PinB Kesme Anında 1 Durumunda DEĞİL İSE Sayac Değişkenini Azaltıyoruz
}
delay(DebounceSuresi); //Kesmeye Kontrolümüz Dışında Fazla Kesme Meydana Gelmemesi İçin Bir Nevi Yazılımsal Bir DEBOUNCE Uyguluyoruz
Oldu = 1; //Kesme Olduğu Bilgisini Değişkene Atadık
sei(); //İşlemler Tamamlandığı İçin Yeni Interrupt Beklemek Üzere Tüm Interrupt'ları Aktive Ettik
}
void Bt_Pushed(){//1 Nolu Interrupt Arduino UNO 3. Pinindeki Sinyalin GND'ye Çekilmesiyle Tetiklendi
cli(); //Bu Interrupt İçindeki İşlemleri Tamamlayana Kadar Yeni bir Interrupt Meydana Gelmemesi İçin Tüm Interrupt'ları Durdurduk
Sayac1+=1; //Rotary Encoder Button'u Kullanılarak İle Sayac1 Değişkenini Artırıyoruz
delay(DebounceSuresi); //Kesmeye Kontrolümüz Dışında Fazla Kesme Meydana Gelmemesi İçin Bir Nevi Yazılımsal Bir DEBOUNCE Uyguluyoruz
Oldu = 1; //Kesme Olduğu Bilgisini Değişkene Atadık
sei(); //İşlemleri Tamamlandığı İçin Yeni Interrupt Beklemek Üzere Tüm Interrupt'ları Aktive Ettik
}
void loop() {
if (Oldu) {//Kesme Oldu İse Verilerimizde Değişiklik Meydana Geleceğinden Verileri Bu Durumda Yazdırıyoruz
// Böylece Serial Ekrandan Sürekli Bir Akış Nedeniyle Anormallikleri Kaçırmış Olmayacağız
Serial.print(Yon);
Serial.print("; Sayac: ");
Serial.println(Sayac);
Serial.print("Button: ");
Serial.println(Sayac1);
Oldu = 0; //En Son Kesme Nedeniyele Verilerimizde Meydan Gelen Değişikliği Ekrana Yazdık Yeni Bir Değişikliğe Kadar Ekrana
//Veri Yazmamak İçin Kontrol Değişkenini Değiştiriyoruz
}
}