// Gerekli pin tanımlamaları
const int ledPin1 = 0; // PB0
const int ledPin2 = 1; // PB1
const int ledPin3 = 2; // PB2
const int ledPin4 = 4; // PB4
const int touchPin = 3; // PB3 (Butonun bağlı olduğu pin)
// LED pinlerini bir dizi içinde saklayalım
int ledPins[] = {ledPin1, ledPin2, ledPin3, ledPin4};
// Animasyon durumu
bool animasyonAktif = false;
// --- Buton okuma (debounce) için yeni değişkenler ---
// Kapasitif algılama değişkenleri yerine bunları kullanıyoruz
bool sonButonDurumu = LOW; // Butonun bir önceki döngüdeki durumu (LOW'dan başlıyoruz)
unsigned long sonDegisimZamani = 0; // Butona en son basılma zamanı (debounce için)
// --------------------------------------------------
// 9/8'lik ritim için vuruş süresi (milisaniye cinsinden)
int vurusSuresi = 120;
void setup() {
// Tüm LED pinlerini çıkış olarak ayarla
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
}
// Dokunmatik/Buton pinini GİRİŞ olarak ayarla
pinMode(touchPin, INPUT);
}
void loop() {
// Buton durumunu kontrol et
dokunmaKontrol(); // Artık bu fonksiyon bir butonu kontrol ediyor
// Eğer animasyon aktif ise, ritmi oynat
if (animasyonAktif) {
dokuzSekizRitim();
} else {
// Animasyon aktif değilse tüm LED'leri söndür
// (Sürekli sönük kalması için bu fonksiyonu loop içinde tutuyoruz)
tumLedleriSondur();
}
}
// --- DOKUNMA KONTROL FONKSİYONU (BUTON İÇİN GÜNCELLENDİ) ---
void dokunmaKontrol() {
// 1. Butonun şu anki durumunu oku
bool guncelButonDurumu = digitalRead(touchPin); // Basılıysa HIGH, değilse LOW
// 2. Parazit engelleme (Debounce)
// Sadece son durum değişikliğinden 50ms geçtiyse işlem yap
if (millis() - sonDegisimZamani > 50) {
// 3. Kenar Tetikleme (Edge Detection)
// Butona "yeni basıldığı anı" yakala (yani önce LOW idi, şimdi HIGH oldu)
if (guncelButonDurumu == HIGH && sonButonDurumu == LOW) {
// 4. Durumu Tersine Çevir (Toggle)
// Animasyon açıksa kapat, kapalıysa aç
animasyonAktif = !animasyonAktif;
// 5. Debounce için zamanı güncelle
sonDegisimZamani = millis();
}
}
// 6. Son durumu bir sonraki döngü için kaydet
sonButonDurumu = guncelButonDurumu;
}
// -------------------------------------------------------------
void dokuzSekizRitim() {
// Bu, 9/8'lik bir aksak ritim örneğidir.
// Vuruş 1-2
digitalWrite(ledPin1, HIGH);
delay(vurusSuresi * 2);
digitalWrite(ledPin1, LOW);
// Vuruş 3-4
digitalWrite(ledPin2, HIGH);
delay(vurusSuresi * 2);
digitalWrite(ledPin2, LOW);
// Vuruş 5-6
digitalWrite(ledPin3, HIGH);
delay(vurusSuresi * 2);
digitalWrite(ledPin3, LOW);
// Vuruş 7-8-9
digitalWrite(ledPin4, HIGH);
delay(vurusSuresi * 3);
digitalWrite(ledPin4, LOW);
// Ritimler arası küçük bir boşluk
delay(vurusSuresi * 2);
}
void tumLedleriSondur() {
for (int i = 0; i < 4; i++) {
digitalWrite(ledPins[i], LOW);
}
}