Ders 21 – Konuşan Pano

Merhaba arkadaşlar bu dersimiz bir sergide veya herhangi bir yerde asılı duran bir resim , pano nun konuşarak kendisi hakkında bilgi vermesidir bir önceki uygulamamızda sd kart kullanımı hakkında yeterince bilgi sahibiyiz bu uygulamamızda mesafe sensörümüzü kullanıp belirlediğimiz bir mesafeye gelindiğinde sd kart içerisindeki bilgi yüklü kaydımızın başlamasını sağlıyoruz

#include <SD.h>
#include <TMRpcm.h>
#include <SPI.h>

// --- PIN TANIMLARI ---
#define SD_CS_PIN   4
#define TRIG_PIN    7
#define ECHO_PIN    8
#define SPEAKER_PIN 9

// --- AYARLAR ---
#define MESAFE_ESIGI 50   // cm
#define BEKLEME_MS   10000 // WAV süresinden uzun tut (ms)
#define OLCUM_SAYISI 3     // 5'ten 3'e düşürüldü → daha az SPI yükü

TMRpcm ses;
unsigned long sonTetiklenme = 0;
bool sesCaliyor = false;

// --- MESAFE ÖLÇÜM ---
long mesafeOlc() {
  long olcumler[OLCUM_SAYISI];
  int gecerli = 0;

  for (int i = 0; i < OLCUM_SAYISI; i++) {
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);

    long sure = pulseIn(ECHO_PIN, HIGH, 25000);
    long cm = sure * 0.034 / 2;

    if (sure > 0 && cm > 2 && cm < 400) {
      olcumler[gecerli++] = cm;
    }
    delay(30);
  }

  if (gecerli == 0) return -1;

  long toplam = 0;
  for (int i = 0; i < gecerli; i++) toplam += olcumler[i];
  return toplam / gecerli;
}

// --- SETUP ---
void setup() {
  Serial.begin(9600);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  ses.speakerPin = SPEAKER_PIN;

  if (!SD.begin(SD_CS_PIN)) {
    Serial.println("HATA: SD kart baslatılamadı!");
    while (true);
  }

  ses.setVolume(5);
  Serial.println("Sistem hazır.");
}

// --- ANA DÖNGÜ ---
void loop() {

  // Ses çalıyorsa ölçüm YAPMA — sadece bitişini izle
  if (sesCaliyor) {
    if (!ses.isPlaying()) {
      sesCaliyor = false;
      Serial.println("Ses bitti, ölçüme dönülüyor.");
    }
    delay(100);
    return;
  }

  // Ses çalmıyorsa ölçüm yap
  long mesafe = mesafeOlc();

  if (mesafe == -1) {
    delay(200);
    return;
  }

  Serial.print("Mesafe: ");
  Serial.print(mesafe);
  Serial.println(" cm");

  unsigned long simdi = millis();

  if (mesafe < MESAFE_ESIGI) {
    if (simdi - sonTetiklenme > BEKLEME_MS) {
      sonTetiklenme = simdi;
      sesCaliyor = true;
      Serial.println(">>> Kişi algılandı, ses çalınıyor!");
      ses.play("sesim.wav");
    }
  }

  delay(200);
}

burada dikkat edilmesi gereken husus dönüştürdüğünüz .wav dosyasının öncelikle uzantısı.wav olacak adını ise kodun içerisinde de göreceğiniz gibi ben sesim.wav olarak seçtim siz kodun içi ile birlikte istediğiniz ismi verebilirsiniz wav dosyanız 8 bit 16000 mhz ve mono formatında olmalıdır bilgisayarınızda açtığınız herhangi bir pencerenin üst tarafındaki görünümü tıkladığınızda dosya adın uzantıları sekmesini işaretliyerek dosya uzantılarını görünür yapıp sadece ismini değiştirme kısmı size kalsın yani sd kartınızın içindeki dosya uzantıyı gör dediğiniz için sesim.wav olarak görülmelidir ayrıca dosya çalmaya başlama mesafesini yine mesafe eşiğini değiştirerek ayarlayabilirsiniz