#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
// Твоя раскладка пинов
#define TFT_SCL 13
#define TFT_SDA 12
#define TFT_DC 14
#define TFT_RST 27
#define TFT_CS 26
// Инициализируем программный SPI (CS, DC, SDA, SCL, RST)
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_SDA, TFT_SCL, TFT_RST);
// Расширенная палитра цветов RGB565
uint16_t DK_BLACK = 0x0000;
uint16_t NEON_GREEN = 0x07E0;
uint16_t DK_GREEN = 0x0320;
uint16_t DK_GRAY = 0x39E7;
uint16_t PURE_WHITE = 0xFFFF;
uint16_t DEEP_RED = 0xF800;
uint16_t ORANGE_GLOW = 0xFC00;
// Глобальные переменные
float current_temp = 38.2; // Начальная фейковая температура
int history[100]; // Массив для графика
int plot_index = 0;
bool activity_bar_state = false;
// Рисуем стильную иконку пламени (упрощенно)
void drawFlame(int x, int y, uint16_t color) {
tft.fillTriangle(x+4, y+6, x+2, y+10, x+6, y+10, color); // Пламя
tft.fillRect(x+2, y+11, 4, 3, color); // Основание
}
void setup() {
tft.initR(INITR_BLACKTAB);
tft.setRotation(1);
tft.fillScreen(DK_BLACK);
// Инициализация массива графика
for(int i=0; i<100; i++) history[i] = random(30, 45);
// Отрисовка статической части интерфейса
tft.drawRect(0, 0, tft.width(), tft.height(), DK_GRAY);
// Шапка (как у тебя на фото, но чуть тоньше)
tft.setCursor(15, 10);
tft.setTextColor(NEON_GREEN);
tft.setTextSize(1);
tft.print("MONITOR SYSTEM v2.0");
tft.drawLine(10, 23, tft.width()-10, 23, DK_GRAY);
}
void loop() {
// --- Динамический заголовок ---
tft.setCursor(55, 30);
tft.setTextColor(DK_GRAY);
tft.print("CPU TEMP");
// --- Основной виджет ---
// Стираем старую цифру и иконку (локально)
tft.fillRect(20, 38, 120, 35, DK_BLACK);
// Иконка пламени
drawFlame(35, 48, ORANGE_GLOW);
// Крупная температура
tft.setCursor(65, 45);
tft.setTextColor(ORANGE_GLOW);
tft.setTextSize(3); // Размер для 'секси' эффекта
tft.print(current_temp, 1);
tft.print("C");
// --- Динамический график ---
// Стираем старый график
tft.fillRect(10, 75, 140, 40, DK_BLACK);
// Рисуем сетку
tft.drawRect(10, 75, 140, 40, DK_GRAY);
for(int y=85; y<110; y+=10) tft.drawLine(10, y, 150, y, 0x18E3); // Тонкие линии
// Отрисовка линии графика
for (int i=0; i<99; i++) {
int y0 = map(history[(plot_index + i) % 100], 20, 50, 110, 80);
int y1 = map(history[(plot_index + i + 1) % 100], 20, 50, 110, 80);
tft.drawLine(10 + (i * 1.4), y0, 11 + (i * 1.4), y1, DK_GREEN);
}
// Обновляем историю и график
plot_index = (plot_index + 1) % 100;
history[(plot_index + 99) % 100] = (int)current_temp;
// Симуляция изменения температуры
current_temp += random(-5, 6) / 10.0;
if(current_temp > 45) current_temp = 38.0;
if(current_temp < 32) current_temp = 39.0;
// --- Бар активности ---
if(activity_bar_state) tft.fillRect(2, tft.height()-5, tft.width()-4, 3, DK_GREEN);
else tft.fillRect(2, tft.height()-5, tft.width()-4, 3, DK_BLACK);
activity_bar_state = !activity_bar_state;
delay(300); // Быстрое обновление для эффекта 'динамики'
}