Ana içeriğe git
elektronikprojeler
Konu: Dijital Ses Kontrolü (2033 Kez okunmuş)

Dijital Ses Kontrolü

Merhabalar.
Aliexpress'ten 6 adet motor sipariş etmiştim ancak 6 paket switch geldi.
Switchler çift kontak, 6 bacaklı. Momentary dedikleri düğmelerden. Türkçesini bilmiyorum, kusura bakmayın :)
Ben de para iadesini aldıktan sonra bununla ne yapabilirim diye düşünmeye başladım.
Normal konumda iken orta bacağın sağ ve sol bacakla irtibatı yok. Hangi yöne basarsanız o yöndeki bacakla orta bacak irtibatlanıyor.
Biraz düşündükten sonra en iyi seçeneğin dijital olarak ses kontrolü olduğunu düşündüm.
İstediğim şey dijital olarak ses, bas ve tiz seviyelerini kontrol etmek. Fakat bas ve tiz ayar frekanslarının değiştirilebilir olması lazım.
Böyle bir şey aradım ancak bulamadım. Bu konu hakkında fikir sahibi olan var mı?

Ynt: Dijital Ses Kontrolü

Yanıt #1
Switchlerin resmi.

Ynt: Dijital Ses Kontrolü

Yanıt #2
butona basılı tuttukca tiz ve basın değilşmesinimi istiyorsun ? anlamadım ben soruyu galiba sende ne yapmak istediğini tam anlayamamışsın. bu butonlar ile tizz-midd-bass-volume  ne alaka dijital olarak kontrol etmek istiyorsan bu değerleri. TDA serisinde dijital olarak kontrol gerçekleştiren entegreler var fakat mikro denetleyici ile kontrol edip programını yazman gerekiyor.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #3
butona basılı tuttukca tiz ve basın değilşmesinimi istiyorsun ? anlamadım ben soruyu galiba sende ne yapmak istediğini tam anlayamamışsın. bu butonlar ile tizz-midd-bass-volume  ne alaka dijital olarak kontrol etmek istiyorsan bu değerleri. TDA serisinde dijital olarak kontrol gerçekleştiren entegreler var fakat mikro denetleyici ile kontrol edip programını yazman gerekiyor.
Aynen abi.
Şöyle ki butonun üst kısmına basınca ses artacak, alt kısmına basınca ses azalacak. Aynı işle bass ve tiz içinde geçerli olacak.
Hangi entegre imiş o abi ben göremedim :-[

Ynt: Dijital Ses Kontrolü

Yanıt #4
https://www.bucek.name/pdf/tda7315.pdf

TDA7315.  stereo olarak calışır. LOUDNESS FONKSİYONU VAR.  volume kontrolü var 1.25dB adımlarla . tiz ve bas kontrolüde var.

Stereo olduğu için sağ-sol ayarıda var.

Entegrenin kullandığı ileitşim protokolü seri asenkron bir iletişim protokolü . I2C . bunu biliyorsan ve program yazabiliyorsan ki I2C biliyorsan yazıyorsundurda. programını yazman 30 dakikanı alır.

Devreye harici componentler bağlanması lazım bunuda örnek devre şemasında vermiş yani sana sadece kalan programı yazıp haberleşmek.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #5
https://www.bucek.name/pdf/tda7315.pdf

TDA7315.  stereo olarak calışır. LOUDNESS FONKSİYONU VAR.  volume kontrolü var 1.25dB adımlarla . tiz ve bas kontrolüde var.

Stereo olduğu için sağ-sol ayarıda var.

Entegrenin kullandığı ileitşim protokolü seri asenkron bir iletişim protokolü . I2C . bunu biliyorsan ve program yazabiliyorsan ki I2C biliyorsan yazıyorsundurda. programını yazman 30 dakikanı alır.

Devreye harici componentler bağlanması lazım bunuda örnek devre şemasında vermiş yani sana sadece kalan programı yazıp haberleşmek.
Hocam entegreyi araştırıp bulmuşsunuz teşekkür ederim ama daha önce hiç program yazmadım elimde Arduino var onu bile kullanamıyorum.
Acaba hazır program yazan var mıdır bir araştırıp bakayım.

Ynt: Dijital Ses Kontrolü

Yanıt #6
@Furkan41
Hocam araştırdım.
Kod yazan var, fakat sistem PIC ile kontrol edilmiş, ve 2.1 sistemler için yapılmış.

Fakat ben stereo sistemler için yapmak, sistemi Arduino ile kontrol etmek, ve kontrol ettiğim değerleri bir LCD'ye yazdırmak istiyorum.

Entegrede 0dB'den -75dB'e kadar 1.25dB aralıkla Volume kontrol imkanı var. Bu da 61 adım yapıyor.
Ben de bu adımları LCD'ye yazdırmak istiyorum.
Mesela en düşük değer olan -75dB seviyesinde iken LCD'de "Volume: 0" yazacak, en yüksek değer olan 0dB seviyesinde iken LCD üzerinde "Volume: 60" yazacak.

Entegrenin Mute özelliği de var. Mute özelliğini açınca LCD'de "Mute: ON" yazacak, kapattığımda ise "Mute: OFF" yazacak.

Bas ve tiz kontrolleri için de aynı şeyleri yapmak istiyorum.

Bunun gibi bir şey arıyordum, buldum da. Ancak dijital potansiyometre kullanılmış. Ben sadece düğmelerle yapmak istiyorum.

Ynt: Dijital Ses Kontrolü

Yanıt #7
Arduino da hazır kütüphaneler var.  I2C kütüphanesi nasıl kullanılıyor öğren. zaten bu entegrenin 10 sayfa datasheeti falan var.  driverini yazarsın. kullanırsın rahatlıkla.
 bu arada TDA7313 diye de bir entegre var neredeyse aynılar. TDA7313 ün stereo kanalı fazla galiba ve karıştırma özelliğide varmı tam hatırlamıyorum bakmam lazım.

Ama emin ol I2C nasıl kullandığını öğrendin mi gerisini yaparsın. hem bunla yapılmış örneklerde var. Çinliler bu ampli işlerine baya düşkün.

@Yusuf usta  Yusuf ustaya zamanında bir tane entegre ismi söylemiştim. yazılıma falan gerek kalmadan buton bağlayıp volume ayarı yapılabiliyordu butonlar ile. ve loudness özelliğide vardı. bu entegrenin ismini unuttum. OSD icin kullanmıştım.  o entegrenin serisinde tizz ve bas kontrolü yapan entegrede olabilir. araştır.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #8
16x2 lcd ekranda güzel olmuyor sana söyliyeyim. GLCD kullanırsan daha hoş görüntü elde edersin.  veya 2.4 inchllik bir nexiton ekran alırsın dokunmatik bir kaç bir şey daha eklersin güzel bir şey olur. hatta arduino ile yaparsan. sd kart ile müzikte oynatırsın. yeterki hayal et. :D ama yapta
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #9
@Furkan41
Arduino programını biraz kurcalayınca Wire örneklerini buldum.
Şimdi bir sorum var. Bu verileri ikili birimden(00000010 gibi) herhangi bir dönüştürme yapmadan(decimal veya hex) kullanabilir miyim?
Binary değerleri decimal'e çevirmek lazımmış.

Şimdi @Mr_YAMYAM hocamıza bir sorum var.
Bahsi geçen TDA7315 entegresinin bass turnover frekansı 100Hz olarak belirlenmiş. Bunu nasıl 30Hz'e çekebiliriz?
Devrenin datasheet şeması:

Devrede bas ve tiz ayarları değiştiğinde oluşan grafik:

Ynt: Dijital Ses Kontrolü

Yanıt #10
Datasheet verilerinde INCREASED TONE CONTROL verileri olması lazımdır.
Bu veilerin grafiğini inceleyip, turnover frekansı istenildiği gibi ise, bu uygulamadaki direnç ve kondansatör değişimini yapmak yeterlidir.

Ynt: Dijital Ses Kontrolü

Yanıt #11
Datasheet verilerinde INCREASED TONE CONTROL verileri olması lazımdır.
Bu veilerin grafiğini inceleyip, turnover frekansı istenildiği gibi ise, bu uygulamadaki direnç ve kondansatör değişimini yapmak yeterlidir.

@Mr_YAMYAM
Hocam üstteki resim çıkmamış, düzelttim.

Ynt: Dijital Ses Kontrolü

Yanıt #12
Evet decimal ve hex te kullanabilirsin ayni degere geldikten sonra sikinti olmaz.  Binary sekilde yapmalarinin sebebi bir hata olursa hemen bit degerlerine ordan bakip nerede oldugunu anlamak icindir.  I2C de su kelimeleri arastie oncelikle

I2C start biti.
I2C cihaz adresi.
I2C stop biti.
I2C ACK isareti nedir ?
I2C NACK isareti nedir ?
Son olarak I2C data gonderimi nasildir. Hem oku hemde  iletisim grafigine dikkatlice bakip cozumle zaten anliyacaksin.

 Daha sonra entegrenin cihaz adresi ne datasheeten bak veriyi nasil gondermen gerekiyor orda yazar. Kac khz iletisim kuracaginida soyler.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #13
Evet decimal ve hex te kullanabilirsin ayni degere geldikten sonra sikinti olmaz.  Binary sekilde yapmalarinin sebebi bir hata olursa hemen bit degerlerine ordan bakip nerede oldugunu anlamak icindir.  I2C de su kelimeleri arastie oncelikle

I2C start biti.
I2C cihaz adresi.
I2C stop biti.
I2C ACK isareti nedir ?
I2C NACK isareti nedir ?
Son olarak I2C data gonderimi nasildir. Hem oku hemde  iletisim grafigine dikkatlice bakip cozumle zaten anliyacaksin.

 Daha sonra entegrenin cihaz adresi ne datasheeten bak veriyi nasil gondermen gerekiyor orda yazar. Kac khz iletisim kuracaginida soyler.
Hocam 100kbit/s diyor bu kaç kHz frekansa denk geliyor?
Entegrenin adresi hex olarak 80 imiş.
Decimal olarak 128'e denk geliyor.

Sistem bu şekilde çalışıyor.
Arduino'da da start ve stop bitlerini ayarlamak gerekiyor mu?
Wire.beginTransmission(128);
Bununla iletişimi başlatıp,
Wire.endTransmission();
bununla bitirmiyor muyuz?

Ynt: Dijital Ses Kontrolü

Yanıt #14
@Furkan41
Hocam kodu bitirdim.
Bir eksiklik, yanlışlık var ise düzeltmem adına yardımcı olursanız sevinirim.
Kod: [Seç]
#include <Wire.h>
byte volume = 30;
byte leftmute = 128;
byte rightmute = 160;
byte loud = 68;
byte bass = 111;
byte treble = 127;
int VolumeUp = 2;
int VolumeDown = 3;
int Mute = 4;
int Loudness = 5;
int BassUp = 6;
int BassDown = 7;
int TrebleUp = 8;
int TrebleDown = 9;
void setup() {
  pinMode(VolumeUp, INPUT);
  pinMode(VolumeDown, INPUT);
  pinMode(Mute, INPUT);
  pinMode(Loudness, INPUT);
  pinMode(BassUp, INPUT);
  pinMode(BassDown, INPUT);
  pinMode(TrebleUp, INPUT);
  pinMode(TrebleDown, INPUT);
  Wire.begin();
  Wire.beginTransmission(128);
  Wire.write(volume);
  Wire.write(leftmute);
  Wire.write(rightmute);
  Wire.write(loud);
  Wire.write(bass);
  Wire.write(treble);
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(128);
  if (VolumeUp == HIGH, volume < 60) {
    volume++;
    Wire.write(volume);
  } else if (VolumeUp == HIGH, volume == 60) {
    volume = 60;
    Wire.write(volume);
  }
  if (VolumeDown == HIGH, volume > 0) {
    volume--;
    Wire.write(volume);
  } else if (VolumeDown == HIGH, volume == 0) {
    volume = 0;
    Wire.write(volume);
  }
  if (Mute == HIGH) {
    leftmute = 159;
    rightmute = 191;
    Wire.write(leftmute);
    Wire.write(rightmute);
  } else {
    leftmute = 128;
    rightmute = 160;
    Wire.write(leftmute);
    Wire.write(rightmute);
  }
  if (Loudness == HIGH) {
    loud = 64;
    Wire.write(loud);
  } else {
    loud = 68;
    Wire.write(loud);
  }
  if (BassUp == HIGH, bass == 104) {
    bass = 104;
    Wire.write(bass);
  } else if (BassUp == HIGH, bass <= 111, bass >= 104) {
    bass--;
    Wire.write(bass);
  } else if (BassUp == HIGH, bass == 102) {
    bass + 9;
    Wire.write(bass);
  } else if (BassUp == HIGH, bass <= 102, bass >= 96) {
    bass++;
    Wire.write(bass);
  }
  if (BassDown == HIGH, bass == 96) {
    bass = 96;
    Wire.write(bass);
  } else if (BassDown == HIGH, bass > 96, bass <= 102) {
    bass--;
    Wire.write(bass);
  } else if (BassDown == HIGH, bass == 111) {
    bass - 9;
    Wire.write(bass);
  } else if (BassDown == HIGH, bass <= 111, bass >= 104) {
    bass++;
    Wire.write(bass);
  }
  if (TrebleUp == HIGH, treble == 120) {
    treble = 104;
    Wire.write(treble);
  } else if (TrebleUp == HIGH, treble <= 127, treble >= 120) {
    treble--;
    Wire.write(treble);
  } else if (TrebleUp == HIGH, treble == 118) {
    treble + 9;
    Wire.write(treble);
  } else if (TrebleUp == HIGH, treble <= 118, treble >= 112) {
    treble++;
    Wire.write(treble);
  }
  if (TrebleDown == HIGH, treble == 112) {
    treble = 96;
    Wire.write(treble);
  } else if (TrebleDown == HIGH, treble > 112, treble <= 127) {
    treble--;
    Wire.write(treble);
  } else if (TrebleDown == HIGH, treble == 127) {
    treble - 9;
    Wire.write(treble);
  } else if (TrebleDown == HIGH, treble <= 127, treble >= 120) {
    treble++;
    Wire.write(treble);
  }
  Wire.endTransmission();
}

@Mr_YAMYAM
Hocam bu resimlere bakarak hangi elemanları değiştirmem gerektiğini söyleyebilir misiniz?
Devre Şeması:

Ton Kontrol Cevabı:

Ynt: Dijital Ses Kontrolü

Yanıt #15

@Mr_YAMYAM
Hocam bu resimlere bakarak hangi elemanları değiştirmem gerektiğini söyleyebilir misiniz?
Devre Şeması:

Ton Kontrol Cevabı:

BOUT (Bass Out) ve BIN (Bass in) kondansatörlerini değiştirebilirsin.
100nF için roll-off frekansı 100Hz olarak verildiğine göre bu kondansatörleri 220nF yapmak gerekecektir.
Entegre iç tasarımı hakkında bilgi olmadığı için kesin bir formül verilemez. Çünkü ROLL-OFF frekansı R-C formülüne göre hesaplanmaktadır.
Burada kullanılacak kondansatörler anlaşıldığı kadarıyla sinyal hattı üzerinde bulunan aktif komponentlerdendir.
Yani sinyaller o kondansatörler üzerinden akmaktadır. Bu sebeple bu kondansatörlerin tip ve özellikler son derece önemlidir.
Bilindik polyester tipli kondansatör kullanımı uygun olmayabilir. Benim önerim M-L (Multi-Layer) veya polypropilen denilen tiplerden kullanılması yönündedir.

Ynt: Dijital Ses Kontrolü

Yanıt #16
BOUT (Bass Out) ve BIN (Bass in) kondansatörlerini değiştirebilirsin.
100nF için roll-off frekansı 100Hz olarak verildiğine göre bu kondansatörleri 220nF yapmak gerekecektir.
Entegre iç tasarımı hakkında bilgi olmadığı için kesin bir formül verilemez. Çünkü ROLL-OFF frekansı R-C formülüne göre hesaplanmaktadır.
Burada kullanılacak kondansatörler anlaşıldığı kadarıyla sinyal hattı üzerinde bulunan aktif komponentlerdendir.
Yani sinyaller o kondansatörler üzerinden akmaktadır. Bu sebeple bu kondansatörlerin tip ve özellikler son derece önemlidir.
Bilindik polyester tipli kondansatör kullanımı uygun olmayabilir. Benim önerim M-L (Multi-Layer) veya polypropilen denilen tiplerden kullanılması yönündedir.

Hocam elimde sadece 4 tane ML 220nF kondansatör var, fakat ölçüm yaptığımda 180nF çıkıyor. Uygun olmaz derseniz polipropilen kondansatör temin edene kadar polyester kullanmak istiyorum.

Ynt: Dijital Ses Kontrolü

Yanıt #17
@Furkan41
Hocam kodu bitirdim.
Bir eksiklik, yanlışlık var ise düzeltmem adına yardımcı olursanız sevinirim.
Kod: [Seç]
#include <Wire.h>
byte volume = 30;
byte leftmute = 128;
byte rightmute = 160;
byte loud = 68;
byte bass = 111;
byte treble = 127;
int VolumeUp = 2;
int VolumeDown = 3;
int Mute = 4;
int Loudness = 5;
int BassUp = 6;
int BassDown = 7;
int TrebleUp = 8;
int TrebleDown = 9;
void setup() {
  pinMode(VolumeUp, INPUT);
  pinMode(VolumeDown, INPUT);
  pinMode(Mute, INPUT);
  pinMode(Loudness, INPUT);
  pinMode(BassUp, INPUT);
  pinMode(BassDown, INPUT);
  pinMode(TrebleUp, INPUT);
  pinMode(TrebleDown, INPUT);
  Wire.begin();
  Wire.beginTransmission(128);
  Wire.write(volume);
  Wire.write(leftmute);
  Wire.write(rightmute);
  Wire.write(loud);
  Wire.write(bass);
  Wire.write(treble);
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(128);
  if (VolumeUp == HIGH, volume < 60) {
    volume++;
    Wire.write(volume);
  } else if (VolumeUp == HIGH, volume == 60) {
    volume = 60;
    Wire.write(volume);
  }
  if (VolumeDown == HIGH, volume > 0) {
    volume--;
    Wire.write(volume);
  } else if (VolumeDown == HIGH, volume == 0) {
    volume = 0;
    Wire.write(volume);
  }
  if (Mute == HIGH) {
    leftmute = 159;
    rightmute = 191;
    Wire.write(leftmute);
    Wire.write(rightmute);
  } else {
    leftmute = 128;
    rightmute = 160;
    Wire.write(leftmute);
    Wire.write(rightmute);
  }
  if (Loudness == HIGH) {
    loud = 64;
    Wire.write(loud);
  } else {
    loud = 68;
    Wire.write(loud);
  }
  if (BassUp == HIGH, bass == 104) {
    bass = 104;
    Wire.write(bass);
  } else if (BassUp == HIGH, bass <= 111, bass >= 104) {
    bass--;
    Wire.write(bass);
  } else if (BassUp == HIGH, bass == 102) {
    bass + 9;
    Wire.write(bass);
  } else if (BassUp == HIGH, bass <= 102, bass >= 96) {
    bass++;
    Wire.write(bass);
  }
  if (BassDown == HIGH, bass == 96) {
    bass = 96;
    Wire.write(bass);
  } else if (BassDown == HIGH, bass > 96, bass <= 102) {
    bass--;
    Wire.write(bass);
  } else if (BassDown == HIGH, bass == 111) {
    bass - 9;
    Wire.write(bass);
  } else if (BassDown == HIGH, bass <= 111, bass >= 104) {
    bass++;
    Wire.write(bass);
  }
  if (TrebleUp == HIGH, treble == 120) {
    treble = 104;
    Wire.write(treble);
  } else if (TrebleUp == HIGH, treble <= 127, treble >= 120) {
    treble--;
    Wire.write(treble);
  } else if (TrebleUp == HIGH, treble == 118) {
    treble + 9;
    Wire.write(treble);
  } else if (TrebleUp == HIGH, treble <= 118, treble >= 112) {
    treble++;
    Wire.write(treble);
  }
  if (TrebleDown == HIGH, treble == 112) {
    treble = 96;
    Wire.write(treble);
  } else if (TrebleDown == HIGH, treble > 112, treble <= 127) {
    treble--;
    Wire.write(treble);
  } else if (TrebleDown == HIGH, treble == 127) {
    treble - 9;
    Wire.write(treble);
  } else if (TrebleDown == HIGH, treble <= 127, treble >= 120) {
    treble++;
    Wire.write(treble);
  }
  Wire.endTransmission();
}

@Mr_YAMYAM
Hocam bu resimlere bakarak hangi elemanları değiştirmem gerektiğini söyleyebilir misiniz?
Devre Şeması:

Ton Kontrol Cevabı:


Merhaba, Şuan köyde olduğum için ve internet doğru düzgün cekmediği için. acele olarak yazıyorum.

Kodunda gördüğüm ilk hata if şartlarına yazdığın şart if şartının icinde " , " Virgül olmaz. sen orada örnek veriyorum volume arttırma tuşuna basılmışsa ve volum 60 dan düşük ise volumeyi arttır demişsin. fakato virgül ile olmaz  && (VE) işareti ile olur örnek bir yazım göstermek gerekirse.

if(volbutton==HIGH && volume < 60 ) // volume butonuna basılmışsa ve volume küçük ise 60 dan.
{
// buradaki işlemleri yap
}

olucak. sen AND , OR  gibi mantıksal işlemlerede göz at lazım olacak.  mantıksal operatörler diye araştır internette.

ve entegreyi alıp denemelere başla. denemelerde kodu komple yazma ilk volume kısmını test et başarılı şekilde iletişim kur baktın bu işi kaptın komple kodu yazmaya başlarsın. böyle bir hata yaparsan uğraşır durursun.

soruna gelicek olursak 100kbit/s   100KHz lik iletişim demektir. yani senin SERİAL CLOCK 'un 100khz olucak. ben arduino ile pek takılmıyor. o yüzden hangi fonksiyon ile bunu ayarlıyorsun bilmiyorum ama I2C protokolünü başlattığın fonksiyonda iletişim hızını ister hangisi istiyorssa 100khz yapıştır.

şimdi baktım. İletişim hızını ayarlaman icin WireSetClock(iletişim hızı); fonksiyonu nu kullanacaksın.
https://www.arduino.cc/en/Reference/WireSetClock
bu sayfada anlatışmış. I2Cprotokolünü kurarken bunuda ayarla 100khz e.

bir diğer sorularına gelelim.

Arduino'da da start ve stop bitlerini ayarlamak gerekiyor mu?
Wire.beginTransmission(128);
Bununla iletişimi başlatıp,
Wire.endTransmission();
bununla bitirmiyor muyuz?

Start ve stop bitlerini ayarlamana gerke yokk arduino platformunu oluşturan kişiler bunları fonksiyonların icinde yapıyor yani sen Wire.endTransmission(); dediğinde aslında arka tarafta stop biti gönderiliyor. buraları kafana takma fonksiyonlar hallediyor.

son olarak gördüğüm diğer şey ise şu . Yazma işlemin hatalı yazma işlemini söyle yaptır.

void Datagonder(unsigned char byte)
{
Wire.beginTransmission(cihaz adresini buraya gir.);
  Wire.write(byte);
Wire.endTransmission();
}

bu fonksiyonu arduinoda setup kısmındna önce tanımla yani oraya kopyala. ve şimdide bunu programda nasıl kullanacağını göstereyim.

if(volumebutton == HIGH && volume < 60)
{
volume++;  volume değişkenini 1 arttır.
Datagonder(volume);  // volume değerini slave cihaza gönder.
}

niye böyle yaptığımıza gellirsek. eğer data katoloğunu incelersen. iletişime her başlarken ilk cihaz adresini gönder daha sonra N +1 kadar byte gönder demiş yani stoplamassan istediğin kadar peş peşe data yolla demiş. bizde bir fonksiyon kurduk. o fonksiyon yazma işi yapıyor.  Datagonder fonksiyonana bakarsan ilk cihaz adresini gönderip ileitşimi kuruyor daha sonra gidecek datayı yazdırıyor. daha sonra iletişimi bitiriyor. sağlıklı bir ileitşim oluyor. kodunu bu anlattıklarıma göre yeniden şekillendir.

ve muhakkak Mantıksal operatörrleri incele. ayiretten bit düzeyinde mantıksal işlemlerede bak. kesinlikle bak. madem ilgi duyuyorsun bir şeyler yapmaya calışıyorsun. ben sana yardımcı olurum ama sende araştır. öğren. takıldığın yerde gel.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #18
Ve son olarak. devreyi kurarsan. arduinonun GND si ile amfiyi beslediğin beslemenin gnd sini sakın ortak yapma. arduinonun GND sini entegrenin DJGGND kısmına bağla. yeter.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #19
Ve son olarak. devreyi kurarsan. arduinonun GND si ile amfiyi beslediğin beslemenin gnd sini sakın ortak yapma. arduinonun GND sini entegrenin DJGGND kısmına bağla. yeter.
Hocam sizin yazdığınız gibi yaptım ancak hata verdi.

Ynt: Dijital Ses Kontrolü

Yanıt #20
...

Ynt: Dijital Ses Kontrolü

Yanıt #21
byte kelimesini değişken ismi olarak kullanamassın byte yerine  " veri " yaz.  
Wire.write(); icinede veri yaz.

void Datagonder(unsigned char veri)
{
Wire.beginTransmission(128);
  Wire.write(veri);
Wire.endTransmission();
}

bu fonksiyonu setup kısmının icine yazma dedim. dışına yaz


Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #22
son olarak gördüğüm diğer şey ise şu . Yazma işlemin hatalı yazma işlemini söyle yaptır.

void Datagonder(unsigned char byte)
{
Wire.beginTransmission(cihaz adresini buraya gir.);
  Wire.write(byte);
Wire.endTransmission();
}

bu fonksiyonu arduinoda setup kısmındna önce tanımla yani oraya kopyala. ve şimdide bunu programda nasıl kullanacağını göstereyim.
byte kelimesini değişken ismi olarak kullanamassın byte yerine  " veri " yaz.  
Wire.write(); icinede veri yaz.

void Datagonder(unsigned char veri)
{
Wire.beginTransmission(128);
  Wire.write(veri);
Wire.endTransmission();
}

bu fonksiyonu setup kısmının icine yazma dedim. dışına yaz


İki mesajın çelişmesi :D
Neyse. Yaptım ama yine de aynı hatayı veriyor.
Ekleme:
Evet, sanırım son dediğiniz doğruymuş :D
Şimdi LCD için kod eklemeye gidiyorum, bir saat sonra dönerim :)

Ynt: Dijital Ses Kontrolü

Yanıt #23
Entegre varmı ? deneme yaparak mı gidiyorsun ?

LCD 2x16 ise bari menülü bir şey yapmaya calış
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #24
Entegre varmı ? deneme yaparak mı gidiyorsun ?

LCD 2x16 ise bari menülü bir şey yapmaya calış
Yok hocam entegre gelince hepsini toptan deneyeceğim :)
LCD 4x20 kullanacağım. Büyük ekran olsun ki LCD'nin kötü görüntüsünü bastırsın :D
Normalde OLED ekran kullanacaktım ama LCD başlangıç için daha kolay olur diye düşündüm.

Ynt: Dijital Ses Kontrolü

Yanıt #25
İyi bakalım hadi kolay gelsin.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #26
Hatalar olsa da program çok özenli yazılmış Serhat. Kaynak kodunun formatlanma şekli neticede işlemcide çalışan makina kodunu etkilemese de, programcının işini severek yaptığını ve dağınık birisi olmadığını gösterir. Ayrıca özenli yazılmış bir programda hata analizi yapmak çok daha kolaydır.
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #27
Ben de birkaç tavsiyede bulunayım.

1) Mekanik butonlar, özellikle de yaylı olanlar, durum değiştirirken kontaklar üzerinde birkaç kez sekebilir. Eğer program da buton durumunu yeterince sıklıkta okuyorsa her bir sekmeyi görecektir ve sanki buton birkaç kez basılmış gibi işlem yapacaktır. O yüzden butonu "debounce" etmen lazım. Bunu da basitçe şöyle yapabilirsin: Butonun bir önceki durumunu da takip edersin ve buton son 10 kez (veya kaç kez gerekiyorsa sorunu çözmek için) aynı değerde kaldı ise butona basılmış kabul edersin.

2) Senin yaptığın gibi her bir butonu test edip ona göre I2C ye veri yazacağına, butonların durumunu test edip volume, mute, bass, treble, loudness değişkenlerini güncelle. loop'un sonunda da bütün değişkenleri entegreye yaz. Bu şekilde program daha sağlam olur. Örneğin bazan statik elektrik nedeniyle entegrenin kafası karışabilir, ama sen her döngü sonunda güncel değerleri yazdığını için kafa karışıklığı çok kısa sürer ve döngü sonunda entegre kendine gelir :)
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #28
Hatalar olsa da program çok özenli yazılmış Serhat. Kaynak kodunun formatlanma şekli neticede işlemcide çalışan makina kodunu etkilemese de, programcının işini severek yaptığını ve dağınık birisi olmadığını gösterir. Ayrıca özenli yazılmış bir programda hata analizi yapmak çok daha kolaydır.
Hocam çok teşekkür ederim. Bu tip övgüler beni işimi yapmaya sevk etse de bazı sebepler canımı sıkıyor. Ben nasıl bu kadar düzenli bir kod yazdığıma dair bir fikre sahip değilim. Zira atölyem bayağı karışık, bütün parçalar birbirinden alakasız yerlerde, o yüzden ben de şaşırmaktayım :)
Ben de birkaç tavsiyede bulunayım.

1) Mekanik butonlar, özellikle de yaylı olanlar, durum değiştirirken kontaklar üzerinde birkaç kez sekebilir. Eğer program da buton durumunu yeterince sıklıkta okuyorsa her bir sekmeyi görecektir ve sanki buton birkaç kez basılmış gibi işlem yapacaktır. O yüzden butonu "debounce" etmen lazım. Bunu da basitçe şöyle yapabilirsin: Butonun bir önceki durumunu da takip edersin ve buton son 10 kez (veya kaç kez gerekiyorsa sorunu çözmek için) aynı değerde kaldı ise butona basılmış kabul edersin.

2) Senin yaptığın gibi her bir butonu test edip ona göre I2C ye veri yazacağına, butonların durumunu test edip volume, mute, bass, treble, loudness değişkenlerini güncelle. loop'un sonunda da bütün değişkenleri entegreye yaz. Bu şekilde program daha sağlam olur. Örneğin bazan statik elektrik nedeniyle entegrenin kafası karışabilir, ama sen her döngü sonunda güncel değerleri yazdığını için kafa karışıklığı çok kısa sürer ve döngü sonunda entegre kendine gelir :)
Hocam birinci öneriniz konusunda açık ve net söylemek gerekirse hiçbir fikrim yok.
İkinci önerinizi yarın uygulayıp kodu özelden gönderirim. Şeklini almış son kodu paylaşmak istemiyorum.

Ynt: Dijital Ses Kontrolü

Yanıt #29
Hocam çok teşekkür ederim. Bu tip övgüler beni işimi yapmaya sevk etse de bazı sebepler canımı sıkıyor. Ben nasıl bu kadar düzenli bir kod yazdığıma dair bir fikre sahip değilim. Zira atölyem bayağı karışık, bütün parçalar birbirinden alakasız yerlerde, o yüzden ben de şaşırmaktayım :)

Sen bu işi severek yapmaya devam et, böyle yaparsan zaten hem görsel olarak hem de işlevsel olarak en iyi programı ortaya çıkarmaya çalışacaksın. 30 yıldan fazla süredir gömülü sistem programlama işindeyim, ve karışık kuruşuk, şekilsiz kod yazıp da programı iyi çalışan görmedim. Bir şiir gibi özenle formatlanmış, tertemiz program yazan ama yazdığı programlarda hep sorun çıkan da görmedim.

Hocam birinci öneriniz konusunda açık ve net söylemek gerekirse hiçbir fikrim yok.
İkinci önerinizi yarın uygulayıp kodu özelden gönderirim. Şeklini almış son kodu paylaşmak istemiyorum.

Neyse, senin şu ISDS osiloskop gelsin,  debounce ile ne demek istediğimi bizzat ekranda görebileceksin. Bu arada aynı osiloskoptan ben de ısmarladım. Onun bir incelemesini yapacağım inşallah.
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #30
@taydin
Hocam osiloskop için beklemek zorundayım gibi görünüyor.
Ayrıca şekillendirdiğim son kod burada.
Fakat debounce olayını yapamadım. Onu da döngünün sonuna belli bir miktar gecikme ekleyerek halletmeyi düşünüyorum. Sizce olur mu?
Kod: [Seç]
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

byte volume = 30;
byte leftmute = 128;
byte rightmute = 160;
byte loud = 68;
byte bass = 111;
byte treble = 127;

int VolumeUp = 2;
int VolumeDown = 3;
int Mute = 4;
int Loudness = 5;
int BassUp = 6;
int BassDown = 7;
int TrebleUp = 8;
int TrebleDown = 9;
void SendData(unsigned char data) {
  Wire.beginTransmission(128);
  Wire.write(data);
  Wire.endTransmission();
}
void setup() {

  pinMode(VolumeUp, INPUT);
  pinMode(VolumeDown, INPUT);
  pinMode(Mute, INPUT);
  pinMode(Loudness, INPUT);
  pinMode(BassUp, INPUT);
  pinMode(BassDown, INPUT);
  pinMode(TrebleUp, INPUT);
  pinMode(TrebleDown, INPUT);
  Wire.begin();
  Wire.setClock(100000);
  Wire.beginTransmission(128);
  Wire.write(volume);
  Wire.write(leftmute);
  Wire.write(rightmute);
  Wire.write(loud);
  Wire.write(bass);
  Wire.write(treble);
  Wire.endTransmission();
  lcd.begin();
  lcd.setCursor(0,0);
  lcd.print("H_SerhatY DSP v1.0");
  lcd.setCursor(0,1);
  lcd.print("Volume, Mute, Bass,");
  lcd.setCursor(0,2);
  lcd.print("Treble and Loudness");
  lcd.setCursor(5,3);
  lcd.print("Controller");
  delay(1000);
}

void loop() {
  if (VolumeUp == HIGH && volume < 0) {
    volume--;
  } else if (VolumeUp == HIGH && volume == 0) {
    volume = 0;
  }
  if (VolumeDown == HIGH && volume > 60) {
    volume++;
  } else if (VolumeDown == HIGH && volume == 60) {
    volume = 60;
  }
   
  if (Mute == HIGH) {
    leftmute = 159;
    rightmute = 191;
  } else {
    leftmute = 128;
    rightmute = 160;
  }
 
  if (Loudness == HIGH) {
    loud = 64;
  } else {
    loud = 68;
  }
 
  if (BassUp == HIGH && bass == 104) {
    bass = 104;
  } else if (BassUp == HIGH && bass <= 111 && bass >= 104) {
    bass--;
  } else if (BassUp == HIGH && bass == 102) {
    bass + 9;
  } else if (BassUp == HIGH && bass <= 102 && bass >= 96) {
    bass++;
  }
  if (BassDown == HIGH && bass == 96) {
    bass = 96;
  } else if (BassDown == HIGH && bass > 96 && bass <= 102) {
    bass--;
  } else if (BassDown == HIGH && bass == 111) {
    bass - 9;
  } else if (BassDown == HIGH && bass <= 111 && bass >= 104) {
    bass++;
  }
 
 
 
  if (TrebleUp == HIGH && treble == 120) {
    treble = 120;
  } else if (TrebleUp == HIGH && treble <= 127 && treble >= 120) {
    treble--;
  } else if (TrebleUp == HIGH && treble == 118) {
    treble + 9;
  } else if (TrebleUp == HIGH && treble <= 118 && treble >= 112) {
    treble++;
  }
  if (TrebleDown == HIGH && treble == 112) {
    treble = 112;
  } else if (TrebleDown == HIGH && treble > 112 && treble <= 127) {
    treble--;
  } else if (TrebleDown == HIGH && treble == 127) {
    treble - 9;
  } else if (TrebleDown == HIGH && treble <= 127 && treble >= 120) {
    treble++;
  }
 
  SendData(volume);
  SendData(leftmute);
  SendData(rightmute);
  SendData(loud);
  SendData(bass);
  SendData(treble);
 
  if (volume == 60) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 0");
  } else if (volume == 59) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 1");
  } else if (volume == 58) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 2");
  } else if (volume == 57) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 3");
  } else if (volume == 56) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 4");
  } else if (volume == 55) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 5");
  } else if (volume == 54) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 6");
  } else if (volume == 53) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 7");
  } else if (volume == 52) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 8");
  } else if (volume == 51) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 9");
  } else if (volume == 50) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 10");
  } else if (volume == 49) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 11");
  } else if (volume == 48) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 12");
  } else if (volume == 47) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 13");
  } else if (volume == 46) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 14");
  } else if (volume == 45) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 15");
  } else if (volume == 44) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 16");
  } else if (volume == 43) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 17");
  } else if (volume == 42) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 18");
  } else if (volume == 41) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 19");
  } else if (volume == 40) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 20");
  } else if (volume == 39) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 21");
  } else if (volume == 38) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 22");
  } else if (volume == 37) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 23");
  } else if (volume == 36) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 24");
  } else if (volume == 35) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 25");
  } else if (volume == 34) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 26");
  } else if (volume == 33) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 27");
  } else if (volume == 32) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 28");
  } else if (volume == 31) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 29");
  } else if (volume == 30) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 30");
  } else if (volume == 29) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 31");
  } else if (volume == 28) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 32");
  } else if (volume == 27) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 33");
  } else if (volume == 26) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 34");
  } else if (volume == 25) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 35");
  } else if (volume == 24) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 36");
  } else if (volume == 23) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 37");
  } else if (volume == 22) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 38");
  } else if (volume == 21) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 39");
  } else if (volume == 20) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 40");
  } else if (volume == 19) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 41");
  } else if (volume == 18) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 42");
  } else if (volume == 17) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 43");
  } else if (volume == 16) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 44");
  } else if (volume == 15) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 45");
  } else if (volume == 14) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 46");
  } else if (volume == 13) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 47");
  } else if (volume == 12) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 48");
  } else if (volume == 11) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 49");
  } else if (volume == 10) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 50");
  } else if (volume == 9) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 51");
  } else if (volume == 8) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 52");
  } else if (volume == 7) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 53");
  } else if (volume == 6) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 54");
  } else if (volume == 5) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 55");
  } else if (volume == 4) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 56");
  } else if (volume == 3) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 57");
  } else if (volume == 2) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 58");
  } else if (volume == 1) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 59");
  } else if (volume == 0) {
    lcd.setCursor(0,0);
    lcd.print("Volume = 60");
  }
 
  if (leftmute == 128 && rightmute == 160) {
    lcd.setCursor(0,3);
    lcd.print("Mute:0");
  } else if (leftmute == 159 && rightmute == 191) {
    lcd.setCursor(0,3);
    lcd.print("Mute:1");
  }
 
  if (loud == 64) {
    lcd.setCursor(10,3);
    lcd.print("Loudness:0");
  } else if (loud == 68) {
    lcd.setCursor(10,3);
    lcd.print("Loudness:1");
  }
 
  if (bass == 104) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +7");
  } else if (bass == 105) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +6");
  } else if (bass == 106) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +5");
  } else if (bass == 107) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +4");
  } else if (bass == 108) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +3");
  } else if (bass == 109) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +2");
  } else if (bass == 110) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +1");
  } else if (bass == 111) {
    lcd.setCursor(0,1);
    lcd.print("Bass = 0");
  } else if (bass == 102) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -1");
  } else if (bass == 101) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -2");
  } else if (bass == 100) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -3");
  } else if (bass == 99) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -4");
  } else if (bass == 98) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -5");
  } else if (bass == 97) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -6");
  } else if (bass == 96) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -7");
  }
 
  if (treble == 120) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +7");
  } else if (treble == 121) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +6");
  } else if (treble == 122) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +5");
  } else if (treble == 123) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +4");
  } else if (treble == 124) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +3");
  } else if (treble == 125) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +2");
  } else if (treble == 126) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +1");
  } else if (treble == 127) {
    lcd.setCursor(0,2);
    lcd.print("Treble = 0");
  } else if (treble == 118) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -1");
  } else if (treble == 117) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -2");
  } else if (treble == 116) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -3");
  } else if (treble == 115) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -4");
  } else if (treble == 114) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -5");
  } else if (treble == 113) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -6");
  } else if (treble == 112) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -7");
  }
 
}

Ynt: Dijital Ses Kontrolü

Yanıt #31
Öncelikle volüm ile ilgili şunları düzelt:

TDA7315 datasheet'te volüm registerine 63 yazıldığında minimum volüm (-70dB zayıflatma) ve 0 yazıldığında maksimum volüm (hiç zayıflatma yok) elde ediliyor. O halde volüm değeri 0 - 63 arasında olmalı. Ama sen volümü negatif sayı olarak kullanıyorsun. Bu doğru değil (ayrıca negatif kullandığın halde de değişkeni işaretsiz tanımlamışsın (byte). Ama pozitif olarak kullanacağımız için byte kalacak. Bir de volüm tuşunu kontrolde gereksiz bir işlem yapıyorsun, onu kaldır.

Kod: [Seç]

byte volume = 0;

if (VolumeUp == HIGH) {
   if (volume > 0) {
      volume--;
   }
}

if (VolumeDown == HIGH) {
   if (volume < 63) {
      volume++;
   }
}
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #32
Öncelikle volüm ile ilgili şunları düzelt:

TDA7315 datasheet'te volüm registerine 63 yazıldığında minimum volüm (-70dB zayıflatma) ve 0 yazıldığında maksimum volüm (hiç zayıflatma yok) elde ediliyor. O halde volüm değeri 0 - 63 arasında olmalı. Ama sen volümü negatif sayı olarak kullanıyorsun. Bu doğru değil (ayrıca negatif kullandığın halde de değişkeni işaretsiz tanımlamışsın (byte). Ama pozitif olarak kullanacağımız için byte kalacak. Bir de volüm tuşunu kontrolde gereksiz bir işlem yapıyorsun, onu kaldır.

Kod: [Seç]

byte volume = 0;

if (VolumeUp == HIGH) {
   if (volume > 0) {
      volume--;
   }
}

if (VolumeDown == HIGH) {
   if (volume < 63) {
      volume++;
   }
}
Hocam normalde 63'e kadar olabiliyor ancak ben 60'a sınırladım. Ayrıca ses seviyesini ilk açıldığında bilerek 30'a getirdim.
Kodu düzenledim. Başka hata var mı?

Ynt: Dijital Ses Kontrolü

Yanıt #33
Bir de volümü ekrana yazdırırken her değer için ayrı bir kod eklemişsin, bu da kod boyutunu neredeyse 10 misli artırmış :)

Onun yerine ekrana volümü yazdıran bir fonksiyon kullan

Kod: [Seç]
void write_volume(int volume) {
   lcd.print("Volume: ");
   lcd.setCursor(8, 0);
   lcd.print(volume);
}

Benzer bir fonksiyonu bass, treble, mute için de yaz ve kullan.
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #34
Bir de volümü ekrana yazdırırken her değer için ayrı bir kod eklemişsin, bu da kod boyutunu neredeyse 10 misli artırmış :)

Onun yerine ekrana volümü yazdıran bir fonksiyon kullan

Kod: [Seç]
void write_volume(int volume) {
   lcd.print("Volume: ");
   lcd.setCursor(8, 0);
   lcd.print(volume);
}

Benzer bir fonksiyonu bass, treble, mute için de yaz ve kullan.
Fonksiyonu kullanayım kullanmasına da, volume artırdıkça ekranda değer azalacak, azalttıkça artacak. Çünkü entegrede volume sistemi ters.

Ynt: Dijital Ses Kontrolü

Yanıt #35
Kodun mevcut yapısında zaten loop sonuna mutlaka bir delay koyman lazım. Yoksa "volume up" butonuna bastığın anda volume çok hızlı bir şekilde maksimuma çıkar, "volume down" a basınca da hemen minimuma iner.

Ama sonraları daha ileri seviyede kod yazmaya başlayınca öyle sağa sola delay koymanın hiç de iyi bir fikir olmadığını göreceksin, çünkü işlemcinin eti ne budu ne, bir de sürekli sağda solda delay yapıyorsa, vaktinin çoğunu aylak geçiriyor olacak. O yüzden güzel bir debounce kodu koyup, hem butonun basıldığını hem de bırakıldığını algılamak ve ona göre işlem yapmak lazım.
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #36
Kodun mevcut yapısında zaten loop sonuna mutlaka bir delay koyman lazım. Yoksa "volume up" butonuna bastığın anda volume çok hızlı bir şekilde maksimuma çıkar, "volume down" a basınca da hemen minimuma iner.

Ama sonraları daha ileri seviyede kod yazmaya başlayınca öyle sağa sola delay koymanın hiç de iyi bir fikir olmadığını göreceksin, çünkü işlemcinin eti ne budu ne, bir de sürekli sağda solda delay yapıyorsa, vaktinin çoğunu aylak geçiriyor olacak. O yüzden güzel bir debounce kodu koyup, hem butonun basıldığını hem de bırakıldığını algılamak ve ona göre işlem yapmak lazım.
Volume kodu için önerinizi uyguladım, loop sonuna delay koydum, ancak LCD için verdiğiniz fonksiyonu eklemedim, çünkü entegrenin volume sistemi ters olduğu için volume artırdığım zaman ekranda azalıyormuş gibi görünecek, volume azaltınca da tam tersi olacak.

Ynt: Dijital Ses Kontrolü

Yanıt #37
O zaman fonksiyon, kullanıcının hoşuna gidecek şekilde görüntülesin. Mesela 0 - 10 arası volüm görmesini istiyorsan:

Kod: [Seç]
void display_volume(int volume) {
   int dvol = map(volume, 63, 0, 0, 10);
   lcd.print("Volume: ");
   lcd.setCursor(8, 0);
   lcd.print(dvol);
}

Buradaki map fonksiyonu ile ilgili ve diğer bütün arduino kütüphaneleri ile ilgili dokümanları şuradan oku:

https://www.arduino.cc/reference/en/
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #38
Şu şekilde yazdım.
Kod: [Seç]
void display_volume(int volume) {
  int lcdvolume = map(volume, 60, 0, 0, 60);
  lcd.setCursor(0,0);
  lcd.print("Volume: ");
  lcd.setCursor(8,0);
  lcd.print(lcdvolume);
}
0'dan 60'a kadar detaylı bir biçimde görüntülesin istiyordum :)
Bu arada 426 satır kod 249 satıra düştü :D
Ama diğer değişkenler için bunu yapamam gibi duruyor.

Ynt: Dijital Ses Kontrolü

Yanıt #39
Ama diğer değişkenler için bunu yapamam gibi duruyor.

Yapaman diye birşey yok :) Bu kadar ipucu yeter. Geri kalanını artık kendin araştırman lazım. Dediğim kütüphane dokümanlarını oku. O kodun 50 satırdan çok daha aza inmesi lazım, indirene kadar uğraş  :P
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #40
@taydin
Hocam baskı devrenin üstünde pull-up direnci olmasına gerek var mı? Değeri 5.6K olsa olur mu?

Ynt: Dijital Ses Kontrolü

Yanıt #41
Nerede? Hangi sinyalden bahsediyorsun? Bazı yerlerde pull up mutlaka gereklidir, bazı yerlerde gerekli değildir.
Elektrik sayacı döndürücüsü ...


Ynt: Dijital Ses Kontrolü

Yanıt #43
I2C sinyallerinin tamamının pull up yapılması lazım. Ama arduino'daki işlemci at328p nin içinde yazılımla yapılandırılabilen pull up lar var zaten, ve kullandığın lcd kütüphanesi de bunları yapılandırıyordur. O yüzden birşey bağlamana gerek yok.

Ama arduino I2C sinyallerini standard 5V ile çalışan arduino shield yerine başka voltajla çalışan bir dijital devreye bağlıyorsan o zaman sorun çıkar. Bu durumda kütüphanenin kaynak kodunu değiştirmen lazım. Dahili pull up ları devre dışı bırakıp harici pull up direnç bağlaman lazım.

Değer olarak 2.2 KΩ ile başlayabilirsin, ama uygun değer belirlemek için osiloskop ile kare dalganın yükselme zamanına bakman lazım (rise time). Standardın öngördüğü yükselme zamanını elde edene kadar direncin değeri ile oynaman lazım. 100 KHz'de çok sorun çıkmaz, ama I2C nin bir de 400 KHz modu var, onda timing'ler daha kritik.
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #44
I2C sinyallerinin tamamının pull up yapılması lazım. Ama arduino'daki işlemci at328p nin içinde yazılımla yapılandırılabilen pull up lar var zaten, ve kullandığın lcd kütüphanesi de bunları yapılandırıyordur. O yüzden birşey bağlamana gerek yok.

Ama arduino I2C sinyallerini standard 5V ile çalışan arduino shield yerine başka voltajla çalışan bir dijital devreye bağlıyorsan o zaman sorun çıkar. Bu durumda kütüphanenin kaynak kodunu değiştirmen lazım. Dahili pull up ları devre dışı bırakıp harici pull up direnç bağlaman lazım.

Değer olarak 2.2 KΩ ile başlayabilirsin, ama uygun değer belirlemek için osiloskop ile kare dalganın yükselme zamanına bakman lazım (rise time). Standardın öngördüğü yükselme zamanını elde edene kadar direncin değeri ile oynaman lazım. 100 KHz'de çok sorun çıkmaz, ama I2C nin bir de 400 KHz modu var, onda timing'ler daha kritik.
Hocam TDA7315 devresi 9V ile çalışıyor, bu durumda direnç bağlamam lazım değil mi?
Bir de, direnci hem SDA hem de SCL pinlerine bağlıyorum, değil mi?

Ynt: Dijital Ses Kontrolü

Yanıt #45
Hocam TDA7315 devresi 9V ile çalışıyor, bu durumda direnç bağlamam lazım değil mi?
Bir de, direnci hem SDA hem de SCL pinlerine bağlıyorum, değil mi?

Evet pull-up hem SDA hemde SCL bağlanıyor. 
I2C protokolün'de kullanılan Serial Clock frekansına göre standartlamış Direnc değerleride şöyledir.

1- STANDART MOD  - 100KHZ - (5K-10K) OHM DİRENC.
2- HIZLI MOD - 400KHZ - (2K-5K) OHM DİRENC.
3-YÜKSEK HIZLI MOD - 3.4 MHZ - (1K ) OHM DİRENC.

Ayrıca I2C protokolü 4 adet hız aralıklarına sahiptir.

-100 kbit/s
-400 kbit/s
-1 mbit/s
-3,2 Mbit/s 

Sen standart mod kullandığın için. 5k-10k ohm arası direnc atman lazım ben genellikle 10k ohm atıyorum.

 ayrıca Proteusta I2C test edebilirsin verilen nasıl gittiğine bakabilirsin. illa entegreyi beklemene gerek yok. ayrıca özelden bana attığın kodda da mantık hatası vardı şimdi hazır interneti bulmuşken yazayım.

Mesela şurası ilk dikkatimi ceken yer oldu ;

  if (VolumeUp == HIGH && volume < 0) { 
   volume--;
  } else if (VolumeUp == HIGH && volume == 0) {

    volume = 0;

  }
Volume arttırma tuşuna basılmışsa ve volume değeri sıfırdan kücükse ( ki volume değeri 0 dan kücük olamaz ) volumeyi azalt demişsin burda 2 hata var volumei azalatmak yerin arttırman lazım ve    volume < 60 dan demen lazımdı ( yani volume < MAX_VALUE_VOLUM )
Demen gerekiyordu.

buraları tekrar gözden gecirip düzelt.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #46
Datasheet'e bakarsak, lojik 1 ve 0 seviyelerinin 5V besleme voltajına uyumlu olduğunu görüyoruz. Bu durumda bu entegre, arduino tarafından hiçbir pull up'a gerek kalmadan sürülebilir.

X
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #47
@taydin @Furkan41
Hocam kodu düzenledim, volume artırma azaltma işlemi yapılırken aynı zamanda LCD'deki değer de değişecek, map fonksiyonunu kaldırdım yani :)
Ancak sorun LCD veya LCD'nin kodlarında değil.
Sorun, butonlara bastığım zaman hiçbir değerin değişmemesi.
Seri Port Ekranı açıp, butonlara basıyorum. Ancak hiçbir değerde değişim yok.
Bu sebepten dolayı sorunum LCD'nin kodları değil, değerlerin değişmemesi.
Kod: [Seç]
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

byte volume = 30;
byte leftmute = 128;
byte rightmute = 160;
byte loud = 68;
byte bass = 111;
byte treble = 127;

int VolumeUp = 2;
int VolumeDown = 3;
int Mute = 4;
int Loudness = 5;
int BassUp = 6;
int BassDown = 7;
int TrebleUp = 8;
int TrebleDown = 9;
int lcdvolume = 30;

void SendData(byte data) {
  Wire.beginTransmission(128);
  Wire.write(data);
  Wire.endTransmission();
}

void setup() {

  pinMode(VolumeUp, INPUT);
  pinMode(VolumeDown, INPUT);
  pinMode(Mute, INPUT);
  pinMode(Loudness, INPUT);
  pinMode(BassUp, INPUT);
  pinMode(BassDown, INPUT);
  pinMode(TrebleUp, INPUT);
  pinMode(TrebleDown, INPUT);
 
  Serial.begin(9600);
 
  Wire.begin();
  Wire.setClock(100000);
  Wire.beginTransmission(128);
  Wire.write(volume);
  Wire.write(leftmute);
  Wire.write(rightmute);
  Wire.write(loud);
  Wire.write(bass);
  Wire.write(treble);
  Wire.endTransmission();
 
  lcd.begin();
  lcd.setCursor(0,0);
  lcd.print("H_SerhatY DSP v1.0");
  lcd.setCursor(0,1);
  lcd.print("Volume, Mute, Bass,");
  lcd.setCursor(0,2);
  lcd.print("Treble and Loudness");
  lcd.setCursor(5,3);
  lcd.print("Controller");
  delay(1000);
  lcd.clear();
}

void loop() {
 
  Serial.println(volume);
  Serial.println(leftmute);
  Serial.println(rightmute);
  Serial.println(loud);
  Serial.println(bass);
  Serial.println(treble);
 
  if (VolumeUp == HIGH) {
    if (volume > 0) {
      volume--;
      lcdvolume++;
    }
  }
  if (VolumeDown == HIGH) {
    if (volume < 60) {
      volume++;
      lcdvolume--;
    }
  }
   
  if (Mute == HIGH) {
    leftmute = 159;
    rightmute = 191;
  } else {
    leftmute = 128;
    rightmute = 160;
  }
 
  if (Loudness == HIGH) {
    loud = 64;
  } else {
    loud = 68;
  }
 
  if (BassUp == HIGH && bass == 104) {
    bass = 104;
  } else if (BassUp == HIGH && bass <= 111 && bass >= 104) {
    bass--;
  } else if (BassUp == HIGH && bass == 102) {
    bass + 9;
  } else if (BassUp == HIGH && bass <= 102 && bass >= 96) {
    bass++;
  }
  if (BassDown == HIGH && bass == 96) {
    bass = 96;
  } else if (BassDown == HIGH && bass > 96 && bass <= 102) {
    bass--;
  } else if (BassDown == HIGH && bass == 111) {
    bass - 9;
  } else if (BassDown == HIGH && bass <= 111 && bass >= 104) {
    bass++;
  }
 
 
 
  if (TrebleUp == HIGH && treble == 120) {
    treble = 120;
  } else if (TrebleUp == HIGH && treble <= 127 && treble >= 120) {
    treble--;
  } else if (TrebleUp == HIGH && treble == 118) {
    treble + 9;
  } else if (TrebleUp == HIGH && treble <= 118 && treble >= 112) {
    treble++;
  }
  if (TrebleDown == HIGH && treble == 112) {
    treble = 112;
  } else if (TrebleDown == HIGH && treble > 112 && treble <= 127) {
    treble--;
  } else if (TrebleDown == HIGH && treble == 127) {
    treble - 9;
  } else if (TrebleDown == HIGH && treble <= 127 && treble >= 120) {
    treble++;
  }
 
  SendData(volume);
  SendData(leftmute);
  SendData(rightmute);
  SendData(loud);
  SendData(bass);
  SendData(treble);
 
  lcd.setCursor(0,0);
  lcd.print("Volume = ");
  lcd.setCursor(9,0);
  lcd.print(lcdvolume);
 
  if (leftmute == 128 && rightmute == 160) {
    lcd.setCursor(0,3);
    lcd.print("Mute:0");
  } else if (leftmute == 159 && rightmute == 191) {
    lcd.setCursor(0,3);
    lcd.print("Mute:1");
  }
 
  if (loud == 68) {
    lcd.setCursor(10,3);
    lcd.print("Loudness:0");
  } else if (loud == 64) {
    lcd.setCursor(10,3);
    lcd.print("Loudness:1");
  }
 
  if (bass == 104) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +7");
  } else if (bass == 105) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +6");
  } else if (bass == 106) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +5");
  } else if (bass == 107) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +4");
  } else if (bass == 108) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +3");
  } else if (bass == 109) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +2");
  } else if (bass == 110) {
    lcd.setCursor(0,1);
    lcd.print("Bass = +1");
  } else if (bass == 111) {
    lcd.setCursor(0,1);
    lcd.print("Bass = 0");
  } else if (bass == 102) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -1");
  } else if (bass == 101) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -2");
  } else if (bass == 100) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -3");
  } else if (bass == 99) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -4");
  } else if (bass == 98) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -5");
  } else if (bass == 97) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -6");
  } else if (bass == 96) {
    lcd.setCursor(0,1);
    lcd.print("Bass = -7");
  }
 
  if (treble == 120) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +7");
  } else if (treble == 121) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +6");
  } else if (treble == 122) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +5");
  } else if (treble == 123) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +4");
  } else if (treble == 124) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +3");
  } else if (treble == 125) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +2");
  } else if (treble == 126) {
    lcd.setCursor(0,2);
    lcd.print("Treble = +1");
  } else if (treble == 127) {
    lcd.setCursor(0,2);
    lcd.print("Treble = 0");
  } else if (treble == 118) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -1");
  } else if (treble == 117) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -2");
  } else if (treble == 116) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -3");
  } else if (treble == 115) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -4");
  } else if (treble == 114) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -5");
  } else if (treble == 113) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -6");
  } else if (treble == 112) {
    lcd.setCursor(0,2);
    lcd.print("Treble = -7");
  }
 
  delay(500);
 
}

Ynt: Dijital Ses Kontrolü

Yanıt #48
Öncelikle dediğim gibi kodu basitleştirmen lazım. volume değişkeni ile ilgili gereksiz işlem yapıyorsun demiştim. Onu düzeltmişsin. Ama diğer değişkenler için aynı problem devam ediyor. Ayrıca treble ve bass kontrolünde her değer için ayrı if var. Bunları da düzelt.

Bir programda kesinlikle kaçınılması gereken birşey, aynı kodun kopyala yapıştır ile değişik yerlerde tekrar edilmesidir. Değişik yerlerde aynı iş yapılması gerekiyorsa, o işi bir fonksiyon haline getir ve o fonksiyonu çağır.

Birde volume ve lcdvolume diye iki ayrı değişken yapmışsın. Bu da çok yanlış birşey. Ses seviyesi bir tane ise, onun değişkeni de bir tane olmalı. Bu basit programda belki hataya sebep olmaz, ama daha karmaşık programlarda bir bugdan ötürü umulmadık bir şekilde bu iki değişken birbiri ile uyumsuz hale gelebilir. Birisi "volüm maksimumda" derken diğeri "volüm ortada" diyebilir. Daha önceki gibi tek değişken olsun ve bunu TDA'ya yazan fonksiyon ve ekrana yazan fonksiyon olsun (gerekli dönüşümleri yaptıktan sonra tabiki).
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #49
LCD ekran olarak hangi shield'i kullanıyorsun? Ben de orijinal arduino uno ve "LCD Keypad Shield" var. Bu LCD, paralel arabirime sahip. Ayrıca butonlar da dijital portlara değil, ACD'ye bağlı. Senin LCD herhalde seri arabirime sahip. Butonlar da muhtemelen dijital portlara bağlı olabilir. Yani senin kod benim arduino'da çalışmaz, benimki de senin arduino'da çalışmaz. O yüzden kodu basitleştir ki hata analizi kolay olsun. Dediğim gibi o kodun tamamının 50 satırdan aşağıya düşmesi lazım.

X
Elektrik sayacı döndürücüsü ...