#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Encoder.h>
// TFT Pins
#define TFT_CS 5
#define TFT_DC 2
#define TFT_RST 4
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
// Rotary Encoder Pins
Encoder knob(32, 33);
#define BUTTON_PIN 25
// State & District Data
const char* states[] = {"Andhra Pradesh", "Karnataka", "Tamil Nadu"};
const char* districts[][5] = {
{"Visakhapatnam", "Vijayawada", "Guntur", "Kurnool", "Tirupati"}, // AP
{"Bengaluru", "Mysuru", "Mangaluru", "Hubli", "Belagavi"}, // Karnataka
{"Chennai", "Coimbatore", "Madurai", "Salem", "Tirunelveli"} // Tamil Nadu
};
int numStates = 3;
int numDistricts[3] = {5, 5, 5};
// Menu states
enum MenuStage { SELECT_STATE, SELECT_DISTRICT, SHOW_RESULT };
MenuStage stage = SELECT_STATE;
int selectedState = 0;
int selectedDistrict = 0;
long oldPos = -999;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
tft.begin();
tft.setRotation(1);
tft.fillScreen(ILI9341_BLACK);
drawMenu();
}
void loop() {
long newPos = knob.read() / 4;
if (newPos != oldPos) {
oldPos = newPos;
if (stage == SELECT_STATE) {
selectedState = (newPos % numStates + numStates) % numStates;
} else if (stage == SELECT_DISTRICT) {
selectedDistrict = (newPos % numDistricts[selectedState] + numDistricts[selectedState]) % numDistricts[selectedState];
}
drawMenu();
}
if (digitalRead(BUTTON_PIN) == LOW) {
delay(200); // debounce
if (stage == SELECT_STATE) {
stage = SELECT_DISTRICT;
knob.write(0);
oldPos = -999;
} else if (stage == SELECT_DISTRICT) {
stage = SHOW_RESULT;
}
drawMenu();
while (digitalRead(BUTTON_PIN) == LOW); // wait for release
}
}
void drawMenu() {
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(2);
if (stage == SELECT_STATE) {
tft.setCursor(10, 10);
tft.setTextColor(ILI9341_YELLOW);
tft.println("Select State:");
for (int i = 0; i < numStates; i++) {
tft.setCursor(20, 40 + i * 30);
if (i == selectedState) tft.setTextColor(ILI9341_GREEN);
else tft.setTextColor(ILI9341_WHITE);
tft.println(states[i]);
}
}
else if (stage == SELECT_DISTRICT) {
tft.setCursor(10, 10);
tft.setTextColor(ILI9341_YELLOW);
tft.println("Select District:");
for (int i = 0; i < numDistricts[selectedState]; i++) {
tft.setCursor(20, 40 + i * 30);
if (i == selectedDistrict) tft.setTextColor(ILI9341_GREEN);
else tft.setTextColor(ILI9341_WHITE);
tft.println(districts[selectedState][i]);
}
}
else if (stage == SHOW_RESULT) {
tft.setCursor(10, 50);
tft.setTextColor(ILI9341_GREEN);
tft.print("State: ");
tft.println(states[selectedState]);
tft.print("District: ");
tft.println(districts[selectedState][selectedDistrict]);
}
}