SOYER Styczeń 11, 2021 Udostępnij Styczeń 11, 2021 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 1
Norbert7630 Styczeń 11, 2021 Udostępnij Styczeń 11, 2021 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.
Norbert7630 Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 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.
SOYER Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 @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.
Norbert7630 Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 (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 Styczeń 16, 2021 przez Norbert7630 błedy
ethanak Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 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. 1
SOYER Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 (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 Styczeń 16, 2021 przez SOYER 1
Norbert7630 Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 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.
SOYER Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 @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.
Norbert7630 Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 Podpowiedz mi Soyer tylko na które części kursu podstawy Arduino mam zwrócić uwagę, żeby na razie zacząć jakoś pisanie tego menu.
SOYER Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 @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...?
Norbert7630 Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 (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 STOP→po wyborze START wciśnij przycisk i uruchom coś tam POZYCJA 1 ↔ STOP ↑ wciśnij przycisk wróć do START→po 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 Styczeń 17, 2021 przez Norbert7630 błędy
bjrk Styczeń 17, 2021 Udostępnij Styczeń 17, 2021 (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 Styczeń 17, 2021 przez bjrk Doprecyzowania 2
SOYER Styczeń 17, 2021 Udostępnij Styczeń 17, 2021 (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 : 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 Styczeń 17, 2021 przez SOYER 1
Norbert7630 Styczeń 17, 2021 Udostępnij Styczeń 17, 2021 @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.
Pomocna odpowiedź
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ę »