I need to figure out how to leave the function and get back to the main menu.
Hello, i am doing an project for my Uni and can't get past this problem. I have 4 buttons, Button up (bu) , down (bd) , select (bs) and back (bb), i have a function called " void masurareRezistenta() ", from which i measure the resistance and update constantly, if the button thing work i will make it update after 2-3 second maybe and just to keep the value until I pull out the resistor. the problem here is i can't get out of the function and be on the main menu, tried different things with other constant that change when i press the back button and should get me out of the while but nothing, tried ChatGPT and it's making something weird that i leave the measuring menu but first press it gets a freeze and at the second press of the back button i really leave the menu.
Down here is the code, if i figure this thing out all that's left it's easy, i plan to make resistance to be measure after 2-3 seconds so i can have enough time for a good value and to be exact like on a multimeter.
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>
#define TFT_CS 10 // Chip select (CS)
#define TFT_RST 8 // Reset pin
#define TFT_DC 9 // Data/Command pin
int bb = 5; // Buton Back (BB)
int bu = 4; // Buton Up (BU)
int bd = 3; // Buton Down (BD)
int bs = 2; // Buton Select (BS)
int stare1 = -1;
int stare2 = -1;
int stare3 = -1;
int stare4 = 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; // Input voltage
float Vout = 0; // Vout default value
float Rref = 999; // Reference resistor's value in ohms
float R = 0; // Tested resistor's default value
//Ohm metru //
int meniu = 1; // Meniul curent, începe de la 1
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
void setup() {
Serial.begin(9600); // Initialize Serial Monitor
pinMode(bu, INPUT_PULLUP); // Setare buton Up ca INPUT_PULLUP
pinMode(bd, INPUT_PULLUP); // Setare buton Down ca INPUT_PULLUP
pinMode(bs, INPUT_PULLUP); // Setare buton Select ca INPUT_PULLUP
pinMode(bb, INPUT_PULLUP);
tft.init(240, 320); // Inițializare ecran 240x320 pixeli
tft.setRotation(1); // Rotire ecran
tft.fillScreen(ST77XX_BLACK); // Fundal negru
tft.setTextColor(ST77XX_WHITE); // Text alb
tft.setTextSize(2); // Dimensiune text
afisaremeniu(); // Afișează meniul inițial
}
void afisaremeniu() {
//tft.fillScreen(ST77XX_BLACK); // Șterge ecranul
switch (meniu) {
case 1:
tft.fillRect(10,30,10,180, ST77XX_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, ST77XX_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, ST77XX_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, ST77XX_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 stare1 = digitalRead(bu);
int stare2 = digitalRead(bd);
int stare3 = digitalRead(bs);
int stare4 = digitalRead(bb);
// Navigare în meniu folosind butonul Up (BU)
if (stare1 == 1 && bs_apasat == false) { // Buton Up
meniu--; // Mergem la meniul anterior
if (meniu < 1) { meniu = 4; } // Revin la ultimul meniu dacă scade sub 1
afisaremeniu(); // Actualizează meniul pe ecran
delay(200); // Debounce
stare1 = 0;
}
// Navigare în meniu folosind butonul Down (BD)
if (stare2 == 1 && bs_apasat == false) { // Buton Down
meniu++; // Trecem la următorul meniu
if (meniu > 4) { meniu = 1; } // Revin la primul meniu dacă depășește 3
afisaremeniu(); // Actualizează meniul pe ecran
delay(200); // Debounce
stare2 = 0;
}
// Execută acțiunea selectată cu butonul Select (BS)
if (stare3 == 1 && bs_apasat == false) { // Buton Select ( se duce in meniu )
actiune(); // Execută acțiunea pentru meniul curent
delay(200); // Debounce
stare3 = 0;
bs_apasat = true;
}
if (stare4 == 1 && bs_apasat == true ){
tft.fillScreen(ST77XX_BLACK);
afisaremeniu();
delay(200);
stare4 = 0;
bs_apasat = false;
}
delay(100);
}
void actiune() {
switch (meniu) {
case 1:
masurareRezistenta();
break;
case 2:
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(10, 30);
tft.print("Testare Meniu 2!");
break;
case 3:
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(10, 30);
tft.print("Testare Meniu 3!");
break;
case 4:
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(10, 30);
tft.print("Testare Meniu 4!");
break;
}
}
void masurareRezistenta() {
tft.fillScreen(ST77XX_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, ST77XX_BLACK); // Curăță zona de afișare
tft.setCursor(10, 50);
if (R > 500000) { // Rezistență infinită 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(" kOhm");
} else { // Rezistență în Ohmi
tft.print("R: ");
tft.print(R, 2); // 2 zecimale pentru precizie
tft.print(" Ohm");
}
delay(1000);
}
}