pcbway

Dijital Ses Kontrolü

Başlatan H_SerhatY, 22 Haziran 2019, 22:17:17

H_SerhatY

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ı?

H_SerhatY


Furkan KELEŞOĞLU

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.

H_SerhatY

Alıntı yapılan: Furkan41 - 22 Haziran 2019, 23:50:11butona 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 :-[

Furkan KELEŞOĞLU

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.

H_SerhatY

Alıntı yapılan: Furkan41 - 23 Haziran 2019, 01:41:01https://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.

H_SerhatY

@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.

Furkan KELEŞOĞLU

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.

Furkan KELEŞOĞLU

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.

H_SerhatY

23 Haziran 2019, 19:15:55 #9 Son düzenlenme: 24 Haziran 2019, 18:59:21 H_SerhatY
@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:

Mr_YAMYAM

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.

H_SerhatY

24 Haziran 2019, 19:00:26 #11 Son düzenlenme: 24 Haziran 2019, 19:10:04 H_SerhatY
Alıntı yapılan: Mr_YAMYAM - 24 Haziran 2019, 18:37:10Datasheet 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.

Furkan KELEŞOĞLU

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.

H_SerhatY

24 Haziran 2019, 23:38:57 #13 Son düzenlenme: 24 Haziran 2019, 23:42:58 H_SerhatY
Alıntı yapılan: Furkan41 - 24 Haziran 2019, 23:11:49Evet 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?

H_SerhatY

25 Haziran 2019, 20:04:10 #14 Son düzenlenme: 26 Haziran 2019, 11:27:18 H_SerhatY
@Furkan41
Hocam kodu bitirdim.
Bir eksiklik, yanlışlık var ise düzeltmem adına yardımcı olursanız sevinirim.
#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ı:

Mr_YAMYAM

Alıntı yapılan: H_SerhatY - 25 Haziran 2019, 20:04:10@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.

H_SerhatY

Alıntı yapılan: Mr_YAMYAM - 26 Haziran 2019, 11:56:42BOUT (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.

Furkan KELEŞOĞLU

26 Haziran 2019, 14:48:22 #17 Son düzenlenme: 26 Haziran 2019, 15:09:32 Furkan41
Alıntı yapılan: H_SerhatY - 25 Haziran 2019, 20:04:10@Furkan41
Hocam kodu bitirdim.
Bir eksiklik, yanlışlık var ise düzeltmem adına yardımcı olursanız sevinirim.
#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.

Furkan KELEŞOĞLU

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.

H_SerhatY

Alıntı yapılan: Furkan41 - 26 Haziran 2019, 14:57:57Ve 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.

H_SerhatY

26 Haziran 2019, 15:43:08 #20 Son düzenlenme: 26 Haziran 2019, 16:17:02 H_SerhatY
...

Furkan KELEŞOĞLU

26 Haziran 2019, 16:11:24 #21 Son düzenlenme: 26 Haziran 2019, 16:12:06 Furkan41
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.

H_SerhatY

26 Haziran 2019, 16:14:13 #22 Son düzenlenme: 26 Haziran 2019, 16:17:52 H_SerhatY
Alıntı yapılan: Furkan41 - 26 Haziran 2019, 14:48:22son 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.
Alıntı yapılan: Furkan41 - 26 Haziran 2019, 16:11:24byte 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 :)

Furkan KELEŞOĞLU

Entegre varmı ? deneme yaparak mı gidiyorsun ?

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

H_SerhatY

Alıntı yapılan: Furkan41 - 26 Haziran 2019, 16:37:19Entegre 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.

Furkan KELEŞOĞLU

İyi bakalım hadi kolay gelsin.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

taydin

27 Haziran 2019, 00:23:40 #26 Son düzenlenme: 27 Haziran 2019, 00:26:10 taydin
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ü ...

taydin

27 Haziran 2019, 00:30:34 #27 Son düzenlenme: 27 Haziran 2019, 00:34:23 taydin
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ü ...

H_SerhatY

27 Haziran 2019, 02:13:29 #28 Son düzenlenme: 27 Haziran 2019, 02:18:33 H_SerhatY
Alıntı yapılan: taydin - 27 Haziran 2019, 00:23:40Hatalar 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 :)
Alıntı yapılan: taydin - 27 Haziran 2019, 00:30:34Ben 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.

taydin

Alıntı yapılan: H_SerhatY - 27 Haziran 2019, 02:13:29Hocam ç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.

Alıntı yapılan: H_SerhatY - 27 Haziran 2019, 02:13:29Hocam 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ü ...

H_SerhatY

27 Haziran 2019, 14:17:51 #30 Son düzenlenme: 28 Haziran 2019, 16:11:11 H_SerhatY
@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?
#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");
  }
 
}

taydin

Ö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.


byte volume = 0;

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

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

H_SerhatY

28 Haziran 2019, 16:41:48 #32 Son düzenlenme: 28 Haziran 2019, 16:45:14 H_SerhatY
Alıntı yapılan: taydin - 28 Haziran 2019, 16:36:10Ö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.


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ı?

taydin

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

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ü ...

H_SerhatY

Alıntı yapılan: taydin - 28 Haziran 2019, 16:43:35Bir 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

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.

taydin

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ü ...

H_SerhatY

Alıntı yapılan: taydin - 28 Haziran 2019, 16:50:11Kodun 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.

taydin

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

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ü ...

H_SerhatY

Şu şekilde yazdım.
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.

taydin

Alıntı yapılan: H_SerhatY - 28 Haziran 2019, 17:13:30Ama 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ü ...

H_SerhatY

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

taydin

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

H_SerhatY

Alıntı yapılan: taydin - 28 Haziran 2019, 17:42:24Nerede? Hangi sinyalden bahsediyorsun? Bazı yerlerde pull up mutlaka gereklidir, bazı yerlerde gerekli değildir.
I2C bağlantısından bahsediyorum :)

taydin

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ü ...

H_SerhatY

28 Haziran 2019, 19:14:01 #44 Son düzenlenme: 28 Haziran 2019, 19:16:04 H_SerhatY
Alıntı yapılan: taydin - 28 Haziran 2019, 18:38:30I2C 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?

Furkan KELEŞOĞLU

Alıntı yapılan: H_SerhatY - 28 Haziran 2019, 19:14:01Hocam 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.

taydin

28 Haziran 2019, 20:07:59 #46 Son düzenlenme: 28 Haziran 2019, 20:09:12 taydin
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.

[attach type=image]12277[/attach]
Elektrik sayacı döndürücüsü ...

H_SerhatY

30 Haziran 2019, 16:52:47 #47 Son düzenlenme: 30 Haziran 2019, 17:42:49 H_SerhatY
@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.
#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);
 
}

taydin

Ö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ü ...

taydin

30 Haziran 2019, 20:13:55 #49 Son düzenlenme: 30 Haziran 2019, 20:14:35 taydin
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.

[attach type=image]12279[/attach]
Elektrik sayacı döndürücüsü ...

taydin

Alıntı yapılan: Furkan41 - 28 Haziran 2019, 19:47:03I2C protokolün'de kullanılan Serial Clock frekansına göre standartlamış Direnc değerleride şöyledir.

 

Pull up dirençlerinin belirlenmesinde esas etken, pulse'ların yükselme süresidir (rise time) Furkan. Burada da belirleyici olan, I2C bus'taki kaçak kapasitedir. Şöyle bir örnek vereyim: Bir I2C master'a bir I2C slave bağlı ise, kaçak kapasiteler düşüktür, yüksek değerli pull up konulabilir. Ama diyelim bir I2C master'a 8 tane I2C slave bağlı ise, kaçak kapasite oldukça yüksektir ve oldukça düşük değerli bir pull up gerekir.

Düşük değerli pull up kullanırsan, I2C nin çalışması garantidir. Güç tüketimini azaltmak için pull up değerini yükseltirsin, ama işte burada I2C bus kaçak kapasitesi belirleyicidir.
Elektrik sayacı döndürücüsü ...

H_SerhatY

30 Haziran 2019, 20:25:53 #51 Son düzenlenme: 30 Haziran 2019, 20:34:23 H_SerhatY
Alıntı yapılan: taydin - 30 Haziran 2019, 20:05:24Ö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).
Kodu basitleştirmek mümkün tabii ki, ancak 50 satırdan aşağıya düşmesi mümkün değil zira zaten değişkenleri tanımladığım kısım ile setup kısmının toplamı 50 satırdan fazla. Setup kısmındaki herhangi bir şeyi çıkaramayacağıma göre(başlangıçta gelen yazı çıkarılabilir ama estetik benim için önemli) zaten kod doğal olarak 50 satırdan uzun oluyor.

Hocam siz LCD'de volume göstermek için bir fonksiyon yazmıştınız, onu kullandığım zaman ekranda hiçbir şey görünmüyor ancak bu şekilde ekranda volume görünüyor.
Yanlız meselemiz LCD falan değil, butonlara bastığım zaman byte olarak tanımladığım değişkenlerde herhangi bir hareketlilik yok.

LCD fonksiyonları vs. halledilir ama şu anki durumu düzeltmek için yardıma ihtiyacım var, zira önceden de belirttiğim gibi hayatımda ilk defa kod yazdım. Tabii ki ilk defadan kastım kendi oluşturduğum kodlar olarak, yoksa daha önceden Java'da basit bir şeyler yazıyordum, ancak internetten vs. bakarak yaptığım şeylerdi.

Ayrıca şu an kurulu olan sistemi sormuşsunuz, bendeki Arduino CH340 USB-Seri dönüştürücülü klon bir model, butonlar dijital pinlere bağlı, ve LCD olarak 4x20 LCD kullanıyorum, üstünde I2C dönüştürücü var, I2C olarak kullanmamın sebebi zaten hali hazırda 8 adet dijital pini butonların kullanıyor olması.

taydin

Programlama işini öğrenmek için başından beri doğru alışkanlıkları ve disiplini kazanmak önemlidir Serhat. Ben seni bu doğrultuda yönlendirirken, sen "Boşver disiplini, doğru alışkanlıkları, bu kod olduğu şekilde çalışsın" diyorsan, o konuda yardımcı olamayacağım malesef. Benim ipuçlarını vermem lazım, senin kendi çabanla sonuca gitmen lazım. Bu iş böyledir.
Elektrik sayacı döndürücüsü ...

H_SerhatY

Alıntı yapılan: taydin - 30 Haziran 2019, 20:51:38Programlama işini öğrenmek için başından beri doğru alışkanlıkları ve disiplini kazanmak önemlidir Serhat. Ben seni bu doğrultuda yönlendirirken, sen "Boşver disiplini, doğru alışkanlıkları, bu kod olduğu şekilde çalışsın" diyorsan, o konuda yardımcı olamayacağım malesef. Benim ipuçlarını vermem lazım, senin kendi çabanla sonuca gitmen lazım. Bu iş böyledir.
Hocam ben LCD düzenini halletmeyeceğim demedim ki. Ben sadece önce bu sorunu halletmeliyim dedim. Ayrıca kodu dikkatlice incelerseniz zaten sadece değişken tanımı ve setup kısmı 50 satırdan daha uzun, benim buradaki herhangi bir fonksiyonu çıkarmam mümkün değil.
Zaten ben niye bu işe bulaştım ki.
Neyse, zaten Arduino'yu çöpe atacağım, bu tip şeyler benim gibi birisi için fazla.

taydin

Diyelim bir arabayı tamir ediyorsun. Arabanın genel görünüşü iyi, ama motoru yok, 4 yerine 8 tekerlek takılmış, fren hidroliği boşaltılmış. Burada önce neyi düzeltmek lazım?

Yeni multimedya sistemi, klima, falan mı takmak lazım? Wax cila mı atmak lazım? Bunlar keyifli işler tabi, insan önce bunları yapmak istiyor. Ayrıca bunları yapınca gösterilecek birşey de oluyor ortada.

Yoksa temel yapısal sorunları mı çözmek lazım? Bunlar angarya işler, çünkü kimse senin bunları ne kadar iyi yaptığını görüp takdir etmeyecek. Ama iyi bir ürünü de gerçekten iyi yapan da bunlar.

Eğer bu işi öğrenmek için giriştiysen bu projeye, vaktini ayır, emek ver ve hakkıyla yapmaya çalış. Derinlemesine bilgi böyle öğrenilir.

Ama hemen birşey ortaya çıksın, arkadaşlara hava atayım diyorsan, internette araştır, birisi kesin hazır bir kod yazmıştır. Hemen yükle elindeki karta ve kullan. Ama sonra da birşeyler öğrendim deme.
Elektrik sayacı döndürücüsü ...

H_SerhatY

Bana yardım eden, etmeyen herkese çok teşekkür ederim.
En basit olayı atlayınca hiçbir şeyin çalışmaması gibi bir durum açığa çıkabiliyor.
digitalReadBu da insanın canını sıkıyor tabii.
Aşağıya dosyaları bırakıyorum. İsteyen kullansın.
Yanlız daha önceden Arduino'nun EEPROM'una hiçbir şey yazılmamış olması lazım.
Önce zip dosyası içindeki EEPROM Setup kodunu Arduino'ya yükleyin.
LCD üzerinde "EEPROM Setup is Completed." diye bir yazı gelecek.
Sonrasında normal kodu Arduino'nun içine atın.
EEPROM ömrünü uzatmak adına sadece değişkenler EEPROM'daki değerden farklı olunca EEPROM'a yazma yapıyor, böylece daha uzun ömürlü çalışabiliyor.
Ha bir de, LCD kütüphanesi de dosyanın içinde.

Furkan KELEŞOĞLU

Ne oldu serhat yine efkarlanmissin kodun mu calismiyor.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

taydin

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

H_SerhatY

Alıntı yapılan: taydin - 03 Temmuz 2019, 15:33:39Evet Serhat arada bir bu moda gidiyor anlaşılan :) Bana da kızmış, ama canı sağolsun. Gene elimden geldiği kadar yardım ederim, ama öyle "birisi şu benim çalışmayan kodu alsın baksın, bütün hataların listesini versin bana, ben de liste üzerinden geçip hepsini düzelteyim" yok. Kendisi biraz sürünecek, kendi yapacak ve kendi öğrenecek. Robot gibi, "şu satırdaki şunu değiştir, şu satırları ilave et" yok.

Doğrusunun bu olduğunu o da anlayacak ileriki meslek hayatında. Anlamasa da yapacak birşey yok, neticede burada bizler bunu bir karşılık beklediğimizden yapmıyoruz. Amaç iyi mühendislerin yetişmesi için bizim de bir katkımız olsun, yani vatana hizmet.
Hocam paylaştığım kod çalışıyor, ve şu an 1.1 sürümüne yükseldi :)
Uzaktan kumanda ile kontrol imkanı sağladım.
Mute ve Loudness aktivitelerinin EEPROM'a kaydı gereksiz olduğundan dolayı(bence) onları artık kaydetmiyorum.
Tabii ben uzaktan kumanda özelliği ekledikten sonra kod 8kB değil 15kB oldu :)

Furkan KELEŞOĞLU

Alıntı yapılan: H_SerhatY - 04 Temmuz 2019, 10:36:59Hocam paylaştığım kod çalışıyor, ve şu an 1.1 sürümüne yükseldi :)
Uzaktan kumanda ile kontrol imkanı sağladım.
Mute ve Loudness aktivitelerinin EEPROM'a kaydı gereksiz olduğundan dolayı(bence) onları artık kaydetmiyorum.
Tabii ben uzaktan kumanda özelliği ekledikten sonra kod 8kB değil 15kB oldu :)

Devreyi yaptıysan bir calışma videosu atta keyifle izleyelim
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

H_SerhatY

Alıntı yapılan: Furkan41 - 04 Temmuz 2019, 14:19:39Devreyi yaptıysan bir calışma videosu atta keyifle izleyelim
Hocam TDA7315'i bekliyorum. Aliexpress üzerinden aldım, geldiği zaman dinleyeceğiz. Ama sistemin çalıştığını gösteren bir video çektim. Onu atabilirim isterseniz.