# Menù Arduino su display

**URL:** <https://forum.arduino.cc/t/menu-arduino-su-display/1218717>\
**Category:** Software\
**Created:** [February 1, 2024, 2:05pm UTC](https://forum.arduino.cc/t/menu-arduino-su-display/1218717 "2024-02-01T14:05:33Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![lollo007](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lollo007/32/1027363_2.png) [@lollo007](https://forum.arduino.cc/u/lollo007)\
**Post date:** [February 1, 2024, 2:05pm UTC](https://forum.arduino.cc/t/menu-arduino-su-display/1218717/1 "2024-02-01T14:05:33Z")

</div>

Salve, sto provando a fare un menù con Arduino e un monitor lcd (16,2 ). Il programma è giusto (come sintassi), ma non fa ciò che deve fare, ovvero vengono stampate le lettere che ho inserito ma quando premo il bottone non cambia nulla. Vorrei da voi un aiuto, grazie

```arduino
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

int button_pin=2;
//int button=-1;
int button_value;
unsigned int cont_pag=-1;
//long previusMillis=0;
//long interval=0;

void setup(){
	pinMode(button_pin, INPUT);
	lcd.begin(16, 2);
	lcd.backlight();
}

void loop(){
	button_value=analogRead(button_pin);
	if(button_value==HIGH){
		//button=1;
		if(cont_pag==-1||cont_pag==3){
			cont_pag=0;
		} else if(cont_pag==0){
			cont_pag=1;
		} else if(cont_pag==1){
			cont_pag=2;
		} else if(cont_pag==2){
			cont_pag=3;
		}
	} 
	//else if(button_value==LOW){
		//button=0;
	//}
	/*if(button==0&&millis()-previusMillis>interval+250){
		cont_pag=0;
	} else if(button==1&&millis()-previusMillis>interval+2
		previusMillis=millis();
		cont_pag+=1;
		if(cont_pag==4){
			cont_pag=1;
		}
	}
	if(cont_pag==0&&millis()-previusMillis>interval+1000){
		//serial print di qualcosa
		previusMillis=millis();
		lcd.setCursor(0, 0);
		lcd.print(" A ");
		lcd.setCursor(0, 1);
		lcd.print(" B ");
		lcd.setCursor(3, 0);
		lcd.print("C");
		lcd.setCursor(12, 0);
		lcd.print("D");
		lcd.setCursor(2, 1);
		lcd.print("E");
		lcd.setCursor(13, 1);
		lcd.print("F");
	} else {*/
		switch (cont_pag){
			case 0:
				lcd.setCursor(0, 0);
				lcd.print(" A ");
				lcd.setCursor(0, 1);
				lcd.print(" B ");
				lcd.setCursor(3, 0);
				lcd.print("C");
				lcd.setCursor(12, 0);
				lcd.print("D");
				lcd.setCursor(2, 1);
				lcd.print("E");
				lcd.setCursor(13, 1);
				lcd.print("F");
				break;
			case 1:
				lcd.setCursor(0, 0);
				lcd.print("ciao ");
				lcd.setCursor(0, 1);
				lcd.print(" ");
				lcd.setCursor(0, 1);
				lcd.write(0);
				lcd.setCursor(15, 1);
				lcd.write(1);
				break;
			case 2:
				lcd.setCursor(0, 0);
				lcd.print(" hello ");
				lcd.setCursor(0, 1);
				lcd.print(" ");
				lcd.setCursor(0, 1);
				lcd.write(0);
				lcd.setCursor(15, 1);
				lcd.write(1);
				break;
			case 3:
				lcd.setCursor(0, 0);
				lcd.print(" prova ");
				lcd.setCursor(0, 1);
				lcd.print(" ");
				lcd.setCursor(0, 1);
				lcd.write(0);
				lcd.setCursor(15, 1);
				lcd.write(1);
				break;
		}
	//}
}

```

---

<div class="post-metadata">

**Author:** ![ilguargua](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/ilguargua/32/901053_2.png) [@ilguargua](https://forum.arduino.cc/u/ilguargua)\
**Post date:** [February 1, 2024, 2:17pm UTC](https://forum.arduino.cc/t/menu-arduino-su-display/1218717/2 "2024-02-01T14:17:51Z")

</div>

Perchè usi analogRead() per leggere il pulsante? Così, se tutto va bene, leggi l'ingresso analogico 2, non il pin 2.

Ciao, Ale.

---

<div class="post-metadata">

**Author:** ![lollo007](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lollo007/32/1027363_2.png) [@lollo007](https://forum.arduino.cc/u/lollo007)\
**Post date:** [February 1, 2024, 2:27pm UTC](https://forum.arduino.cc/t/menu-arduino-su-display/1218717/3 "2024-02-01T14:27:01Z")

</div>

Ho corretto e accorciato il tutto, però ora le scritte "girano" e se premo il bottone, viene visualizzata la scritta che sta passando in quel momento, appena lo mollo ricomincia il tutto

```arduino
void loop(){
	button_value=digitalRead(button_pin);
	if(button_value==HIGH){
		button=HIGH;
	} else if(button_value==LOW){
    button=LOW;
	}
	if(button==LOW&&millis()-previusMillis>interval+250){
		cont_pag=0;
	} else if(button==HIGH && millis()-previusMillis>interval+250){
		previusMillis=millis();
		cont_pag+=1;
		if(cont_pag==4){
			cont_pag=1;
		}
	}
	if(cont_pag==0&&millis()-previusMillis>interval+1000){
    previusMillis=millis();
		lcd.setCursor(0, 0);
		lcd.print(" A ");
	} else {
		switch (cont_pag){
			case 1:
				cd.setCursor(0, 0);
				lcd.print(" ");
        lcd.setCursor(0, 0);
				lcd.print("ciao ");

				break;
			case 2:
				lcd.setCursor(0, 0);
				lcd.print(" ");
        lcd.setCursor(0, 0);
				lcd.print(" hello ");

				break;
			case 3:
				lcd.setCursor(0, 0);
				lcd.print(" ")
        lcd.setCursor(0, 0);
				lcd.print(" prova ");
				break;
		}
	}
}

```

---

<div class="post-metadata">

**Author:** ![simosere](https://avatars.discourse-cdn.com/v4/letter/s/ee7513/32.png) [@simosere](https://forum.arduino.cc/u/simosere)\
**Post date:** [February 1, 2024, 2:54pm UTC](https://forum.arduino.cc/t/menu-arduino-su-display/1218717/4 "2024-02-01T14:54:18Z")

</div>

Ciao Lollo, provo a contribuire,

```arduino
	if(button_value==HIGH){
		button=HIGH;
	} else if(button_value==LOW){
    button=LOW;
	}

```

qui non otterrai mai con certezza quello che ti aspetti e il mio consiglio è quello di posizionare anche il controllo di button(che immaggino sia una variabile booleana) anche nel controllo dell'if(button\_value==HIGH){ e di ritardare con un bel millis() anche un 200ms dal momento che rilasci il pulsante(debounce software del pulsante), fatto questo utilizzando lo switch case aumenti di un'uno la variabile cont\_pag solo quando lo stato del pulsante è su HIGH

quindi:

```arduino
button_value = digitalRead(button_pin);
  if ((button_value == LOW) && (button == false) && ((millis() - t1) >= 200)) {
    cont_pag++;
    button = true;
    t1 = millis();
    if (cont_pag > 3) { // verifico se ho raggiunto l'ultima pagina del menu e in caso ricomincio da capo
      cont_pag = 0;
    }
      Serial.println(cont_pag);
  }
  if ((button_value == HIGH) && (button == true) && ((millis() - t1) >= 200)) {
    button = false;
    t1 = millis();
    Serial.println("ritardo debounce");
  }
}

```

---

<div class="post-metadata">

**Author:** ![Datman](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/datman/32/219519_2.png) [@Datman](https://forum.arduino.cc/u/Datman)\
**Post date:** [February 1, 2024, 3:44pm UTC](https://forum.arduino.cc/t/menu-arduino-su-display/1218717/5 "2024-02-01T15:44:55Z")

</div>

Ciao  
Potresti fare una cosa del genere:

```arduino
uint32_t t_puls=0;
uint8_t stato=0;
uint8_t stato_prec=0;
bool puls_prec=false;

// loop:
if(digitalRead(button_pin)) // Premuto
  {
  if (puls_prec==false && millis()-t_puls>200)
    {
    stato+=1;
    if(stato>3) stato=1;
    puls_prec=true;
    }
  t_puls=millis();
  }
else // Non premuto
  {
  puls_prec=false;
  }

if(stato!=stato_prec) // E' stato premuto il pulsante
  {
  switch (stato)
    //...
  }

```

---

<div class="post-metadata">

**Author:** ![lollo007](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lollo007/32/1027363_2.png) [@lollo007](https://forum.arduino.cc/u/lollo007)\
**Post date:** [February 1, 2024, 4:00pm UTC](https://forum.arduino.cc/t/menu-arduino-su-display/1218717/6 "2024-02-01T16:00:59Z")

</div>

Io ho inserito questa parte al posto di:

```arduino
	if(button_value==HIGH){
		button=HIGH;
	} else if(button_value==LOW){
    button=LOW;
	}

```

e la parte sotto l'ho lasciata invariata, ma ancora non funziona, o per lo meno, il programma è giusto, ma non fa quello che deve fare

---

<div class="post-metadata">

**Author:** ![ilguargua](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/ilguargua/32/901053_2.png) [@ilguargua](https://forum.arduino.cc/u/ilguargua)\
**Post date:** [February 1, 2024, 5:50pm UTC](https://forum.arduino.cc/t/menu-arduino-su-display/1218717/7 "2024-02-01T17:50:21Z")

</div>

> [@lollo007](#):
>
> il programma è giusto, ma non fa quello che deve fare

I "programmi", per definizione, fanno quello che gli chiedi di fare, che non sempre coincide con quello che vorresti fare. Quindi, si, il programma è nel giusto, nel senso che non è lui il colpevole del malfunzionamento.

Ciao, Ale.

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [July 30, 2024, 5:50pm UTC](https://forum.arduino.cc/t/menu-arduino-su-display/1218717/8 "2024-07-30T17:50:28Z")

</div>

Closed on July 30, 2024, 5:50pm UTC

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
