Skocz do zawartości

Jak stworzyć własne menu na Arduino?


kopcor

Pomocna odpowiedź

Witam wszystkich  
na wstępie dodam, że jestem początkującym użytkownikiem Arduino.  Proszę o wyrozumiałość. 🙂

Wymyśliłem sobie, że zrobię sobie menu na Arduino. Tak wiem w sieci jest dużo materiałów i gotowców. Jednak po ściągnięciu nawet takiego gotowca nie umiem go wyedytować pod siebie.
Mianowicie chciałbym żeby po uruchomieniu Arduino pojawiło się coś takiego:
przykład:
>Czas: 40ms
  Liczba: 2 
 ( to będzie pierwszy poziom menu, w którym pojawią się aktualne wartości pozycji Czas i Liczby )

teraz po naciśnięciu przycisku ok przechodzi się do menu głównego i tam będzie się dokonywała zmiana tych pozycji Czas i Liczby. Mam już już część kodu odpowiedzialną za menu. Nie umiem jednak napisać przemieszczenia się między ekranem głównym, a menu. mógłby mnie ktoś naprowadzić jak to zrobić ? 

kod:


// --- definicje przycisków ------------------------------------
#define UP 3       
#define DOWN 2     
#define OK 4       

#define LED1 6

#include <LiquidCrystal_I2C.h>
//Instatiate LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);

// --- zmienne: ------------------------------------------------
String s[31] =
{
  "Czas", "Liczba",                
  "<<<-", "Nowy", "Otworz", "Zapisz", "Zamknij",                 
  "<<<-", "Kopiuj", "Wkej", "Wytnij", "Szukaj", "Zamien",        
};
int Min[6] = {0, 2}; 
int Max[6] = {1, 6, 12}; 
volatile int ak;                  
volatile int poziom;              
int min, max;                     
int pop = -1;                      
// ------------------------------------------
int co()            
{
  max = Max[poziom];  
  min = Min[poziom];  
  if (digitalRead(DOWN) == LOW)
  {
    delay(40);  // jeśli DOWN
    if (digitalRead(DOWN) == LOW)
    {
      ak--;
      if (ak < min)ak = min;
      
    }
  }
  if (digitalRead(UP) == LOW)
  {
    delay(40);  
    if (digitalRead(UP) == LOW)
    {
      ak++;
      if (ak > max)ak = max;
      
    }
  }
  if (digitalRead(OK) == LOW)
  {
    delay(40); if (digitalRead(OK) == LOW)                            
    {
      if (poziom == 0 && ak == Min[0])
      {
        poziom = 1; 
        ak = Min[1] + 1;
        //Serial.println(ak);
        return -1;
      }
      if (poziom == 0 && ak > Min[0])
      {
        poziom = ak + 1; 
        ak = Min[poziom] + 1;
        //Serial.println(ak);
        return -1;
      }
      if (poziom > 0 && ak > Min[poziom])
      {
        return ak; 
        //Serial.println(ak);
      }
      if (poziom > 0 && ak == Min[poziom])
      {
        ak = poziom - 1;  
        poziom = 0;
        //Serial.println(ak);
        return -1;
      }
    }
  }

  return -1;                               
}
// --- funkcja do prezentacji MENU na Serialu --------------------------
void pokazSerial()
{
  
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    for (int i = Min[poziom]; i <= Max[poziom]; i++) // wyświetlam wszystkie aktualne opcje
    {

      if (i == ak)
      {
        lcd.clear();
        lcd.setCursor(1, 1);// opuszczenie
        lcd.print("[");  // jeśli ta opcja jest aktywna
        lcd.print(s[i]);
        lcd.print("]");
      }

      else lcd.print(s[i]);

    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////

  
}
// ---------------------------------------------------------------------
void setup()
{
  lcd.begin();
  lcd.backlight(); // zalaczenie podwietlenia
  lcd.setCursor(0, 0);

  Serial.begin(9600);            // inicjalizacja Seriala
  pinMode(DOWN, INPUT_PULLUP);   // konfiguracja pinów dla przycisków
  pinMode(UP, INPUT_PULLUP);     // konfiguracja pinów dla przycisków
  pinMode(OK, INPUT_PULLUP);     // konfiguracja pinów dla przycisków

  pinMode(LED1, OUTPUT);

  ak = 0; poziom = 0;            // parametry początkowe MENU
  max = Max[poziom];             // index dla ost. pozycji menu
  min = Min[poziom];             // index dla pierwszej pozycji menu


}
// ==================================================
void loop()
{
  lcd.setCursor(0, 0);
  lcd.print("Menu");

  switch (co())
  {
    case 4:      
      digitalWrite(LED1, HIGH);
      break;

    case 5:   
      digitalWrite(LED1, LOW);
      break;

  }

  if (pop != ak)
  {
    pokazSerial();  
    pop = ak;
  }
  delay(120);                          
}
// ==============================================================

 

Link do komentarza
Share on other sites

Napisałem coś takiego:

#define UP 3       // przycisk  UP 
#define DOWN 2     // przycisk  DOWN 
#define OK 4       // przycisk  OK 
#define BACK 5

#define LED1 6

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


uint8_t odczyt = 1;

uint8_t czas1 = 1;
uint8_t czas2 = 2;

uint8_t ak = 0;
uint8_t poziom_menu = 0;

void setup()
{
  lcd.begin();
  lcd.backlight(); // zalaczenie podwietlenia
  lcd.setCursor(0, 0);

  Serial.begin(9600);            // inicjalizacja Seriala
  pinMode(DOWN, INPUT_PULLUP);   // konfiguracja pinów dla przycisków
  pinMode(UP, INPUT_PULLUP);     // konfiguracja pinów dla przycisków
  pinMode(OK, INPUT_PULLUP);     // konfiguracja pinów dla przycisków

  pinMode(LED1, OUTPUT);


}

void loop()
{
  gora();
  delay(100);
  dol();


  //delay(200);

  switch (odczyt)
  {
    case 1:
      menu1();
      

      break;

    case 2:
      menu1_1();
     
      break;

  }

}
/////////////////////////////////////////////Przyciski///////////////////////////////////////////////////////////////
uint8_t gora ()
{
  if (digitalRead(UP) == LOW)
  {
    odczyt = odczyt + 1;
    if (odczyt > 3)
    {
      odczyt = 2;
    }

    return odczyt;
  }
}
uint8_t dol ()
{
  if (digitalRead(DOWN) == LOW)
  {
    odczyt = odczyt - 1;
    if (odczyt < 1)
    {
      odczyt = 1;
    }
    return odczyt;
  }
}

uint8_t ok ()
{
  if (digitalRead(OK) == LOW)
  {

    poziom_menu = poziom_menu + 1;
    ak = ak + 1;

    if (ak > 2) ak = 1;
    if (poziom_menu > 1) poziom_menu = 1;

  }
  return poziom_menu;
  return ak;
}

uint8_t back ()
{
  if (digitalRead(BACK) == LOW)
  {

    poziom_menu = poziom_menu - 1;
    ak = ak - 1;

    if (ak < 0) ak = 0;
    if (poziom_menu < 0) poziom_menu = 0;

  }
  return poziom_menu;
  return ak;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void menu1 ()
{
  lcd.setCursor(0, 0);
  lcd.print("->Zgrzew1:");
  lcd.setCursor(0, 1);
  lcd.print("  Zgrzew2:");
  lcd.setCursor(11, 0);
  lcd.print(czas1);
  lcd.setCursor(11, 1);
  lcd.print(czas2);

}
void menu1_1 ()
{
  lcd.setCursor(0, 0);
  lcd.print("  Zgrzew1:");
  lcd.setCursor(0, 1);
  lcd.print("->Zgrzew2:");
  lcd.setCursor(11, 0);
  lcd.print(czas1);
  lcd.setCursor(11, 1);
  lcd.print(czas2);
}
void menu2 ()
{
  lcd.setCursor(0, 0);
  lcd.print("Zgrzew1:");
  lcd.setCursor(9, 0);
  lcd.print(czas1);

}
void menu2_2 ()
{
  lcd.setCursor(0, 0);
  lcd.print("Zgrzew2:");
  lcd.setCursor(9, 0);
  lcd.print(czas2);
}

Nie potrafię wymyślić jak przejść do drugiego poziomu menu, w którym będę zmieniał wartość dla zmiennej ,,czas1" dla ,,Zgrzew1". Mógłby mi ktoś coś doradzić ?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@SOYER prosta sprawa, dla menu głównego i każdego podmenu zrób osobną funkcję z osobnym switchem i poruszaj się pomiędzy tymi funkcjami. 

Temat poruszony także tutaj.  

 

Próbowałem zrobić tak jak pokazałaś w jakimś poście, ale nie potrafię...

Link do komentarza
Share on other sites

Tzn. jak próbowałeś, napisz co robisz, jak, pokaż przykłady tego co zrobiłeś, napisz na czym utknąłeś, czego mie rozumiesz itp. 

Daj sobie pomóc, bo napisanie, że 

2 godziny temu, kopcor napisał:

ale nie potrafię

jest oczywiste, po to pytasz by się nauczyć, ale nikt tego za Ciebie nie napisze. 

Link do komentarza
Share on other sites

Witam, 

przepraszam, że tak piszę na raty, ale ostatnio nie masz czasu. 

Stanąłem na etapie, w którym wybieram sobie dwoma przyciskami 2 opcje w menu. 
Docelowo teraz chcę wejść w którąś z opcji. Nie wiem jak to napisać.

kod:

#define UP 12       // przycisk  UP 
#define DOWN 11     // przycisk  DOWN 
#define OK 10       // przycisk  OK 
#define BACK 9

#define LED1 13

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


uint8_t odczyt = 1;

uint8_t czas1 = 1;
uint8_t czas2 = 2;

uint8_t ak = 0;
uint8_t poziom_menu = 0;

void setup()
{
  lcd.begin();
  lcd.backlight(); // zalaczenie podwietlenia
  lcd.setCursor(0, 0);

  Serial.begin(9600);            // inicjalizacja Seriala
  pinMode(DOWN, INPUT_PULLUP);   // konfiguracja pinów dla przycisków
  pinMode(UP, INPUT_PULLUP);     // konfiguracja pinów dla przycisków
  pinMode(OK, INPUT_PULLUP);     // konfiguracja pinów dla przycisków

  pinMode(LED1, OUTPUT);


}

void loop()
{
  gora();
  delay(100);
  dol();


  //delay(200);

  switch (odczyt)
  {
    case 1:
      menu1();
      if (digitalRead(OK) == LOW)
      {
        //delay(500);
        zgrzew1();
      }

      break;

    case 2:
      menu1_1();
      if (digitalRead(OK) == LOW)
      {

      }
      break;

  }

}
/////////////////////////////////////////////Przyciski///////////////////////////////////////////////////////////////
uint8_t gora ()
{
  if (digitalRead(UP) == LOW)
  {
    odczyt = odczyt + 1;
    if (odczyt > 3)
    {
      odczyt = 2;
    }

    return odczyt;
  }
}
uint8_t dol ()
{
  if (digitalRead(DOWN) == LOW)
  {
    odczyt = odczyt - 1;
    if (odczyt < 1)
    {
      odczyt = 1;
    }
    return odczyt;
  }
}

uint8_t ok ()
{
  if (digitalRead(OK) == LOW)
  {

    poziom_menu = poziom_menu + 1;
    ak = ak + 1;

    if (ak > 2) ak = 1;
    if (poziom_menu > 1) poziom_menu = 1;

  }
  return poziom_menu;
  return ak;
}

uint8_t back ()
{
  if (digitalRead(BACK) == LOW)
  {

    poziom_menu = poziom_menu - 1;
    ak = ak - 1;

    if (ak < 0) ak = 0;
    if (poziom_menu < 0) poziom_menu = 0;

  }
  return poziom_menu;
  return ak;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void menu1 ()
{
  lcd.setCursor(0, 0);
  lcd.print("->Zgrzew1:");
  lcd.setCursor(0, 1);
  lcd.print("  Zgrzew2:");
  lcd.setCursor(11, 0);
  lcd.print(czas1);
  lcd.setCursor(11, 1);
  lcd.print(czas2);

}
void menu1_1 ()
{
  lcd.setCursor(0, 0);
  lcd.print("  Zgrzew1:");
  lcd.setCursor(0, 1);
  lcd.print("->Zgrzew2:");
  lcd.setCursor(11, 0);
  lcd.print(czas1);
  lcd.setCursor(11, 1);
  lcd.print(czas2);
}
void menu2 ()
{
  lcd.setCursor(0, 0);
  lcd.print("Zgrzew1:");
  lcd.setCursor(9, 0);
  lcd.print(czas1);

}
void menu2_2 ()
{
  lcd.setCursor(0, 0);
  lcd.print("Zgrzew2:");
  lcd.setCursor(9, 0);
  lcd.print(czas2);
}
int zgrzew1()
{
  delay(500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Zgrzew1:");
  lcd.setCursor(9, 0);
  lcd.print(czas1);
}

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.