Arduino Basit Vu Metre

Arduino Uno kullanarak müziğe duyarlı LCD göstergeli basit bir vu metre yapalım.



Kullanılan malzemeler: 
Arduino Uno
I2C haberleşme modülü
16x2 LCD
Biraz jumper

Arduino Uno A0 ve A1 pinleri sağ ve sol kanal girişleri için kullanılıyor.
A0-GND , A1-GND şeklinde kullanın.

Arduino Uno A5 pinine  I2C LCD'nin SCL pini
Arduino Uno A4 pinine I2C LCD'nin SDA pini
I2C LCD'nin VCC(+5V) ve GND bağlantılarını unutmayın

Sistem A0 ve A1 analog girişlerinden alınan sinyalin işlenmesine dayanıyor. Sinyal büyüklüğüne göre LCD ekranındaki 2 satırı da sağ ve sol kanaların sinyal seviyesini yatay sütun olarak gösteriyoruz.

Devre basit olduğu için her iki kanalda gelen ses sinyali işlemesini aynı anda işleyip aynı anda göstermiyor. Bu durumu millis() fonksiyonu ile düzenleyip, görsel farkı en aza indirmeye çalıştım.

Ayrıca  map() fonksiyonunu kullandım.
      vu1=map(analog_deger1, 0, 1023, 0,64); 
      vu2=map(analog_deger2, 0, 1023, 0,64);
Burada A0-1girişlerinden aldığımız sinyalin seviyesi 0-1023, 64 rakamı yerinde 16 olması lazım, 16 rakamı LCD sütun sayısı, fakat 16 kullanınca vumetre duyarlılığı düşük oluyor, bende iki kat iki kat deneye deneye 64 sayısını buldum, mantıksal olarak ortaya çıkan değer LCD sütun sayısını çok aşıyor ama olay hızlı geliştiği için fark edilmiyor zaten.

Map fonksiyonu, 0-255 arası değerleri 0-1023 arasında ölçekler.
map(değer, a, b, x, y)    =>  Burada değer olarak giren sayı
a-b aralığından x-y aralığına ölçeklenir.

Devre deneysel olarak oynanabilir. Özellikle kendini geliştirmek isteyenler için.
Ben denemelerimde ses kaynağı olarak laptopu kullandım. vumetre göstergesinin düzgün göstermesi için sesi sonuna kadar açtım. Tavsiyem A0 ve A1 girişlerindeki sinyali yükseltmek için 1 transistörlü yükselteç (BC serisi) kullanmanız.
ARDUINO IDE KODLARI:


/*  kodlagitsin.blogspot.com
 *  Arduino Uno Basit Vu Metre
 *  Arduino Uno, I2C Haberleşme Modülü, 16x2 LCD
 */
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7);
int vu1 = 0;
int vu2 = 0;
int analog_deger1;
int analog_deger2;
int basla1=0;
int basla2=0;

// kanalların zaman kontrol değişkenleri:
unsigned long Zaman_1 = 1;  //ms
unsigned long Zaman_2 = 2;  //ms
unsigned long Zaman_3 = 251;  //ms
unsigned long Zaman_4 = 250;  //ms

unsigned long EskiZaman_1 = 0;
unsigned long EskiZaman_2 = 0;
unsigned long EskiZaman_3 = 0;
unsigned long EskiZaman_4 = 0;

void setup()
{
Serial.begin(9600);
    lcd.begin(16, 2);
    lcd.setBacklightPin(3,POSITIVE);
    lcd.setBacklight(HIGH);
}

void loop()
{
analog_deger1 = analogRead(A0);
  analog_deger2 = analogRead(A1); 

  vu1=map(analog_deger1, 0, 1023, 0,64); 
  vu2=map(analog_deger2, 0, 1023, 0,64);

 unsigned long SimdikiZaman = millis(); // zamanlayıcıyı oku
 
  //ZAMANI gelen GÖREVİ yap:

  // ----- GÖREV#1:
  if (SimdikiZaman - EskiZaman_1 >= Zaman_1)
  {
    EskiZaman_1 = SimdikiZaman;
    Gorev_1();
  }

  // ----- GÖREV#2:
  if (SimdikiZaman - EskiZaman_2 >= Zaman_2)
  {
    EskiZaman_2 = SimdikiZaman;
    Gorev_2();
  }
 
  // ----- GÖREV#3:
  if (SimdikiZaman - EskiZaman_3 >= Zaman_3)
  {
    EskiZaman_3 = SimdikiZaman;
    Gorev_3();
  }

   // ----- GÖREV#4:
  if (SimdikiZaman - EskiZaman_4 >= Zaman_4)
  {
    EskiZaman_4 = SimdikiZaman;
    Gorev_4();
  }
}
 //------------------------------------------------------------

 // GÖREV FONKSİYONLARI: 

  void Gorev_1(){
  while (basla1 < vu1) {   
    lcd.setCursor(basla1, 0);
    lcd.print(char(255));   
    basla1++; 
 }
  }
 
   void Gorev_2(){
   while (basla2 < vu2) {
   lcd.setCursor(basla2, 1);
   lcd.print(char(255));
   basla2++; 
 }
   }
 
   void Gorev_3(){
   while (basla1 > 0) {
   lcd.setCursor(basla1, 0);
   lcd.print(" ");
   basla1--;
 }
  }
  void Gorev_4(){
  while (basla2 > 0) {
  lcd.setCursor(basla2, 1);
  lcd.print(" ");
  basla2--;
 }
  }
 // -----------------------kod sonu--------------------

KULLANILAN PROGRAMLAYICI: Arduino 1.8.10  




Yorumlar