Menù Arduino su display

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

#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;
		}
	//}
}

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

Ciao, Ale.

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

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;
		}
	}
}

Ciao Lollo, provo a contribuire,

	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:

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");
  }
}

Ciao
Potresti fare una cosa del genere:

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)
    //...
  }

Io ho inserito questa parte al posto di:

	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

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.

2 Likes

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