Skocz do zawartości

Proste menu w Arduino i obsługa LCD I2C po raz enty...


bakardi92

Pomocna odpowiedź

@Norbert7630 Nie słuchasz, ani nie czytasz tego co się do Ciebie mówi i pisze. ☹️

Nie pisz żadnego kodu jeszcze,a już wcale nie opisuj mi tu kodu który piszesz. 

Czy rozumiesz co Ci napisałem w ostatnim poście? 

Edytowano przez SOYER
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Yyyy.......to nie tak😅 ja tylko dosłownie kilka minutek na próbę z tym kodem czy coś załapałem ale tyle i już jestem back przy twoim wpisie.......no tak na początku zmienna globalna czyli cały czas widoczna podana wartość 1, no tak tylko ja nie do końca rozumie bo w momencie załadowania się programu ja widzę jeden ekran, załóżmy że 1, czyli POZYCJA 1 i POZYCJA 2 oczywiście jedna opcja pod drugą natomiast dla mnie drugim ekranem jest START i STOP. Dla mikro-kontrolera to może wyglądać inaczej 1 ekran to tak jak ja widzę tylko że z markerem ustawionym na pozycji 1 a drugi ekran to ten sam widok tylko z markerem na pozycji 2

Czyli zmienna przyjmuje wartości od 1 wzwyż 1++ każda wartość np 2....3.....4 to ekrany? 

Link do komentarza
Share on other sites

10 minut temu, Norbert7630 napisał:

Dla mikro-kontrolera to może wyglądać inaczej 1 ekran to tak jak ja widzę tylko że z markerem ustawionym na pozycji 1 a drugi ekran to ten sam widok tylko z markerem na pozycji 2

Tak

10 minut temu, Norbert7630 napisał:

Czyli zmienna przyjmuje wartości od 1 wzwyż 1++ każda wartość np 2....3.....4 to ekrany? 

Tak

Teraz napiszesz kawałek kodu:) i go tu wkleisz. 

Korzystasz z instrukcji switch i piszesz 3 kolejne ekrany. Tylko to to co ma się wyświetlać na LCD, żadnych if, menu++ itp., tylko 3 kolejne ekrany lcd w osobnych case funkcji switch. 

Edytowano przez SOYER
  • Pomogłeś! 1
Link do komentarza
Share on other sites

23 godziny temu, SOYER napisał:

int numerEkranu =1;

switch(numerEkranu) {  

case(1):      

lcd_cośtam_ekranpowitalny  

if( cośtam....) {    

zróbcoś;    

numerEkranu=2; // idź do drugiego ekranu  

break;  

case(2):    

itd... cośtam...   

break;  

itd...  } 

Tylko się zapytam jeszcze zanim coś nabazgrolę a Ty ze śmiechu padniesz 😅.....czyli zignorować instrukcję warunkową if te które tutaj powyżej są?

switch(numerEkranu) {

  case(1):

      lcd.clear();
      lcd.print(">POZYCJA 1");
      lcd.setCursor(0, 1);
      lcd.print(" POZYCJA 2");
     break;

case(2):
      lcd.clear();
      lcd.print(" POZYCJA 1");
      lcd.setCursor(0, 1);
      lcd.print(">POZYCJA 2");
      break;

case(3):
      lcd.clear();
      lcd.print(" START 1");
      lcd.setCursor(0, 1);
      lcd.print(">STOP 2");
      break;

no chyba raczej tak średnio 

Yyyyy......tam w tym case 3 START i STOP bez tego 1 i 2 no i marker na START

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

Dzięki @SOYER  ale nie chwal dnia przed zachodem Słońca😉 bo ja tak mam że czasem zacznę dobrze, a potem nie przewidziany głupi ruch i wszystko grzebie.

W zasadzie to mogę dodać jeszcze jeden case i nie co końcówkę uporządkować:

switch(numerEkranu) {

  case(1):

      lcd.clear();
      lcd.print(">POZYCJA 1");
      lcd.setCursor(0, 1);
      lcd.print(" POZYCJA 2");
     break;

case(2):
      lcd.clear();
      lcd.print(" POZYCJA 1");
      lcd.setCursor(0, 1);
      lcd.print(">POZYCJA 2");
      break;

case(3):
      lcd.clear();
      lcd.print(">START 1");
      lcd.setCursor(0, 1);
      lcd.print(" STOP 2");
      break;

case(4):
      lcd.clear();
      lcd.print(" START 1");
      lcd.setCursor(0, 1);
      lcd.print(">STOP 2");
      break;

 

Link do komentarza
Share on other sites

ok, nie wiem po co te "1" i "2" przy start i stop, ale to Twój program. 

Teraz trudniejsze(?) 

Musisz wpisać warunki  kiedy program przechodzi z jednego ekranu w inny... 

Kiedy, czemu i jak.... 

Nie wgrywaj, bo działać nie będzie... 

Pomyśl jak zapisać, że po jakimś zdarzeniu program wyświetla ten a nie inny ekran i jak zrobić by wyświetlał ten właściwy... 

Nie zawiedź mnie Norbert:) 

Edytowano przez SOYER
  • Pomogłeś! 1
Link do komentarza
Share on other sites

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

LiquidCrystal_I2C lcd(0x27, 16, 2);

#define upButton 9
#define downButton  10
#define selectButton  11
int numerEkranu = 1;

void setup() {
  lcd.begin();
  lcd.backlight();
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);

void loop() {
switch(numerEkranu) { //instrukcja sterująca switch ze zmienna

  case(1):

      lcd.clear();
      lcd.print(">POZYCJA 1");
      lcd.setCursor(0, 1);
      lcd.print(" POZYCJA 2");
      if (digitalRead(downButton)){ //jeśli wciśnięty przycisk
    numerEkranu++; // przejdź do następnego ekranu
     delay(100);
     break;

case(2):
      lcd.clear();
      lcd.print(" POZYCJA 1");
      lcd.setCursor(0, 1);
      lcd.print(">POZYCJA 2");
       if (digitalRead(upButton)){ //jeśli wciśnięty przycisk
    numerEkranu--; // wróć do poprzedniego ekranu 
      break;

case(3):
      lcd.clear();
      lcd.print(">START ");
      lcd.setCursor(0, 1);
      lcd.print(" STOP ");
      if (digitalRead(selectButton)){ //jeśli wciśnięty przycisk
    numerEkranu++;// tutaj powinienem wpisać coś co wywoła ekran poniżej
      break;

case(4):
      lcd.clear();
      lcd.print(" START ");
      lcd.setCursor(0, 1);
      lcd.print(">STOP ");
      if (digitalRead(downButton)){ //jeśli wciśnięty przycisk
    numerEkranu++;
      break;
      }
       }

Wstawiam ale od razu przyznaje się że nie jest dobrze, @SOYER przepraszam że zawiodłem po prostu mam to gdzieś w  głowie jak to powinno funkcjonować ale brakuje mi tego elementu który by realizował przejście z pozycja 1 do start/stop. Napisałbym coś więcej ale muszę uciekać do pracy, wieczorem zerknę. Pozdrawiam.

Link do komentarza
Share on other sites

13 godzin temu, Norbert7630 napisał:

ale brakuje mi tego elementu który by realizował przejście z pozycja 1 do start/stop

Nie rozumiem... 

Czy wiesz która linijka Twojego kodu odpowiada za to który ekran będzie wyświetlony następny? 

Edytowano przez SOYER
Link do komentarza
Share on other sites

Instrukcja sterująca switch ma zmienną z przypisaną wartością = 1, jeżeli dobrze rozumie to nie jest to wartość stała, bo zmienna int przechowuje liczby od -32768 do 32767,  int numerEkranu = 1;  może przyjmować wartość 1, 2, 3, 4.....bo 4 ekrany. Każdy warunek sprawdzający case ma przypisaną wartość w postaci cyfry: case 1: i pod tym warunkiem jest np. instrukcja warunkowa if coś tam ma się wykonać i wyświetlić na lcd, więc jak wcisnę przycisk down który jest w case 1: to wyświetli mi się pierwszy ekran, tylko że tam też jest linijka:  numerEkranu++; i to chyba ta linijka po wciśnięciu tego przycisku down spowoduje przesunięcie w dół do następnego ekranu. Już mi się wszystko miesza😟

no i teraz jeżeli ta linijka:  numerEkranu++; spowoduje że będzie wyświetlony następny ekran czyli drugi to kolejny case 2: a w nim jest podobna linijka tyle że numerEkranu--; czyli odejmowanie a w tym przypadku powrót do góry do case 1:

ustawiając case 3: chciałbym wejść do trzeciego ekranu START/STOP używając przycisku select 

case(3):
      lcd.clear();
      lcd.print(">START ");
      lcd.setCursor(0, 1);
      lcd.print(" STOP ");
      if (digitalRead(selectButton)){ //jeśli wciśnięty przycisk
   ?????????// tutaj powinienem wpisać coś co wywoła ekran poniżej
      break;

 

Link do komentarza
Share on other sites

i wydaje mi się że przechodzenie z ekranu 1, do ekranu 2 powinno już zadziałać, no nie sprawdzałem bo nie pozwoliłeś 😅 ale wydaje mi się że marker przesuwałby się z POZYCJA 1 do POZYCJA 2 przy użyciu przycisków DOWN i UP, tyle że zamieniłbym kolejność wykonywania operacji w case : najpierw wciśnięcie przycisku, a potem wyświetlenie  na lcd. Nie wiem mogę się mylić ale jak ktoś napisał że kod wykonuje się linijka po linijce to chyba lepiej w takiej kolejności najpierw przycisk a potem lcd.

Link do komentarza
Share on other sites

22 minuty temu, Norbert7630 napisał:

Już mi się wszystko miesza😟

masz rację:) 

Zapytam inaczej, co musisz wpisać w case 1, żeby po wciśnięciu przycisku(dowolnego), w następnej pętli program wyświetlał case 3 a nie case 2? 

Link do komentarza
Share on other sites

no to leże, zupełna pustka w głowie......sądziłem że 3 ekran to START/STOP .....POZYCJA 1 → wciskam przycisk select i wchodzę do ekranu START/STOP....ale dowolny przycisk???? Nie wiem już sam tego trochę nie rozumie 

37 minut temu, SOYER napisał:

w następnej pętli program wyświetlał case 3 a nie case 2? 

pętli?

case(1):

      lcd.clear();
      lcd.print(">POZYCJA 1");
      lcd.setCursor(0, 1);
      lcd.print(" POZYCJA 2");
      if (digitalRead(downButton)){ //jeśli wciśnięty przycisk
    numerEkranu++; // przejdź do następnego ekranu
     delay(100);
     break;

i tutaj mam coś zmienić żeby przejść z case 1: do case 3: ?

Link do komentarza
Share on other sites

🙈🙊🙉

Pierwsza rzecz, nie masz pojęcia jak działa instrukcja warunkowa switch. Wróć do 6 odcinka kursu, tam przed omówieniem instrukcji switch jest takie zdanie, przykład, że można coś zrobić na "if", ale można prościej. Czytaj to tak długo aż zrozumiesz jak działa switch. Wtedy napisz tutaj jak ona działa. 

Druga rzecz, 

15 minut temu, Norbert7630 napisał:

pętli?

wiesz już, że arduino wykonuje program linijka po linijce, tak? 

Napisz mi które z tych linijek, które napiszesz, czasami się wykonają, a czasami nie i dlaczego? 

Napisz mi też, co zrobi program jak dojdzie do końca napisanego kodu? 

Edytowano przez SOYER
Link do komentarza
Share on other sites

else if (digitalRead(selectButton)==LOW) {
    numerEkranu++;
      lcd.clear();
      lcd.print(">START ");
      lcd.setCursor(0, 1);
      lcd.print(" STOP ");

tylko to mi przychodzi do głowy, żeby wstawić w case 1 aby móc przejść do START/STOP, nie wiem, muszę uciekać do pracy. Pozdrawiam

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.