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