#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
// Definice pinů pro ILI9341
#define TFT_CS 10
#define TFT_RST 5 // Pokud není třeba resetovat, můžete tento pin připojit na VCC
#define TFT_DC 6
// Definice pinů pro enkodér
#define ENCODER_SW 40 // Tlačítko
#define ENCODER_DT 39 // DT pin
#define ENCODER_CLK 38 // CLK pin
// Inicializace Adafruit ILI9341
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
unsigned long lastDebounceTime = 0; // Čas poslední změny pro debounce tlačítka
int lastEncoderCLK; // Poslední stav CLK pinu enkodéru
bool lastButtonState = HIGH; // Předpokládaný počáteční stav tlačítka, využívá interní pull-up
bool buttonPressed = false; // Zda bylo tlačítko stisknuto
int lastEncoderDT;
// Proměnné pro pohyb na řádcích
int currentRow = 0; // Aktuální vybraný řádek
const int maxRows = 6; // Celkový počet řádků, které lze upravovat
bool editMode = false; // Režim úpravy hodnoty
unsigned long previousMillis = 0; // Uloží čas poslední aktualizace displeje
void readEncoder() {
int currentCLK = digitalRead(ENCODER_CLK);
if (currentCLK != lastEncoderCLK) {
if (!editMode) {
// Pohyb nahoru a dolů pro výběr řádku
if (digitalRead(ENCODER_DT) != currentCLK) {
currentRow = (currentRow < maxRows - 1) ? currentRow + 1 : 0;
} else {
currentRow = (currentRow > 0) ? currentRow - 1 : maxRows - 1;
}
} else {
// Úprava hodnoty v aktuálním řádku
// Tuto část implementujte podle specifik potřeb vašeho menu
}
Serial.println(currentRow); // Pro ladění
}
lastEncoderCLK = currentCLK;
// Čtení tlačítka enkodéru
bool currentButtonState = digitalRead(ENCODER_SW);
if (currentButtonState == LOW && lastButtonState == HIGH) {
lastDebounceTime = millis();
buttonPressed = true;
}
lastButtonState = currentButtonState;
}
void updateDisplay() {
tft.fillScreen(ILI9341_BLACK); // Vyčistí celý displej
// Zobrazení času a režimu
tft.setTextSize(3);
tft.setTextColor(ILI9341_WHITE);
tft.setCursor(10, 8);
tft.print("22:37");
tft.setCursor(170, 8);
tft.print("DEN");
// Příprava na zobrazení hodnot
tft.setTextSize(2);
// Pole řetězců pro jednotlivé položky nastavení a zařízení
String lines[] = {
" ZADANAN | MERENA",
" Tep: 25 | 26 C",
" Vlh: 65 | 48 %",
" Vlh.P.:60 | 54 %",
"NASTAVENI",
"Denni Sv.: ZAPNUTO",
"Nocni sv.: VYPNUTO",
"Topeni: DEAKTIV",
"Ventilator: ZAPNUTO",
"Zvlhcovac: ZAPNUTO",
"Cerpadlo: VYPNUTO",
"Roseni: VYPNUTO",
"Cirk. Vzdu.:ZAPNUTO"
};
// Vykreslení položek menu
for (int i = 0; i < sizeof(lines) / sizeof(lines[0]); i++) {
if (i == currentRow) {
// Vykreslení žlutého pozadí pro vybraný řádek
tft.fillRect(0, 41 + 18 * i, 240, 18, ILI9341_YELLOW);
tft.setTextColor(ILI9341_BLACK); // Černý text pro lepší čitelnost na žlutém pozadí
} else {
tft.setTextColor(ILI9341_WHITE);
}
tft.setCursor(0, 41 + 18 * i);
tft.print(lines[i]);
}
// Reset barvy textu na bílou pro další použití
tft.setTextColor(ILI9341_WHITE);
}
void setup() {
Serial.begin(115200);
tft.begin();
tft.setRotation(4); // Nastavení rotace displeje na 3
// Nastavení pinů pro enkodér
pinMode(ENCODER_SW, INPUT_PULLUP);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_CLK, INPUT);
lastEncoderCLK = digitalRead(ENCODER_CLK);
// Inicializace proměnných pro detekci pohybu enkodéru
lastEncoderCLK = digitalRead(ENCODER_CLK);
lastEncoderDT = digitalRead(ENCODER_DT);
}
void loop() {
static unsigned long lastDebounceTime = 0;
unsigned long currentMillis = millis();
if (currentMillis - lastDebounceTime > 50) { // Debounce delay
readEncoder();
lastDebounceTime = currentMillis;
}
if (buttonPressed) {
editMode = !editMode; // Přepínání mezi režimem výběru a režimem úpravy
buttonPressed = false; // Reset stisku tlačítka
}
// Každých 250 ms aktualizujte displej
if (currentMillis - previousMillis >= 250) {
previousMillis = currentMillis;
updateDisplay(); // Aktualizace displeje s aktuálními informacemi
}
}