#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Adafruit_FT6206.h>
// TFT Display Pins
#define TFT_CS 10
#define TFT_RST 4
#define TFT_DC 9
// Touch Controller
Adafruit_FT6206 touch = Adafruit_FT6206();
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
// Screen States
enum ScreenState {
MAIN_SCREEN
};
ScreenState currentScreen = MAIN_SCREEN; // Default screen
// CO2, Temp, and Humidity Values
int color, prevColor;
int co2_value;
int temp_value = 28;
int humidity_value = 68;
// Function prototypes for icons
void drawWifiIcon(int x, int y);
void drawBluetoothIcon(int x, int y);
void drawGpsIcon(int x, int y);
void setup() {
Serial.begin(115200);
tft.begin();
tft.setRotation(3);
// Initialize Touch Controller
if (!touch.begin()) {
Serial.println("Touchscreen not found!");
while (1);
}
prevColor = ILI9341_BLACK;
color = prevColor;
drawMainScreen();
}
void loop() {
detectSwipe(); // Check for swipe gesture
if (currentScreen == MAIN_SCREEN) {
updateCO2Value();
delay(500); // Simulate sensor update delay
}
}
void detectSwipe() {
if (touch.touched()) {
TS_Point p = touch.getPoint();
static int startY = -1;
if (startY == -1) {
startY = p.y; // Store the initial Y position
} else {
int deltaY = p.y - startY;
if (deltaY > 50) { // If swipe-down detected
switchScreen();
startY = -1; // Reset swipe tracking
}
}
}
}
void switchScreen() {
if (currentScreen == MAIN_SCREEN) {
currentScreen = MAIN_SCREEN;
drawMainScreen();
}
}
// ------------------- SCREEN DRAW FUNCTIONS -------------------
void drawMainScreen() {
tft.fillScreen(ILI9341_BLACK); // Clear the screen with black
drawUI();
updateCO2Value(); // Draw initial CO2 value
}
void drawUI() {
// Draw UI elements
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(1);
tft.setCursor(10, 10);
tft.print("25/03/2025 Mon");
// Status Icons
drawWifiIcon(220, 10);
drawBluetoothIcon(240, 10);
drawGpsIcon(260, 10);
// Battery Icon
int batteryX = 300, batteryY = 10, batteryWidth = 18, batteryHeight = 8;
tft.drawRect(batteryX, batteryY, batteryWidth, batteryHeight + 1, ILI9341_WHITE);
tft.fillRect(batteryX + batteryWidth, batteryY + 2, 3, 4, ILI9341_WHITE);
tft.fillRect(batteryX + 2, batteryY + 2, 12, 4, ILI9341_WHITE);
tft.setCursor(280, 10);
tft.print("85%"); // Dummy battery percentage
// CO2 Label
tft.setTextSize(3);
tft.setCursor(50, 35);
tft.print("CO2");
// Temperature & Humidity
tft.setTextSize(2);
tft.setCursor(40, 180);
tft.print(temp_value);
tft.print("C");
tft.setCursor(35, 205);
tft.print("Temp");
tft.setCursor(250, 180);
tft.print(humidity_value);
tft.print("%");
tft.setCursor(250, 205);
tft.print("HUM");
// Larger Rounded Rectangle for CO2 Value
tft.drawRoundRect(25, 60, 280, 100, 20, ILI9341_WHITE);
// Smaller Rounded Rectangles for Temp and Humidity
tft.drawRoundRect(25, 170, 70, 30, 10, ILI9341_WHITE);
tft.drawRoundRect(235, 170, 70, 30, 10, ILI9341_WHITE);
}
void updateCO2Value() {
co2_value = random(300, 2500); // Simulated CO2 sensor value
// Determine new background color
if (co2_value <= 500) color = ILI9341_GREEN;
else if (co2_value > 500 && co2_value <= 2000) color = ILI9341_ORANGE;
else color = ILI9341_RED;
// Only update the screen if the color has changed
if (color != prevColor) {
tft.fillRoundRect(25, 60, 280, 100, 20, color);
tft.setTextColor(ILI9341_WHITE, color);
tft.setTextSize(4);
tft.setCursor(80, 95);
tft.print(co2_value);
tft.setTextSize(2);
tft.setCursor(200, 110);
tft.print("ppm");
prevColor = color;
}
}
// ------------------- STATUS ICON DRAW FUNCTIONS -------------------
void drawWifiIcon(int x, int y) {
int centerX = x + 4;
int centerY = y + 4;
tft.drawLine(centerX - 3, y + 2, centerX + 3, y + 2, ILI9341_WHITE);
tft.drawLine(centerX - 2, y + 4, centerX + 2, y + 4, ILI9341_WHITE);
tft.drawLine(centerX - 1, y + 6, centerX + 1, y + 6, ILI9341_WHITE);
tft.drawPixel(centerX, y + 8, ILI9341_WHITE);
}
void drawBluetoothIcon(int x, int y) {
int centerX = x + 4;
int centerY = y + 4;
tft.drawLine(centerX, y, centerX, y + 8, ILI9341_WHITE);
tft.drawLine(centerX, y, centerX + 2, y + 2, ILI9341_WHITE);
tft.drawLine(centerX + 2, y + 2, centerX - 2, centerY + 2, ILI9341_WHITE);
tft.drawLine(centerX - 2, centerY - 2, centerX + 2, centerY + 2, ILI9341_WHITE);
tft.drawLine(centerX + 2, centerY + 2, centerX, centerY + 4, ILI9341_WHITE);
}
void drawGpsIcon(int x, int y) {
int centerX = x + 4;
int centerY = y + 4;
tft.drawCircle(centerX, centerY, 2, ILI9341_WHITE);
tft.drawPixel(centerX, centerY, ILI9341_WHITE);
tft.drawLine(centerX - 4, centerY, centerX - 2, centerY, ILI9341_WHITE);
tft.drawLine(centerX + 2, centerY, centerX + 4, centerY, ILI9341_WHITE);
tft.drawLine(centerX, centerY - 4, centerX, centerY - 2, ILI9341_WHITE);
tft.drawLine(centerX, centerY + 2, centerX, centerY + 4, ILI9341_WHITE);
}