Arduino LCD Vu-Meter Yapalım!
Merhabalar arkadaşlar bugün sizlerde arduino vu-metre yapacağız ancak bu vu meter sıradan bi vu meter olmayacak lcd ile yapacağız çok daha güzel ve sıradışı bir şey olacak Şimdi lafı fazlaca uzatmadan malzeme listemizi görelim ve malzemelerimizi tanıyalım..
- Arduino Uno/Nano/Mega
- 100K ohm Direnç
- 22K ohm Direnç
- 1K Direnç
- 10K Potansiyometre
- 100nF Kapasitör
- 16×2 LCD
- Kulaklık giriş jakı isteğe bağlı.
Şimdi Bağlantılarımızı görselde ki gibi yapalım.

Şimdi bağlantılarımızı yaptığımıza göre kodlama aşamasına geçebiliriz.
Şimdi Kütüphanemizi ekliyelim.
Taslak>library ekle>Library düzenle-Tıklayıp Arama penceresine “LiquidCrystal” yazalım. Ve ilk çıkan adafruit libini kuralım.

Sonra ekrandaki tüm kodları silip aşağıdaki kodu yapıştıralım.
Arduino LCD Vu-Meter Kodlama
#include <LiquidCrystal.h>
byte Bar[8] = {
B11111,
B00000,
B11111,
B11111,
B11111,
B11111,
B00000,
B11111
};
byte L[8] = {
B00111,
B01000,
B10100,
B10100,
B10100,
B10111,
B01000,
B00111
};
byte R[8] = {
B00111,
B01000,
B10110,
B10101,
B10110,
B10101,
B01000,
B00111
};
byte EndMark[8] = {
B10000,
B01000,
B00100,
B00100,
B00100,
B00100,
B01000,
B10000
};
byte EmptyBar[8] = {
B11111,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111
};
byte peakHoldChar[8] = {
B11111,
B00000,
B01110,
B01110,
B01110,
B01110,
B00000,
B11111
};
String main_version = "1.0";
int left, right; //Bu değişkenle sağ ve sol kanaldan gelen sesleri ölçülendiriyoruz
const int numReadings = 5; //Yenileme oranı. Default oran 5 tir ama dilerseniz artırıp azaltabilirsiniz.
int indexL = 0; //sol kanal değerimiz
int totalL = 0; //sol kanal toplam değerimiz
int maxL = 0; //max değerimizin kayıt edildiği yer
int indexR = 0;
int totalR = 0;
int maxR = 0;
int inputPinL = A1; //sol kanal adc 1
int inputPinR = A0; //sağ kanal adc 2
int volL = 0;
int volR = 0;
int rightAvg = 0;
int leftAvg = 0;
long peakHoldTime = 1500; //peak değer gecikmesi
long peakHold = 0;
int rightPeak = 0;
int leftPeak = 0;
long decayTime = 0;
long actualMillis = 0;
LiquidCrystal lcd(11, 10, 7, 6, 5, 4); //lcd ekran ayarımız
void setup()
{
lcd.begin(40, 2); //ekran şablonumuz
lcd.createChar(1, Bar);
lcd.createChar(2, L);
lcd.createChar(3, R);
lcd.createChar(4, EmptyBar);
lcd.createChar(5, EndMark);
lcd.createChar(6, peakHoldChar);
//İlk mesajımız
String EAtolyem = "Elektronik Atolyem";
for (int i = 0; i <= 16; i++)
{
lcd.setCursor(0, 0);
lcd.print(EAtolyem.substring(0, i));
delay(50);
}
EAtolyem = "VU metre " + main_version;
for (int i = 0; i <= EAtolyem.length(); i++)
{
lcd.setCursor(0, 1);
lcd.print(EAtolyem.substring(0, i));
delay(50);
}
delay(500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Aciliyor...");
for (int i = 0; i < 16; i++)
{
lcd.setCursor(i, 1);
lcd.write(4);
}
for (int i = 0; i < 16; i++)
{
lcd.setCursor(i, 1);
lcd.write(1);
delay(50);
}
delay(500);
lcd.clear();
decayTime = millis();
}
void loop()
{
actualMillis = millis();
lcd.setCursor(0, 0); //sol kanal barı
lcd.write(2); //saol kanal sembolü
lcd.setCursor(0, 1); //sağ kanal barı
lcd.write(3); //sağ kanal sembolu
lcd.setCursor(15, 0); //bar sonu
lcd.write(5); //bar sonu
lcd.setCursor(15, 1); //bar sonu
lcd.write(5); //bar sonu
totalL = analogRead(inputPinL) / 4 - 128; //Sol kanal Gürültü seviyesini temizleyelim
if(totalL > maxL)
{
maxL = totalL;
}
indexL++;
if (indexL >= numReadings)
{
indexL = 0;
left = maxL;
maxL = 0;
}
totalR = analogRead(inputPinR) / 4 - 128; //sağ kanal Gürültü seviyesini temizleyelim
if(totalR > maxR)
{
maxR = totalR;
}
indexR++;
if (indexR >= numReadings)
{
indexR = 0;
right = maxR;
maxR = 0;
}
volR = right / 3;
if(volR > 14)
{
volR = 14;
}
if (volR < (rightAvg - 2))
{
if (decayTime < actualMillis)
rightAvg--;
volR = rightAvg;
}
else if (volR > (rightAvg + 2))
{
volR = (rightAvg + 2);
rightAvg = volR;
}
else
{
rightAvg = volR;
}
if (volR > rightPeak)
{
rightPeak = volR;
}
drawBar(volR, rightPeak, 1);
volL = left / 3;
if(volL > 14)
{
volL = 14;
}
if (volL < (leftAvg - 2))
{
if (decayTime < actualMillis)
leftAvg--;
volL = leftAvg;
}
else if (volL > (leftAvg + 2))
{
volL = (leftAvg + 2);
leftAvg = volL;
}
else
{
leftAvg = volL;
}
if (volL > leftPeak)
{
leftPeak = volL;
}
drawBar(volL, leftPeak, 0);
if (decayTime < actualMillis)
decayTime = (millis() + 50);
if (peakHold < actualMillis)
{
peakHold = (millis() + peakHoldTime);
rightPeak = -1;
leftPeak = -1;
}
}
void drawBar(int data, int peakData, int row)
{
//Değeri aşmışsa dengeleyelim
if (peakData < 2)
{
peakData = -1;
}
for (int col = 1; col < 15; col++)
{
lcd.setCursor(col, row);
if (col < data)
{
lcd.write(1); //Bar a kutucuk atalım
}
else if (peakData == col)
{
lcd.write(6); //bar klavuzunu yazalım
}
else
{
lcd.write(4); //boşluk atalım
}
}
}
Şimdi Derleyelim ve bi müzik çalalım…
Projemizi Hazır ettik Devamı için Facebook ve İnstagramdan bizi Takip Etmeyi Unutmayın 🙂
https://www.instagram.com/elektronikatolyemm