• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem ze stworzeniem podmenu
#1
Witam,
od niedawna zacząłem przygodę z arduino i teraz przyszła pora na menu i lcd.
Założenie jest takie, że w menu głównym jest kilka opcji, następnie można wejść do jednego z podmenu i załączyć np. jedną z diod.
Znalazłem taki kod i mam problem by po stworzeniu podmenu działały przyciski nawigacji (wrzucam tutaj bez stworzonego pod menu).

Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3f, 16, 2);

int upButton = 10;
int downButton = 11;
int selectButton = 12;
int menu = 1;

void setup() {
  lcd.init();
  lcd.backlight();
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  updateMenu();
 
}



void loop() {
  if (!digitalRead(downButton)){
    menu++;
    updateMenu();
    delay(100);
    while (!digitalRead(downButton));
  }
  if (!digitalRead(upButton)){
    menu--;
    updateMenu();
    delay(100);
    while(!digitalRead(upButton));
  }
  if (!digitalRead(selectButton)){
    executeAction();
    updateMenu();
    delay(100);
    while (!digitalRead(selectButton));
  }
}


void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;
    case 1:
      lcd.clear();
      lcd.print(">MenuItem1");
      lcd.setCursor(0, 1);
      lcd.print(" MenuItem2");
      break;
    case 2:
      lcd.clear();
      lcd.print(" MenuItem1");
      lcd.setCursor(0, 1);
      lcd.print(">MenuItem2");
      break;
    case 3:
      lcd.clear();
      lcd.print(">MenuItem3");
      lcd.setCursor(0, 1);
      lcd.print(" MenuItem4");
      break;
    case 4:
      lcd.clear();
      lcd.print(" MenuItem3");
      lcd.setCursor(0, 1);
      lcd.print(">MenuItem4");
      break;
    case 5:
      menu = 4;
      break;
  }
}

void executeAction() {
  switch (menu) {
    case 1:
      action1();
      break;
    case 2:
      action2();
      break;
    case 3:
      action3();
      break;
    case 4:
      action4();
      break;
  }
}

void action1() {
  lcd.clear();
  lcd.print(">Executing #1");
  delay(1500);
}
void action2() {
  lcd.clear();
  lcd.print(">Executing #2");
  delay(1500);
}
void action3() {
  lcd.clear();
  lcd.print(">Executing #3");
  delay(1500);
}
void action4() {
  lcd.clear();
  lcd.print(">Executing #4");
  delay(1500);
}

Z góry dziękuję za pomoc.
 
Odpowiedź
#2
Naucz się programować bez delay, użyj millis lub timerów, są też do tego biblioteki. Bez tej umiejętności zostaniesz na etapie migania led.
Przykłady menu: https://starter-kit.nettigo.pl/2017/04/m...aczu-16x2/.
Oczywiście gotowe biblioteki do menu też są, jak również generatory online z przykładami.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Ok, mnie więcej rozumiem ten przykład menu z linku i zrobiłem tak:

void formatNapisy() {

String dictonary[] = {"Napis 1", "Napis 2", "Napis 3"};
lcd.print(dictonary[tempVal]);
if (menu[2].currentVal) {
if (tempVal == 2) {
Serial.println("Wywolano akcje: napis3");
}

else if (tempVal == 1) {
Serial.println("Wywolano akcje: napis2");
}
}
}

Prawie działa jak chcę, z tym że jak wcisnę ok, to oprócz wywołania seriala, każde naciśnięcie góra lub dół wywołuje tempVal.
Wydaję mi się, że problem leży w kodzie przycisku "ok", ale nie mam pomysłu jak to rozwiązać, pomoże ktoś?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości