// 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

#define  PRESSED  LOW // Using Pull-up, the button press connects to the GND
#define RELEASED HIGH

int   backButtonPin = 5;    // Buton Back (BB)
int     upButtonPin = 4;    // Buton Up (BU)
int   downButtonPin = 3;    // Buton Down (BD)
int selectButtonPin = 2;    // Buton Select (BS)
enum button_t : uint8_t {NONE, UP, DOWN, SELECT, BACK} button;

uint16_t menuLineNumber[] = {0, 30, 80, 130, 180};

// 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 //

void (*measurePtr)(void) = NULL;

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

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

void afisaremeniu() {
  tft.fillScreen(ILI9341_BLACK);
  tft.setCursor(30, 30);
  tft.print("Rezistenta");
  tft.setCursor(30, 80);
  tft.print("Capacitate");
  tft.setCursor(30, 130);
  tft.print("Inductanta");
  tft.setCursor(30, 180);
  tft.print("Info");
}

void afisareLine() {
  static uint16_t oldMenuLine = 0;
  
  tft.setTextColor(ILI9341_BLACK); 
  tft.setCursor(10, menuLineNumber[oldMenuLine]);
  tft.print('>');
  tft.setTextColor(ILI9341_WHITE); 
  oldMenuLine = menuLine;
  tft.setCursor(10, menuLineNumber[menuLine]);
  tft.print('>');
}

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
  afisareLine();
}

void loop() {
  static button_t oldButton = NONE;

  if     (digitalRead(    upButtonPin) == PRESSED) { button = UP;}
  else if(digitalRead(  downButtonPin) == PRESSED) { button = DOWN;}
  else if(digitalRead(selectButtonPin) == PRESSED) { button = SELECT;}
  else if(digitalRead(  backButtonPin) == PRESSED) { button = BACK;}
  else { button = NONE;}

  if (oldButton != button) {
    oldButton = button;
    switch (button) {
      case UP:  // Navigare în meniu folosind butonul Up (BU)
        if (menuLine == 1) {
          menuLine = 4;  // Revin la ultimul meniu daca scade sub 1
        }
        else {
          menuLine--;  // Mergem la meniul anterior
        }
        afisareLine();  // Actualizeaza meniul pe ecran
        break;
        
      case DOWN:  // Navigare în meniu folosind butonul Down (BD)
        if (menuLine == 4) {
          menuLine = 1;   // Revin la primul meniu daca depa?e?te 3
        }
        else {
          menuLine++;     // Trecem la urmatorul meniu
        }
        afisareLine();    // Actualizeaza meniul pe ecran
        break;
        
      case SELECT:  // Executa ac?iunea selectata cu butonul Select (BS)
        actiune();  // Executa ac?iunea pentru meniul curent
        // bs_apasat = true;
        break;
        
      case BACK:  // Back
        measurePtr = NULL;
        afisaremeniu();
        afisareLine();  // Actualizeaza meniul pe ecran
        break;
        
    }
  }
  if (measurePtr) (*measurePtr)();
  delay(100);
}

void actiune() {
  switch (menuLine) {
    case 1:
      tft.fillScreen(ILI9341_BLACK);
      tft.setCursor(10, 10);
      tft.print("Masurare rezistenta:");
      measurePtr = 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() {
  Serial.print('.');
  // 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.0) {  // Rezisten?a infinita sau foarte mare
    tft.print("R: Inf");
  }
  else if (R > 999.0) {  // 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");
  }
}
Loading
ili9341-cap-touch
Device under Test