#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>
// ===== TFT PIN =====
#define TFT_CS 5
#define TFT_DC 2
#define TFT_RST 4
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
// ======================================================
// CAT BITMAP
// ======================================================
// เอา bitmap จากเว็บมาวางแทนแค่ด้านใน {}
const unsigned char epd_bitmap_IMG_20260528_170938 [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00,
0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x08, 0x60,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40,
0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x20, 0x00, 0x00, 0x80, 0x20,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x04, 0x10, 0x00, 0x02, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x10,
0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x30,
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x0f, 0xff, 0xe4, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x06, 0x00, 0x0c, 0x00, 0x38, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00,
0x00, 0x10, 0x10, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20,
0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00,
0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x23, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x20, 0x30, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0x20,
0x00, 0x62, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x40, 0x00, 0x60, 0x20, 0x02,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0xc0, 0x00, 0x30, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00,
0x01, 0x80, 0x07, 0x00, 0xf0, 0x18, 0xc0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
0x70, 0x0f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x20, 0x00, 0x00, 0x06,
0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
0x02, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
0x60, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xa0, 0x00, 0x01, 0xff,
0xc0, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
0x01, 0xf0, 0x00, 0x06, 0x0e, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0x21, 0x00, 0x00,
0x04, 0x00, 0x01, 0x90, 0x00, 0x00, 0x11, 0x00, 0x04, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
0x00, 0x00, 0x31, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3e, 0x00, 0x00, 0x40, 0x60,
0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x61, 0x80, 0x00, 0x80, 0x20, 0x00, 0x60, 0x00, 0x00,
0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
0x00, 0x00, 0x30, 0x80, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x40,
0x02, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0,
0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1c, 0x60, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x60, 0x18, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x08,
0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x08, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x80, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x01, 0x80, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x80, 0x08,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x80, 0x08, 0x00, 0x01, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x01, 0x80, 0x10, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x20,
0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x01, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x02, 0x03, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x04, 0x00,
0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x0c, 0x00, 0x00, 0x01, 0x00, 0x44,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00,
0x18, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x8c, 0x00, 0x80, 0x00, 0x00, 0x1f, 0x00, 0x18, 0x00,
0x00, 0x18, 0x00, 0x90, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x20,
0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x03, 0x60, 0x02, 0x20, 0x00, 0x00,
0x00, 0x00, 0xc0, 0x00, 0x00, 0x20, 0x03, 0x40, 0x02, 0x40, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x00, 0x26, 0x42, 0x44, 0x02, 0x40, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x26, 0x42, 0x44,
0x84, 0x49, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x00, 0x00, 0x26, 0x46, 0x44, 0x84, 0x49, 0x00, 0x00,
0x3f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x2e, 0xc8, 0x49, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00,
0x00, 0x0f, 0xf8, 0x1f, 0xf0, 0x3f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// ======================================================
int loadValue = 64;
// ======================================================
void drawStaticUI() {
tft.fillScreen(ILI9341_BLACK);
// ===== กรอบหลัก =====
tft.drawRoundRect(
8,
8,
304,
224,
8,
ILI9341_GREEN
);
// ==================================================
// วาดแมว
// ==================================================
tft.drawBitmap(
22, // X
58, // Y
epd_bitmap_IMG_20260528_170938,
96,
96,
ILI9341_WHITE
);
}
// ======================================================
void updateValues() {
tft.setTextSize(2);
// ===== COOLANT =====
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.setCursor(140, 40);
tft.print("COOLANT 84C");
// ===== IAT =====
tft.setCursor(140, 75);
tft.print("IAT 41C");
// ===== LOAD =====
tft.setCursor(140, 110);
tft.print("LOAD ");
tft.setTextColor(ILI9341_CYAN, ILI9341_BLACK);
tft.print(loadValue);
tft.print("%");
// ===== MAF =====
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.setCursor(140, 145);
tft.print("MAF 14.9g/s");
// ==================================================
// LOAD BAR
// ==================================================
tft.drawRect(
20,
200,
270,
14,
ILI9341_WHITE
);
int barWidth = map(
loadValue,
0,
100,
0,
266
);
tft.fillRect(
22,
202,
barWidth,
10,
ILI9341_CYAN
);
}
// ======================================================
void setup() {
SPI.begin();
tft.begin();
// ===== แนวนอน =====
tft.setRotation(1);
drawStaticUI();
updateValues();
}
// ======================================================
void loop() {
static unsigned long lastUpdate = 0;
if (millis() - lastUpdate > 1200) {
lastUpdate = millis();
loadValue += 4;
if (loadValue > 100) {
loadValue = 20;
}
updateValues();
}
}