/* Main.ino file generated by New Project wizard
Created: Wed Feb 21 2024
Processor: Arduino Nano
Compiler: Arduino AVR
*/
#include "SPI.h"
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define TFT_CS 10
#define TFT_DC 8
#define sampleWindow 20 // Ukuran jendela sampel
int InputPin = A0; // Pin Input Suara
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
const int hMeter = 160; // Koordinat horizontal titik pusat
const int vMeter = 175; // Koordinat vertikal titik pusat
const int rMeter = 180; // Panjang jarum meter
int a1_old = hMeter;
int a2_old = vMeter;
void setup() {
Serial.begin(9600);
tft.begin();
tft.setRotation(3); // Sesuaikan rotasi layar jika diperlukan
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(6);
char welcomeText[] = "WELCOME";
int textLength = sizeof(welcomeText) - 1;
for (int i = 0; i < textLength; i++) {
int xPosition = 45 + i * 35; // Mengatur posisi awal X untuk teks
tft.setCursor(xPosition, 80);
tft.print(welcomeText[i]);
delay(200);
}
for (int i = 0; i < textLength; i++) {
int xPosition = 45 + i * 35; // Mengatur posisi awal X untuk kotak hitam
tft.fillRect(xPosition, 80, 30, 45, ILI9341_BLACK); // Gambar kotak hitam di sekitar teks
delay(200);
}
//Gambar Segitiga jarum
int centerX = 160;
int centerY = 200;
// Menghitung titik-titik untuk segitiga
int x1 = centerX - 15; // Titik kiri dasar
int y1 = centerY + 5; // Titik kiri dasar
int x2 = centerX + 15; // Titik kanan dasar
int y2 = centerY + 5; // Titik kanan dasar
int x3 = centerX; // Titik puncak
int y3 = centerY - 5; // Titik puncak
tft.fillTriangle(x1, y1, x2, y2, x3, y3, ILI9341_RED);
}
void loop() {
jarumVUMeter();
}
// Gambar Jarum
void jarumVUMeter() {
unsigned long startMillis = millis();
unsigned int PeaktoPeak = 0;
unsigned int SignalMax = 0;
unsigned int SignalMin = 1024;
int sensorValue = analogRead(A0); // Ganti dengan nilai acak antara 0 dan 1023 (untuk simulasi)
sensorValue = constrain(sensorValue, 0, 1024);
if (sensorValue < 1024) {
if (sensorValue > SignalMax) {
SignalMax = sensorValue;
} else if (sensorValue < SignalMin) {
SignalMin = sensorValue;
}
}
//delayMicroseconds(500);
PeaktoPeak = SignalMax - SignalMin;
// Rentang sudut dalam derajat
float startAngle = 70.0; // Sudut awal jarum
float endAngle = 300.0; // Sudut akhir jarum
// Mapping nilai audio (0-1023) ke rentang sudut (30°-150°)
float MeterValue = map(PeaktoPeak, 0, 1023, startAngle, endAngle);
MeterValue = constrain(MeterValue, startAngle, endAngle);
MeterValue = fmod(MeterValue, 360.0); // Normalisasi ke 0-360°
//MeterValue = MeterValue - 360.0;
float angleRad = MeterValue * PI / 180.0; // PI = 3.14159
drawVUMeter();
int a1 = hMeter + (sin(angleRad) * rMeter);
int a2 = vMeter - (cos(angleRad) * rMeter);
// Menggambar jarum baru dengan posisi yang baru
tft.drawLine(a1, a2, hMeter, vMeter, ILI9341_RED);
tft.drawLine(a1, a2, hMeter + 1, vMeter, ILI9341_RED);
tft.drawLine(a1, a2, hMeter + 2, vMeter, ILI9341_RED);
tft.drawLine(a1, a2, hMeter + 3, vMeter, ILI9341_RED);
tft.drawLine(a1, a2, hMeter - 1, vMeter, ILI9341_RED);
tft.drawLine(a1, a2, hMeter - 2, vMeter, ILI9341_RED);
tft.drawLine(a1, a2, hMeter - 3, vMeter, ILI9341_RED);
delayMicroseconds(500);
// Hapus jarum lama dengan menggambar garis hitam
tft.drawLine(a1_old, a2_old, hMeter, vMeter, ILI9341_BLACK);
tft.drawLine(a1_old, a2_old, hMeter + 1, vMeter, ILI9341_BLACK);
tft.drawLine(a1_old, a2_old, hMeter + 2, vMeter, ILI9341_BLACK);
tft.drawLine(a1_old, a2_old, hMeter + 3, vMeter, ILI9341_BLACK);
tft.drawLine(a1_old, a2_old, hMeter - 1, vMeter, ILI9341_BLACK);
tft.drawLine(a1_old, a2_old, hMeter - 2, vMeter, ILI9341_BLACK);
tft.drawLine(a1_old, a2_old, hMeter - 3, vMeter, ILI9341_BLACK);
// Menyimpan posisi ujung jarum baru untuk digunakan pada frame berikutnya
a1_old = a1;
a2_old = a2;
Serial.print("Sinyal Audio : ");
Serial.println(sensorValue);
Serial.println("");
Serial.print("Sinyal Peak :");
Serial.println(PeaktoPeak);
Serial.println("");
Serial.print("Posisi Jarum :");
Serial.println(MeterValue);
}
// Menggambar VU METER
void drawVUMeter() {
tft.fillRect(15, 85, 295, 5, ILI9341_WHITE);
tft.fillRect(15, 93, 295, 3, ILI9341_WHITE);
tft.fillRect(170, 80, 140, 6, ILI9341_RED);
tft.fillRect(158, 96, 153, 4, ILI9341_RED);
tft.fillRect(15, 103, 140, 2, ILI9341_DARKGREY);
tft.setTextSize(6);
tft.setTextColor(ILI9341_WHITE);
tft.setCursor(128, 150);
tft.println("VU");
tft.setTextSize(2);
tft.fillRect(15, 65, 5, 23, ILI9341_WHITE);
tft.fillRect(15 + 11, 75, 2, 15, ILI9341_WHITE);
tft.fillRect(15 + 11 + 10, 75, 2, 15, ILI9341_WHITE);
tft.fillRect(15 + 11 + 10 + 10, 70, 3, 15, ILI9341_WHITE);
tft.fillRect(15 + 11 + 10 + 10 + 10, 75, 2, 15, ILI9341_WHITE);
tft.fillRect(15 + 11 + 10 + 10 + 10 + 10, 75, 2, 15, ILI9341_WHITE);
tft.setCursor(10, 50);
tft.println("20");
tft.setCursor(65, 50);
tft.fillRect(75, 65, 5, 23, ILI9341_WHITE);
tft.fillRect(75 + 13, 75, 2, 15, ILI9341_WHITE);
tft.fillRect(75 + 13 + 10, 75, 2, 15, ILI9341_WHITE);
tft.println("10");
tft.setCursor(105, 50);
tft.fillRect(108, 65, 5, 23, ILI9341_WHITE);
tft.fillRect(108 + 11, 75, 2, 15, ILI9341_WHITE);
tft.fillRect(108 + 11 + 10, 75, 2, 15, ILI9341_WHITE);
tft.println("5");
tft.setCursor(135, 50);
tft.fillRect(138, 65, 5, 23, ILI9341_WHITE);
tft.fillRect(138 + 10, 75, 2, 15, ILI9341_WHITE);
tft.fillRect(138 + 10 + 10, 75, 2, 15, ILI9341_WHITE);
tft.println("3");
tft.setTextColor(ILI9341_RED);
tft.fillRect(170, 65, 5, 21, ILI9341_RED);
tft.fillRect(170 + 8, 72, 2, 13, ILI9341_RED);
tft.fillRect(170 + 8 + 8, 72, 2, 13, ILI9341_RED);
tft.fillRect(170 + 8 + 8 + 8, 70, 2, 13, ILI9341_RED);
tft.fillRect(170 + 8 + 8 + 8 + 8, 72, 2, 13, ILI9341_RED);
tft.fillRect(170 + 8 + 8 + 8 + 8 + 8, 72, 2, 13, ILI9341_RED);
tft.setCursor(172, 50);
tft.println("0");
tft.setCursor(212, 50);
tft.fillRect(215, 65, 5, 21, ILI9341_RED);
tft.fillRect(216 + 8, 72, 2, 13, ILI9341_RED);
tft.fillRect(216 + 8 + 8, 72, 2, 13, ILI9341_RED);
tft.fillRect(216 + 8 + 8 + 8, 70, 2, 13, ILI9341_RED);
tft.fillRect(216 + 8 + 8 + 8 + 8, 72, 2, 13, ILI9341_RED);
tft.fillRect(216 + 8 + 8 + 8 + 8 + 8, 72, 2, 13, ILI9341_RED);
tft.println("1");
tft.setCursor(258, 50);
tft.fillRect(262, 65, 5, 21, ILI9341_RED);
tft.fillRect(262 + 8, 72, 2, 13, ILI9341_RED);
tft.fillRect(262 + 8 + 8, 72, 2, 13, ILI9341_RED);
tft.fillRect(262 + 8 + 8 + 8, 70, 2, 13, ILI9341_RED);
tft.fillRect(262 + 8 + 8 + 8 + 8, 72, 2, 13, ILI9341_RED);
tft.fillRect(262 + 8 + 8 + 8 + 8 + 8, 72, 2, 13, ILI9341_RED);
tft.println("2");
tft.setCursor(303, 50);
tft.fillRect(305, 65, 5, 21, ILI9341_RED);
tft.println("3");
tft.setCursor(290, 110);
tft.println("dB");
tft.setCursor(290, 35);
tft.setTextSize(1.5);
tft.println("PEAK");
tft.setTextColor(ILI9341_DARKGREY);
tft.setTextSize(2);
tft.setCursor(15, 115);
int xPos = 15;
for (int i = 0; i < 15; i++) {
tft.fillRect(xPos + i * 10, 103, 2, 10, ILI9341_DARKGREY);
}
tft.println("0");
tft.setCursor(65, 115);
tft.println("50");
tft.setCursor(135, 115);
tft.println("100");
tft.setCursor(10, 35);
tft.setTextSize(1.5);
tft.println("VALLEY");
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.setCursor(320 / 6, 210);
tft.println("by Z M R Elcotronic");
tft.setTextSize(2);
tft.setTextColor(ILI9341_WHITE);
tft.setCursor(15, 19);
tft.println("-");
tft.setTextColor(ILI9341_WHITE);
tft.setCursor(295, 19);
tft.println("+");
}