Skocz do zawartości

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


Pomocna odpowiedź

7 godzin temu, Norbert7630 napisał:

chyba powinienem użyć instrukcji:


#define selectButton 8

bardzo dobrze👍

7 godzin temu, Norbert7630 napisał:

zmiennej ,, if "

znowu coś pokręciłeś👎

@Norbert7630 naprawdę poświęć kilka wieczorów na przeczytanie pierwszych lekcji pierwszego kursu arduino, zrób wszystkie ćwiczenia i zaręczam Ci, że przestaniesz mylić ify, inty i definki😁

  • Lubię! 1
Link to post
Share on other sites

Kurczę ale ze mnie głąb, masz racje Soyer nie o ,,if'' chodziło tylko o ,,int'' 😅 literówka przepraszam. No nic lecę jeszcze raz do kursu poczytać, a tak na marginesie to jeśli chodzi o to wyrażenie: 

int menu = 1;

Jest poprawne czy też będzie dyrektywa #define.

Link to post
Share on other sites

Posiedziałem trochę i poczytałem nawet kilka razy, ale średnio mi do głowy to wchodzi......no cóż to już nie te latka do nauki😔. Próbowałem coś tam naskrobać żeby to menu ożyło i raczej kiepsko mi to wyszło:

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

LiquidCrystal_I2C lcd(0x27, 16, 2);

#define upButton  9
#define downButton  10
#define selectButton 11
#define diodaLedZielona 2
#define diodaLedCzerwona 3
int menu = 1;


void setup() {
 lcd.begin();
  lcd.backlight();
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  pinMode(diodaLedZielona, OUTPUT);
  pinMode(diodaLedCzerwona, OUTPUT);
  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));
  
  /*if (!digitalRead(backButton)){
    executeAction();
    updateMenu();
    delay(100);
    while (!digitalRead(backButton));*/
 }
}
void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;
    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 5:
      menu = 1;
      break;
    }
}
    
    void executeAction() {
  switch (menu) {
    case 1:
      action1();
   if (!digitalRead(selectButton)== LOW){  
      digitalWrite(diodaLedZielona, HIGH);}
      else{(!digitalRead(selectButton)== HIGH);  
      digitalWrite(diodaLedZielona, LOW);}
    break;
    
    case 2:
      action2();
      if (!digitalRead(selectButton)== LOW){  
      digitalWrite(diodaLedCzerwona, HIGH);}
      else{(!digitalRead(selectButton)== HIGH);  
      digitalWrite(diodaLedCzerwona, LOW);}
      break;
    }
  }

   void action1() {
  lcd.clear();
  lcd.print(">START  ");
  lcd.setCursor(0, 1);
  lcd.print(" STOP  ");
  delay(900);
}
void action2() {
  lcd.clear();
  lcd.print(" START  ");
  lcd.setCursor(0, 1);
  lcd.print(">STOP  ");
  delay(1000);
}

Działać to działa ale raczej mizernie, w momencie kiedy jestem w menu na (pozycji 1) i nacisnę przycisk selekt żeby wejść do menu START / STOP wtedy włącza się zielona dioda po około nie całej sekundzie domyślam się że odpowiada za to ten fragment kodu z delay:

 void action1() {
  lcd.clear();
  lcd.print(">START  ");
  lcd.setCursor(0, 1);
  lcd.print(" STOP  ");
  delay(900);
}

choć pewności  nie mam i oczywiście razem z uruchomieniem się diody zielonej wychodzi automatycznie do menu POZYCJA 1. Natomiast chcąc wyłączyć diodę to znowu wciskam przycisk selekt ale tym razem go przytrzymując chwilę i dioda gaśnie z jednoczesnym wyjściem do menu POZYCJA 1. Analogicznie do sytuacji z zieloną diodą ma się sytuacja z czerwoną diodą, więc program niby działa ale zabawnie, pomijając fakt że czasem też i przyciski nie chcą zareagować. Próbuje jakoś ożywić to menu tak żeby w momencie przejścia z POZYCJA 1 DO → START/STOP tam się zatrzymywać i z jednoczesnym przesunięciem markera na START lub STOP włączać lub wyłączać np. diodę. Mam wrażenie że chyba trzeba utworzyć funkcję do tej części tak jak w przypadku :

 POZYCJA 1

POZYCJA 2

void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;
    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 5:
      menu = 1;
      break;
    }
}

Tyle że nie wiem nawet jak się do tego zabrać choć próbowałem.

Link to post
Share on other sites

@Norbert7630 widzę, że niestety dalej walczysz po omacku próbując zrozumieć kod z ctrl+c---ctrl+v... 

Teraz są dwie drogi:

pierwsza, próbujesz zrozumieć, dowiedzieć się co robi każda linijka Twojego kodu, i na dowód tego robisz komentarz przy każdej linijce z opisem jej funkcji, potem nam to wklejasz i przerabiasz kod dalej

druga też podobna, kasujesz cały ten kod i zaczynasz pisać od początku po przeczytaniu kursu arduino oraz tego tematu, całego, to temat o tym jak ja robiłem menu 3 lata temu. Jego głównym tematem jest funkcja millis(), temat poruszony też w kursie, bez tego Twoje menu nie będzie prawidłowo reagować na przyciski. Musisz zapomnieć o delay. 

Na koniec małe pocieszenie dla Ciebie, to tekst jaki napisał mi kolega @ethanakwtedy, miał rację, ale siadłem i zrobiłem to, choć zajęło to wieeeeele godzin główkowania. To ten post:

A takie pytanie... Ty w ogóle rozumiesz to co robisz, czy bezmyślnie przepisujesz fragmenty kodu z jakichś programów nie dbając o to, czy mają jakikolwiek sens?

Jest uważasz że rozumiesz - to mylisz się.

Jest przepisujesz i uważasz że to musi działać - zgłoś się do Antka Emigranta na Onecie. Pewnie nie pomoże, ale przynajmniej pogłaszcze po główce...

Ktoś Ci już powiedział - zacznij od czegoś prostszego.

Moja dobra rada: duuuuuużo prostszego.

🤪😁👍

Link to post
Share on other sites
(edytowany)
6 godzin temu, SOYER napisał:

Teraz są dwie drogi:

pierwsza, próbujesz zrozumieć, dowiedzieć się co robi każda linijka Twojego kodu, i na dowód tego robisz komentarz przy każdej linijce z opisem jej funkcji, potem nam to wklejasz i przerabiasz kod dalej

No skoro się tak upierasz że mnie starego dziadka czegoś nauczysz to ok, ale od razu Cię uprzedzę że twoje szanse na to są dokładnie takie same jak moje w obecnej chwili na stworzenie tego kodu😂. A więc po kolei z tym kodem co mi się wydaję że rozumie:

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

Biblioteki potrzebne do działania np. LCD 16x2

LiquidCrystal_I2C lcd(0x27, 16, 2);

adres wyświetlacza i rozmiar czyli 2 linijki w każdej po 16 znaków, adres można odczytać skanerem I2C po otwarciu monitoru szeregowego

#define upButton  9
#define downButton  10
#define selectButton 11
#define diodaLedZielona 2
#define diodaLedCzerwona 3

define - dyrektywa lub instrukcja jak zwał tak zwał, mam tutaj zdefiniowane przyciski i diody opatrzone nazwą i z przypisanym numerem pinu na mikro-kontrolerze, jeżeli zajdzie potrzeba zmiany pinu wystarczy zmienić tutaj, a wtedy w każdym miejscu kodu gdzie występuje dana

fraza przy której zmieniamy ten pin, nastąpi także zmiana.

int menu = 1;

tego nie rozumie, ale int to zmienna z nazwą ,, menu" przechowująca cyfrę 1 i wykonująca na tej liczbie jakąś operację później. Nie wiem czy nie powinna być tu dyrektywa #define  ale jak zwykle mogę się mylić

void setup() {
 lcd.begin();
  lcd.backlight();
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  pinMode(diodaLedZielona, OUTPUT);
  pinMode(diodaLedCzerwona, OUTPUT);
  updateMenu();
}

to funkcja setup wszystko co się w niej znajduje wykonuje się raz tutaj akurat informuję mikro-kontroler czyli np: pin 9 jest wejściem w dodatku z podciągniętym rezystorem, natomiast pin 2 to wyjście do którego podłączona jest dioda, wyrażenia ,, updateMenu(); ja nie znaju😂 nie ma przed tą frazą ani dyrektywy ani zmiennej po prostu nie wiem co ma ta fraza wykonywać w programie jeśli dobrze pamiętam to z angielskiego ,, update " na nasz oznacza aktualizacje lub coś podobnego.

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

To jest funkcja główna pętla ,, void loop() " w niej się wszystko wykonuje w kółko, ,, if " to warunek i tu nie do końca wszystko rozumie o ile w ogóle rozumie. Na początku w nawiasie powinien się znajdować warunek a następnie po zamknięciu nawiasów zwykłych i otwarciu klamrowych wszystko to co ma się wykonać w przypadku spełnienia tego warunku czyli coś takiego:

void loop() {
 if (digitalRead(2)==LOW){
   digitalWrite(5, HIGH);
   }  
    delay(100);
   
 

 Jeśli przycisk na pinie 2 wcisnę to zaświeci się dioda na pinie 5. nie mogę tylko tak do końca zrozumieć tego stanu przycisku bo w tej pierwszej linijce po if jest stan określony na niski ,, LOW " ale jest to stan w momencie wciśnięcia przycisku czy przed jego wciśnięciem. Tak jak ja to rozumie to Tact Switch nie wciśnięty nie powinien zwierać dwóch styków GND i +5v na pinie np: 2 więc jest stan LOW czyli niski a po wciśnięciu zwiera i jest HIGH. Nie wiem chyba jeszcze raz poszukam informacji w kursie jak to działa. W każdym bądź razie tą część kodu opisałem.

menu++;
    updateMenu();

tej części nie rozumie, coś jakby po wciśnięciu przycisku ma się wykonać działanie matematyczne dodawanie ,, menu++ '' a następnie ma być wykonany ,, updateMenu " 

 while (!digitalRead(downButton));

while jest pętlom i tutaj podobna zasada co do warunku ,, if " z tym że kod znajdujący się w nawiasach klamrowych wykonuje się w kółko do momentu spełnienia warunku w nawiasach zwykłych, w momencie kiedy warunek przestanie być spełniany nastąpi wyjście z tej pętli do kodu który jest w głównej pętli. Czyli z fragmentu kodu powyżej wciśnięcie TACT SWITCHA o nazwie  ,, downButton" ma wywołać określoną reakcję w części pętli znajdującej się w nawiasach klamrowych w tym przykładzie nie podanym. Nie rozumie tylko tego wykrzyknika przed frazą ,, !digitalRead " i jakie zadanie ma tutaj ta pętla skoro w nawiasach klamrowych nie ma żadnego kodu do którego ona by się odwoływała. To tak jakby miała za zadanie zatrzymać program aż do momentu nie niespełnienia jej warunku, czyli program działa cały czas a po wciśnięciu przycisku czyli nie spełnienia warunku wychodzi z tej pętli do następnej części  kodu, nie wiem coś takiego według mnie, ale jak zwykle mogę się mylić

if (!digitalRead(upButton)){
    menu--;
    updateMenu();
    delay(100);
    while(!digitalRead(upButton));
  }

Ta część kodu była już opisana z tą małą różnicą że tu jest chyba działanie matematyczne odejmowanie ,, menu-- " Owszem i nie do końca to rozumie coś jakby warunek w ,, if -ie " wciśnięty przycisk czyli spełniony to kod w nawiasach klamrowych powinien się wykonać ,, menu-- " coś jakby odjęcie o 1, lub cofnięcie wstecz, w tym przypadku przejście np. z POZYCJA2 do POZYCJA1 tak jakoś to sobie tłumacze. No i na dole tej części kodu pętla ,, while " opisana wcześniej.

if (!digitalRead(selectButton)){
    executeAction();
    updateMenu();
    delay(100);
    while (!digitalRead(selectButton));

Kolejny przycisk i tutaj to już nie wiele mogę powiedzieć bo nie wiele rozumie. Nie ma żadnego działania matematycznego po ,, if-ie " tylko fraza ,,   executeAction " z nawiasami zwykłymi oraz wyżej wspomniane ,, updateMenu ". To tak jakby ten warunek ,, if " odwoływał się do tej części programu:

void executeAction() {
  switch (menu) {
    case 1:

Następnie kolejna część kodu to już nie wiadoma:

void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;
    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 5:
      menu = 1;
      break;
    }
}

na pewno jest to funkcja bo znajduje się tu słowo kluczowe ,, void " funkcja ta odnosi się do ustawień w menu. Następnie instrukcja sterująca ,, Switch "  w nawiasach zwykłych przy niej podana jest zmienna do sprawdzenia, w tej części kodu to (menu), a dalej nawias klamrowy i warunki o nazwie ,, case " może być ich dowolna ilość. Według kursu (switch)  podaje zmienna do sprawdzenia a (case-y) warunki które będą sprawdzane kolejno. Jak ja to rozumie? A więc:

switch (1) { //zmienna z przypisaną wartością
    case 1: // warunek czy jest równy zmiennej
    //kod który się wykona w pzypadku spełnienia warunku
    break // wyrażenie po którym program wyjdzie w przypadku spełnienia warunku całkiem ze switcha lub w przypadku nie spełnienia warunku do kolejnego case

............

switch (menu) {  // tutaj zmienna w switch ma wartość o nazwie menu na początku programu była zadeklarowana int menu = 1; więc chuba chodzi o 1
    case 0: // warunek w case to 0 czyli analogicznie do poprzedniego przykładu warunek nie jest równy zmiennej 
      menu = 1; //kod się nie powinien wykonać
      break; // po słowie break przejście do kolejnego case

w tym przykładzie pierwsza część kodu to tylko przykład jak ja to rozumie, natomiast druga część kodu jest wycięta z programu i także opisana jak według mnie się wykona. Jednak nie potrafię tego logicznie uporządkować i wykreślić to co nie potrzebne a wstawić to co potrzebne. Ogólnie Soyer szanuje jak cholera twoje doświadczenie i wiedzę i bardzo ci jej zazdroszczę, ale nie rozumie tego ciągłego odsyłania do czytania czegoś tam, nie wiem czy zwróciłeś uwagę na to że przy kursie dla początkujących ,,Kurs Arduino, poziom I (podstawy) - mile widziana znajomość podstaw elektroniki" właśnie, ja nie mam nawet tej podstawy, czytając wasze wypowiedzi gdzie często używacie języka technicznego, dla mnie to czarna magia. 😥 Spróbuje dzisiaj posiedzieć nad tym co napisałeś czyli poczytać twój temat o tworzeniu menu. Byłbym zapomniał nie wiem co oznacza ten kod 

 

6 godzin temu, SOYER napisał:

kod z ctrl+c---ctrl+v... 

ale po przeczytaniu całej twojej wypowiedzi chodzi o kopiuj/wklej.... nie jest tak do końca że bezmyślnie wycinam czy kopiuje i wklejam za każdym razem siedzę potem jeżeli to co stworzyłem na tej zasadzie działa i sprawdzam linijka po linijce co one oznaczają, tak właśnie zrobiłem swój pierwszy zegar oparty na module RTC 1302 z LCD 16X2 i tam też miałem problem bo w raz z odliczaniem sekund na ekranie migało mi także delikatnie podświetlanie równo co sekundę tak jakby podświetlenie było sparowane z sekundnikiem 😂 i gdybym teraz zrobił to tak jak mówisz kopiuj/wklej to olałbym temat bo działa to działa, ale ja sobie siadłem i zacząłem cały kod analizować aż w końcu znalazłem przyczynę, wystarczyło tylko w odpowiednie miejsce przestawić delay(1000) i po sprawie. Z drugiej strony zaczynanie pisania kodu od nowa też nie do końca się sprawdzi bo tam jest kilka nie jasności odnośnie tego choćby updateMenu czy void action1, jak to połączyć z innymi funkcjami jak dla mnie mało czytelne. No i na koniec mała uwaga na temat tego kursu, ogólnie jest fajnie napisany powiedziałbym wręcz w miarę czytelny i zrozumiały ale nie które przykłady są jak dla mnie trudne np:

int odebraneDane = 0; //Pusty ciąg odebranych danych
 
void setup() {
  Serial.begin(9600); //Inicjalizacja UART
}
 
void loop() {
  int potencjometr = analogRead(A5); //Odczytanie wartości ADC
  
  if(Serial.available() > 0) { //Czy Arduino odebrano dane
    odebraneDane = Serial.read(); //Jeśli tak, to odczytaj 1 znak
  }
  
  switch (odebraneDane) {
    case 'd':
      Serial.println(potencjometr, DEC);
    break;
    case 'h':
      Serial.println(potencjometr, HEX);
    break;
    case 'o':
      Serial.println(potencjometr, OCT);
    break;
    case 'b':
      Serial.println(potencjometr, BIN);
    break;
  }
 
  delay(1000); //Opóźnienie dla wygody
}

to jeden z przykładowych kodów z kursu ja akurat nie za bardzo ten kod rozumie, gdyby był oparty na przykładzie diod Led tak jak spora część kursu do tego momentu byłoby mi łatwiej. Tutaj natomiast komunikacja przez UART, przyznam szczerze nawet nie za bardzo mnie to interesuje (wpisz do monitora szeregowego ,, cześć " a on odpowie ci ,, cześć Kolo" ) wolę bardziej praktyczne rozwiązania związane z Arduino 😉. Podsumowując wiesz już Soyer jak ja to widzę, jeżeli w którymś momencie czytając mój tekst odniosłeś wrażenie że się wymądrzam to od razu mówię że tak nie jest, piszę z pełną pokorą i szacunkiem do Ciebie i wszystkich którzy to czytają. Pozdrawiam.

 

 

Edytowano przez Norbert7630
błedy
Link to post
Share on other sites

Hm...

25 minut temu, Norbert7630 napisał:

skoro się tak upierasz że mnie starego dziadka

Biorąc pod uwagę Twój inny post

  

Dnia 16.02.2020 o 11:49, Norbert7630 napisał:

Mam na imię Norbert,  44 latka,


chyba powinieneś, młody człowieku, nieco szacunku starszym okazać i np. po fajki skoczyć a nie udawać Dziadka Mroza 😉

A co do rozumienia:

27 minut temu, Norbert7630 napisał:

Nie rozumie tylko tego wykrzyknika przed frazą ,, !digitalRead "

No to może zapoznaj się z alfabetem języka, bo nikt tu nie będzie pięćset razy każdemu tłumaczył podstaw, które są wyjaśnione w kursie i w podręcznikach języka. Nic dziwnego, że nic Ci nie wychodzi. To tak, jakbyś spróbował napisać wiersz nie znając połowy liter...

Tyle ode mnie, wróć jak poznasz podstawy. Wszystkie podstawy, a nie tylko wybrane co ciekawsze.

 

 

  • Nie zgadzam się! 1
Link to post
Share on other sites
(edytowany)

@Norbert7630 nie zrozumieliśmy się. Ty wklejasz taki kod:

43 minuty temu, Norbert7630 napisał:

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

a omawiasz go na podstawie tego kodu:

43 minuty temu, Norbert7630 napisał:

void loop() { if (digitalRead(2)==LOW){ digitalWrite(5, HIGH); } delay(100);

tak to nic się nie nauczysz... 

jeśli wybierasz sposób na poprawianie tego co masz, to musisz zrozumieć co masz. 

Skoro jednak nie wiesz tak podstawowej rzeczy

43 minuty temu, Norbert7630 napisał:

Nie rozumie tylko tego wykrzyknika przed frazą ,, !digitalRead

to naprawdę wiele nauki przed tobą... 

 

43 minuty temu, Norbert7630 napisał:

ale nie rozumie tego ciągłego odsyłania do czytania czegoś tam

No niestety nikt Ci tego magicznie do głowy nie wsadzi ani za Ciebie nie napisze. Musisz sam poświęcić mnóstwo czasu. 

Przeczytałeś 5 razy ten temat który Ci podesłałem poprzednio, zrozumialeś wszystko? Jak nie to wracaj do tego i do kursu. 

Potem jak zechcesz opiszesz każdą linijkę w kodzie, prawidłowo i ze zrozumieniem... 

Np. :

if(!digitalRead(button){ //warunek:jeśli pin od buttona ma stan niski to... 

po kolei, cały kod...

albo piszesz od nowa... 

to i to po przeczytaniu co Ci zadałem;) 

Takie menu naprawde nie jest trudne, ale musisz znać podstawy, wiedzieć co to funkcja, zmienna, operatory logiczne i jeszcze parę innych rzeczy. 

Edytowano przez SOYER
  • Lubię! 1
Link to post
Share on other sites

Rozumiem cię Soyer i zgadzam się z tobą, moja wiedza jest mierna no i nie do końca faktycznie się zrozumieliśmy😅 . Wstawiając te części kodu dołączałem opis poniżej lub powyżej tego kodu jak to działa czy co tam  się dzieje, tak jak w przypadku pętli while itp. myślałem że podpowiesz mi czy dobrze rozumie czy nie.  No ale nie ważne masz racje muszę jeszcze gdzieś poszukać w sieci innych kursów i coś więcej poczytać, dziękuje za zainteresowanie tematem Soyer. Odnośnie wypowiedzi kolegi ethanak to nawet nie przypuszczałem że język programowy C czy C++ można zastosować do charakteru człowieka np. funkcja cwaniak i zmienne sarkazm oraz ironia, jeżeli w ogóle kolego rozumiesz co mam na myśli. Natomiast jeśli chodzi o wiek, to co nie którzy liczą go na podstawie upływu czasu a nie którzy na podstawie dźwiganego bagażu doświadczeń. Mogę mieć 45 lat ale być zmęczony życiem jak 60-cio latek. Temat zamknięty, pozdrawiam. 

 

Link to post
Share on other sites

@Norbert7630 nie musisz szukać gdzie indziej i mieszać poziomów nauczania. Dwa kursy arduino na forbocie w zupełności Ci wystarczą do ukończenia tego projektu i wielu innych. Kolegi @ethanaksłuchaj, ucz się od niego, tak samo jak od innych forumowiczów. Każdy ma specyficzny sposób wyrażania swoich myśli;). Różne nie znaczy w tym przypadku gorsze i lepsze. 

Link to post
Share on other sites

@Norbert7630 jak sam napisałeś to kurs podstaw, musisz przerobić cały, poważnie. Wtedy wróć do tego Twojego kodu i sprawdź czy rozumiesz każdą linijkę, jeśli dalej nie to albo wróć jeszcze raz do kursu albo napisz swój kod. Po skończeniu kursu powinieneś dać spokojnie radę. 

W razie pytań i wątpliwości pisz tutaj, nie zapomnij o tym temacie który Ci podlinkowałem o millis, jest tam nie tylko o millis. Zaglądnąłeś chociaż? Maszyna stanów, rysunek na kartce co ma być po czym i z czym zależne...? 

Link to post
Share on other sites
(edytowany)

@SOYER tak byłem w tym podlinkowanym temacie od Ciebie, no rysunku na kartce nie widziałem tam, ale była tam grafika wstawiona chyba przez Elvisa. Staram się to jakoś ogarnąć ale nijak to się ma do tego mojego nieszczęsnego menu. Więc jeszcze raz:

                       wciśnij przycisk (wejdź do START/STOP)           START    wciśnij przycisk przejdź do STOPpo wyborze START wciśnij

                                                                                                                                                                                                  przycisk i uruchom coś tam

POZYCJA 1                                 ↔                                                 STOP       wciśnij przycisk wróć do STARTpo wyborze STOP wciśnij przycisk                                                                                                                                                                                                                   i wyłącz  coś tam 

                        wciśnij przycisk (wyjdź do POZYCJA 1)

↓↑                           

                                                                                                                    START   

POZYCJA 2                               ↔                                                             STOP      

 

 

Taka uproszczona grafika mojego menu, bo nie wiem jaki program użyć i jak się nim posługiwać żeby stworzyć taką grafikę przykładową jak Elvis. Nawet nie wiem czy czytelnie tą grafikę wykonałem. Pozycji 2 nie rozpisywałem bo będzie analogicznie do pozycji 1. Jeżeli wiem już jak ma wyglądać menu i jak działać wybieram obsługę za pomocą przycisków(button). Definiuje te przyciski do czego maja służyć: 1 góra(up), 2 dół(down), 3 wybór(select), 4 powrót(back)...... czyli 4 przyciski. Teraz zastanawiam się jak ten mój przykład przypasować do wyżej wspomnianego przykładu Elvisa o tych stanach i raczej ni jak mi to nie pasuje. W moim menu za przesuwanie markera z pozycji 1 do pozycji 2 będzie służył przycisk hm...... zaraz a może to właśnie jest ten pierwszy stan tylko ja w tym przykładzie użyłem nie czasu (timeout 20 sek) do przejścia z pozycji 1 → na pozycje 2  a samochodu czyli przycisku. To wychodzi na to że każde przejście z jednej pozycji na drugą w menu jest zmianą stanu. Namieszałem znowu????😂 Wcale bym się nie zdziwił@SOYER  idę spać bo już psychicznie siadam od tych stanów, pinów, definów itp....popraw mnie jeżeli znowu coś pokręciłem. 

Edytowano przez Norbert7630
błędy
Link to post
Share on other sites
(edytowany)

@Norbert7630 Spróbuj popatrzyć na swój problem od strony komputera. Spróbuj swoimi słowami napisać algorytm który chcesz zaprogramować. Może coś w tym rodzaju:

start programu;
Sprawdzam i zapamiętuję czy naciśnięto przycisk A;
Jeśli naciśnięto przycisk A to wykonuję operację OA ;
Sprawdzam i zapamiętuję czy naciśnięto przycisk B;
Jeśli naciśnięto przycisk B to wykonuję operację OB ;
        ...
Koniec programu;

Operacja OA: 
     ...

Operacja OB:
     ...

Potem zastanów się, czy to jest naprawdę to co chciałeś uzyskać. Następnie, czy wiesz jak napisać w języku komputera to co wcześniej zapisałeś.

Zadbaj o odpowiedni poziom szczegółowości. To nie "startuję --> lecę --> ląduję" ale "sprawdzam listę startową..." a może nawet poszczególne punkty tej listy. W operacjach musisz uwzględnić m. in. wygląd ekranu, odróżnić sytuację "zaznaczam pozycję z menu" od "wykonuję działania przypisane do pozycji" itd.

Napisz konkretne menu na którym chcesz operować i sprawdzaj pozycja po pozycji czy zapisany przez ciebie algorytm zachowuje się tak jak chciałeś, czy ekran po naciśnięciu kolejnego przycisku wygląda tak jak chciałeś, jak zmienia się po kolejnych naciśnięciach. Wszystko to "na sucho" bez programowania komputera.

Zaproponowano ci zapoznanie się z automatem skończenie stanowym to bardzo przydatne i uniwersalne narzędzie. Warto.

Odbiegając nieco od tematu. Pamiętam, że kiedyś wracając z ojcem z przedszkola zapytałem go, czy jak kręci się kierownicą w lewo to samochód skręca w lewo, a jak kręci się w prawo, to skręca w prawo. Ojciec odpowiedział "tak". Pamiętam iż byłem wtedy święcie przekonany, że potrafię prowadzić samochód. Zachowując właściwe proporcje, jesteś na podobnym etapie, a przynajmniej tak wynika z niektórych twoich wypowiedzi. Tak przy okazji, wykrzyknik w języku C to operator negacji.

Pytaj, ale najpierw musisz poznać podstawy, aby zadać pytanie tak, by miało szanse na zadowalającą cię odpowiedź.

Edytowano przez bjrk
Doprecyzowania
  • Lubię! 2
Link to post
Share on other sites
(edytowany)
9 godzin temu, Norbert7630 napisał:

Taka uproszczona grafika mojego menu, bo nie wiem jaki program użyć i jak się nim posługiwać żeby stworzyć taką grafikę przykładową

Wystarczy kartka i ołówek i rysujesz, czytelnie, nie jak ja, mniej więcej coś takiego :

 

IMG_20210117_095923.jpg

Potem jak przerobisz kurs, to prostym językiem napiszesz sobie to menu. 

Teraz pomyśl, każda taka ramka to jeden ekran lcd i jeden przypadek case z instrukcji switch z 6 zdaje się odcinka kursu. Także wracaj i czytaj.  Cały kurs. 

Edytowano przez SOYER
  • Lubię! 1
Link to post
Share on other sites

@bjrk @SOYER dziękuje za wasze rady, cały kurs przerobie od nowa, jednak w tej chwili trochę zastanawiam się, i tu wyda wam to się śmieszne jak wam pomóc żebyście wy pomogli mi z tym problemem😅. Może tak@SOYER narysowałeś mi swoją wizje działania tego menu i jedna cecha wspólna twojego menu z moim jest......są to przyciski. Twoje menu jest a raczej zakładam bardziej profesjonalne i tu nie obraź się na mnie bo to nie żadna krytyka tylko takie moje spostrzeżenie, dla mnie laika jest chaotyczne. Bo np. nie wiem gdzie w tym menu jest ekran początkowy który będzie się wyświetlał po załadowaniu programu na płytkę Arduino. Tworząc swoją grafikę menu właśnie to uwzględniłem, że mam na grafice to co będę miał na wyświetlaczu: POZYCJA 1→START/STOP→WŁĄCZ /WYŁĄCZ oczywiście twoja wizja jest dla ciebie i innych zrozumiała no i dokładniejsza bo ty uwzględniłeś nawet markery ∨∧ ale dla mnie sebixa w programowaniu już nie. Może tak koledzy jeżeli chcecie mi pomóc to prosiłbym żebyście się skupili na tym co ja źle robię i mnie poprawiali na moich przykładach bo wasze choć o niebo lepsze jak w przypadku rys.@SOYER dla mnie są mało czytelne. Kolega@bjrk podpowiedział mi mniej więcej jak się mam do tego zabrać (też wdzięczność) ale ja widzę tam też pewną podpowiedź w innym kierunku i nie wiem czy dobrze myślę.....START PROGRAMU void loop()

10 godzin temu, bjrk napisał:

Sprawdzam i zapamiętuję czy naciśnięto przycisk A;
Jeśli naciśnięto przycisk A to wykonuję operację OA ;
Sprawdzam i zapamiętuję czy naciśnięto przycisk B;
Jeśli naciśnięto przycisk B to wykonuję operację OB ;
        ...
Koniec programu;

Operacja OA: 
     ...

Operacja OB:
     ...

sprawdzam i zapamiętuje czy naciśnięto przycisk A tłumaczenie na język programu:

if (digitalRead(9)==LOW){ //jeśli przycisk wciśnięty

jeśli naciśnięto przycisk A wykonuję operacje OA znowu tłumaczenie:

digitalWrite(5, HIGH) //włącz diode na pinie 5
}

czyli nawigacja po menu odbywa się za pomocą warunku if ? Pozostałej części czyli to koniec programu i poniżej nie rozumie. Przepraszam cię @bjrk po prostu jestem cienias. @SOYER mam do ciebie wielką prośbę, wróć do mojej wypowiedzi w której w której zrobiłem opis instrukcji sterującej switch/case jak ja to rozumie że działa, bo jak znowu odeślesz mnie do kurs to zwariuje 🤪😂 zobacz mój opis działania i napisz gdzie moje myślenie jest błędne.

 

21 godzin temu, Norbert7630 napisał:

switch (1) { //zmienna z przypisaną wartością case 1: // warunek czy jest równy zmiennej //kod który się wykona w pzypadku spełnienia warunku break // wyrażenie po którym program wyjdzie w przypadku spełnienia warunku całkiem ze switcha lub w przypadku nie spełnienia warunku do kolejnego case

 no dobra już kapnąłem się jak to przerzucić tutaj choć to cytowanie selektywne trochę zmienia oryginał. @SOYER i chyba zrobię tak jak mi podpowiadasz, cały kod na nowo.

Link to post
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

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.