#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>
// Pin untuk ILI9341
#define TFT_CS 5
#define TFT_RST 4
#define TFT_DC 2
#define TFT_MOSI 23
#define TFT_SCLK 18
// Pin untuk potensiometer
#define POT_PIN 34
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
void setup() {
Serial.begin(115200);
// Inisialisasi SPI dengan pin yang ditentukan
SPI.begin(TFT_SCLK, -1, TFT_MOSI, TFT_CS);
// Inisialisasi ILI9341
tft.begin();
tft.setRotation(1); // Mode lanskap
tft.fillScreen(ILI9341_BLACK);
// Gambar setengah lingkaran
drawHalfCircle();
}
void loop() {
// Baca nilai potensiometer
int potValue = analogRead(POT_PIN);
// Konversi nilai potensiometer ke derajat (0-180)
int angle = map(potValue, 0, 4095, 0, 180);
// Gambar jarum penunjuk
drawNeedle(angle);
// Tunggu sebentar sebelum membaca nilai lagi
delay(100);
}
void drawHalfCircle() {
// Gambar setengah lingkaran busur derajat dari pojok ke pojok
int centerX = 155; // Pusat horizontal layar
int centerY = 185; // Pusat vertikal layar (di bagian bawah)
int radius = 150; // Radius setengah lingkaran
for (int i = 0; i <= 180; i += 10) {
float angle = i * PI / 180;
int x1 = centerX + radius * cos(angle);
int y1 = centerY - radius * sin(angle);
int x2 = centerX + (radius + 10) * cos(angle);
int y2 = centerY - (radius + 10) * sin(angle);
tft.drawLine(x1, y1, x2, y2, ILI9341_WHITE);
// Gambar angka setiap 30 derajat
if (i % 30 == 0) {
int x = centerX + (radius - 20) * cos(angle);
int y = centerY - (radius - 20) * sin(angle);
tft.setCursor(x - 10, y - 14);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2); // Ubah ukuran teks untuk memperbesar
tft.print(i);
}
}
}
void drawNeedle(int angle) {
// Hapus jarum sebelumnya dengan menggambar ulang jarum dengan warna latar belakang
static int lastX = 0, lastY = 0;
int centerX = 155; // Pusat horizontal layar
int centerY = 185; // Pusat vertikal layar (di bagian bawah)
int radius = 100; // Panjang jarum
if (lastX != 0 && lastY != 0) {
for (int i = -1; i <= 1; i++) {
tft.drawLine(centerX + i, centerY, lastX + i, lastY, ILI9341_BLACK);
}
}
// Gambar jarum penunjuk baru
float radian = angle * PI / 180;
int x = centerX + radius * cos(radian);
int y = centerY - radius * sin(radian);
// Tambahkan offset kecil pada posisi 0 dan 180 derajat
if (angle == 0) {
x += 2;
} else if (angle == 180) {
x -= 2;
}
for (int i = -1; i <= 1; i++) {
tft.drawLine(centerX + i, centerY, x + i, y, ILI9341_RED);
}
// Gambar bulatan merah di titik tumpuan jarum
tft.fillCircle(centerX, centerY, 5, ILI9341_RED);
// Simpan posisi jarum saat ini untuk dihapus pada iterasi berikutnya
lastX = x;
lastY = y;
}