// Programming a button to go back from a while menu thing
// https://forum.arduino.cc/t/programming-a-button-to-go-back-from-a-while-menu-thing/1325404


#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

#define TFT_CS    10  // Chip select (CS)
#define TFT_RST   8   // Reset pin
#define TFT_DC    9   // Data/Command pin

int   backButtonPin = 5;    // Buton Back (BB)
int     upButtonPin = 4;    // Buton Up (BU)
int   downButtonPin = 3;    // Buton Down (BD)
int selectButtonPin = 2;    // Buton Select (BS)

int state1 = -1;
int state2 = -1;
int state3 = -1;
int state4 =  0;
bool bs_apasat = false;

// Ohm metru //
const int sensorPin = A0;  // Analog input pin that senses Vout
int sensorValue = 0;       // sensorPin default value
float Vin = 5.0;             // Input voltage
float Vout = 0.0;            // Vout default value
float Rref = 999.0;          // Reference resistor's value in ohms
float R = 0.0;               // Tested resistor's default value
//Ohm metru //

int meniu = 1;  // Meniul curent, începe de la 1

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  Serial.begin(115200);  // Initialize Serial Monitor
  pinMode(    upButtonPin, INPUT_PULLUP);  // Setare buton Up ca INPUT_PULLUP
  pinMode(  downButtonPin, INPUT_PULLUP);  // Setare buton Down ca INPUT_PULLUP
  pinMode(selectButtonPin, INPUT_PULLUP);  // Setare buton Select ca INPUT_PULLUP
  pinMode(  backButtonPin, INPUT_PULLUP);

  tft.begin();  // Initializare ecran 240x320 pixeli
  tft.setRotation(1);  // Rotire ecran
  tft.fillScreen(ILI9341_BLACK);  // Fundal negru
  tft.setTextColor(ILI9341_WHITE);  // Text alb
  tft.setTextSize(2);  // Dimensiune text
  afisaremeniu();  // Afi?eaza meniul ini?ial
}

void afisaremeniu() {
  //tft.fillScreen(ILI9341_BLACK);  // ?terge ecranul
  switch (meniu) {
    case 1:
      tft.fillRect(10, 30, 10, 180, ILI9341_BLACK );
      tft.setCursor(10, 30);
      tft.print(">");
      tft.setCursor(30, 30);
      tft.print("Rezistenta");  // Selectat Meniu 1
      tft.setCursor(30, 80);
      tft.print("Capacitate");
      tft.setCursor(30, 130);
      tft.print("Inductanta");
      tft.setCursor(30, 180);
      tft.print("Info");
      break;
    case 2:
      tft.fillRect(10, 30, 10, 180, ILI9341_BLACK );
      tft.setCursor(10, 80);
      tft.print(">");
      tft.setCursor(30, 30);
      tft.print("Rezistenta");
      tft.setCursor(30, 80);
      tft.print("Capacitate");  // Selectat Meniu 2
      tft.setCursor(30, 130);
      tft.print("Inductanta");
      tft.setCursor(30, 180);
      tft.print("Info");
      break;
    case 3:
      tft.fillRect(10, 30, 10, 180, ILI9341_BLACK );
      tft.setCursor(10, 130);
      tft.print(">");
      tft.setCursor(30, 30);
      tft.print("Rezistenta");
      tft.setCursor(30, 80);
      tft.print("Capacitate");
      tft.setCursor(30, 130);
      tft.print("Inductanta");  // Selectat Meniu 3
      tft.setCursor(30, 180);
      tft.print("Info");
      break;
    case 4:
      tft.fillRect(10, 30, 10, 180, ILI9341_BLACK );
      tft.setCursor(10, 180);
      tft.print(">");
      tft.setCursor(30, 30);
      tft.print("Rezistenta");
      tft.setCursor(30, 80);
      tft.print("Capacitate");
      tft.setCursor(30, 130);
      tft.print("Inductanta");  // Selectat Meniu 3
      tft.setCursor(30, 180);
      tft.print("Info");
      break;
  }
}

void loop() {

  int state1 = digitalRead(upButtonPin);
  int state2 = digitalRead(downButtonPin);
  int state3 = digitalRead(selectButtonPin);
  int state4 = digitalRead(backButtonPin);

  // Navigare în meniu folosind butonul Up (BU)
  if (state1 == 1 && bs_apasat == false) {  // Buton Up
    meniu--;  // Mergem la meniul anterior
    if (meniu < 1) {
      meniu = 4;  // Revin la ultimul meniu daca scade sub 1
    }
    afisaremeniu();  // Actualizeaza meniul pe ecran
    delay(20);  // Debounce
    state1 = 0;
  }
  // Navigare în meniu folosind butonul Down (BD)
  if (state2 == 1 && bs_apasat == false) {  // Buton Down
    meniu++;  // Trecem la urmatorul meniu
    if (meniu > 4) {
      meniu = 1;  // Revin la primul meniu daca depa?e?te 3
    }
    afisaremeniu();  // Actualizeaza meniul pe ecran
    delay(20);  // Debounce
    state2 = 0;
  }
  // Executa ac?iunea selectata cu butonul Select (BS)
  if (state3 == 1 && bs_apasat == false) {  // Buton Select ( se duce in meniu )
    actiune();  // Executa ac?iunea pentru meniul curent
    delay(20);  // Debounce
    state3 = 0;
    bs_apasat = true;
  }
  if (state4 == 1 && bs_apasat == true ) {
    tft.fillScreen(ILI9341_BLACK);
    afisaremeniu();
    delay(20);
    state4 = 0;
    bs_apasat = false;
  }
  delay(100);
}

void actiune() {
  switch (meniu) {
    case 1:
      masurareRezistenta();
      break;

    case 2:
      tft.fillScreen(ILI9341_BLACK);
      tft.setCursor(10, 30);
      tft.print("Testate Meniu 2!");
      break;
    case 3:
      tft.fillScreen(ILI9341_BLACK);
      tft.setCursor(10, 30);
      tft.print("Testate Meniu 3!");
      break;
    case 4:
      tft.fillScreen(ILI9341_BLACK);
      tft.setCursor(10, 30);
      tft.print("Testate Meniu 4!");
      break;
  }
}
void masurareRezistenta() {
  tft.fillScreen(ILI9341_BLACK);
  tft.setCursor(10, 10);
  tft.print("Masurare rezistenta:");
  int masurare = 1;
  while (masurare == 1 ) {
    // Cite?te valoarea senzorului
    sensorValue = analogRead(sensorPin);  // Cite?te Vout pe pinul analogic A0
    Vout = (Vin * sensorValue) / 1023.0;  // Conversie la vol?i
    R = Rref * (1 / ((Vin / Vout) - 1));
    tft.fillRect(10, 50, 220, 30, ILI9341_BLACK);  // Cura?a zona de afi?are
    tft.setCursor(10, 50);

    if (R > 500000) {  // Rezisten?a infinita sau foarte mare
      tft.print("R: Inf");
    } else if (R > 999) {  // Conversie la kOhm
      tft.print("R: ");
      tft.print(R / 1000.0, 2);  // 2 zecimale pentru precizie
      // tft.print(" kΩ");
      tft.print(" kOhm");
    } else {  // Rezisten?a în Ohmi
      tft.print("R: ");
      tft.print(R, 2);  // 2 zecimale pentru precizie
      // tft.print(" Ω");
      tft.print(" Ohm");
    }
    delay(1000);

  }
}
Loading
ili9341-cap-touch