#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
// Pin untuk ILI9341
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
// Definisikan ukuran OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32 // Jika OLED Anda 128x64, ganti jadi 64
// Objek untuk TFT ILI9341
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
// Objek untuk OLED SSD1306
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
// Inisialisasi serial monitor
Serial.begin(9600);
// Inisialisasi TFT ILI9341
tft.begin();
tft.setRotation(1); // Mode landscape
tft.fillScreen(ILI9341_BLACK);
// Inisialisasi OLED SSD1306
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
delay(2000); // Delay untuk logo awal
display.clearDisplay();
// Tampilkan indikator awal pada kedua layar
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.setCursor(10, 10);
tft.print("Initializing...");
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Fuel: ");
display.display();
}
void loop() {
// Dummy data untuk display (ganti dengan sensor asli)
int speed = 60; // Kecepatan dalam km/jam
int rpm = 3500; // RPM
float temperature = 25.7; // Suhu dalam Celsius
float voltage = 12.8; // Tegangan baterai
int fuelLevel = 75; // Level bahan bakar dalam persen (0-100%)
float distance = 150.6; // Jarak yang sudah ditempuh dalam km
// Clear layar sebelum update
tft.fillScreen(ILI9341_BLACK);
// 1. RPM sebagai bar graph di sisi kiri
tft.fillRect(10, 20, 20, map(rpm, 0, 8000, 0, 200), ILI9341_GREEN);
tft.drawRect(10, 20, 20, 200, ILI9341_WHITE); // Bingkai bar
tft.setCursor(10, 230);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(1);
tft.print("RPM");
// 2. Speedometer di tengah (model seven-segment)
tft.setCursor(90, 100);
tft.setTextColor(ILI9341_YELLOW);
tft.setTextSize(6);
tft.print(speed); // Menampilkan kecepatan
// 3. Jarak tempuh di bawah speedometer
tft.setCursor(90, 160);
tft.setTextSize(2);
tft.setTextColor(ILI9341_WHITE);
tft.print("Dist: ");
tft.print(distance);
tft.print(" km");
// 4. Suhu di pojok kanan atas dengan simbol
tft.setCursor(190, 10);
tft.setTextSize(2);
tft.setTextColor(ILI9341_WHITE);
tft.print("Temp: ");
tft.print(temperature);
tft.print((char)247); // Simbol derajat
tft.print("C");
// 5. Voltmeter di pojok kanan bawah
tft.setCursor(190, 200);
tft.setTextSize(2);
tft.setTextColor(ILI9341_WHITE);
tft.print("Volt: ");
tft.print(voltage);
tft.print(" V");
// Update OLED SSD1306 untuk fuel meter
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Fuel: ");
display.print(fuelLevel);
display.print("%");
// Gambar fuel bar
display.drawRect(0, 10, 100, 10, SSD1306_WHITE); // Bingkai bar
display.fillRect(0, 10, map(fuelLevel, 0, 100, 0, 100), 10, SSD1306_WHITE);
// Simbol fuel dan empty
display.setCursor(105, 10);
display.print("F"); // Simbol Fuel (Full)
display.setCursor(105, 20);
display.print("E"); // Simbol Empty
display.display(); // Update OLED dengan data baru
delay(100000); // Update setiap 1 detik
}