// 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
ili9341-cap-touch
Device
under Test