Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 13 lip 2025, o 14:39


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 
    Autor Wiadomość
     Tytuł: Enkoder - menu
    PostNapisane: 13 lip 2017, o 15:59 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    Witam
    Zabrałem się z tworzenie menu, które chciałbym obsługiwać za pomocą enkodera, proszę o podpowiedź, w pętli głównej wyświetlam 4 pozycje menu, za pomocą enkodera zaznaczam sobie jedną z nich.
    Kod:
    void enkoderek(void) {
       buzer();
       if (enco_dir == ENC_RIGHT) licznik++;
       if (enco_dir == ENC_LEFT)  licznik--;

       //licznik = get_encoder();
       if (licznik>3) licznik = 3;
       if (licznik<0) licznik = 0;

    }

    Przyciskiem enkodera wchodzę do wybranej pozycji menu (pętli) i tu za pomocą enkodera chciałbym zmienić wartość jakiejś zmiennej X która ma już jakąś wartość początkową dajmy na to 10, jak to zrobić za pomocą funkcji void enkoderek(void)?

    ------------------------ [ Dodano po: 32 minutach ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 lip 2017, o 16:45 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 paź 2013
    Posty: 1978
    Lokalizacja: Lipsko
    Pomógł: 125

    Po wejściu do wybranej pozycji menu w zasadzie powinna być już aktywna edycja czyli w momencie wejścia przechwytujesz sobie modyfikowana zmienną do dodatkowej zmiennej połączonej z enkoderem, a przy wyjściu z opcji przypisujesz z powrotem do zmiennej właściwej. Nie zagłębiem się w program obsługi enkodera, który tu użyłeś, ale w moich programach upraszcza to wiele rzeczy.

    _________________
    http://www.sylwekkuna.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 lip 2017, o 17:03 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    Zrobiłem tak jak podpowiedziałeś, dałem zmiennej y na początku jakąś wartość
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    ale jak wykonuje się ta pętla to nie działa mi zarejestrowana funkcja zwiększająca zmienną licznik.


    W pętli trzeba odpalić zdarzenie :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 lip 2017, o 17:32 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2016
    Posty: 259
    Lokalizacja: Norwegia
    Pomógł: 16

    Jeżeli używasz biblioteki Mirka, to ja robię w swoich urządzeniach tak:

    1. Rejestruje swoją funkcję dla switcha
    2. Rejestruję swoją funkcję dla encodera

    rejestruję zmienną menuflag = ta zmienna incrementuje za każdym przyciśnięciem switcha i w ten sposób zmieniam poziom menu.
    na przykład
    0 = menu główne
    1 = menu poziom 1
    2 = menu poziom 2
    itd....

    Własna funkcja encodera jest zawsze wspólna dla całego drzewa menu (menu 0, menu 1, menu2...), i zmienia wartości w zależności od flagi Menuflag.

    w ten sposób w pętli głównej programu wywołuję tylko te dwie funkcje które uprzednio zarejestrowałem. Encodir zmienia mi wartości menu w komórce która jest właśnie oflagowana menuflag.

    Nie mam pod ręką teraz moich rozwiązań, wrócę do domu to mogę wkleić jakiś przykład..

    _________________
    SP2LUB - LA1BUA



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 lip 2017, o 17:56 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    Chętnie poznam Twój sposób, najlepiej jakiś prosty abym rozkminił.

    Zrobiłem coś takiego:

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    W funkcji menu0 zarejestrowałem nowe funkcje do obsługi enkodera, a jak z niej wychodzę to rejestruję pierwotne. To pewnie zazłożony sposób, ale nic lepszego nie wymyśliłem, dlatego chętnie zapoznam się z innymi rozwiązaniami.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lip 2017, o 08:43 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    Utworzyłem menu, wchodząc do menu wchodzę do pętli, wychodząc z menu wracam do pętli głównej programu, a jak utworzyć menu aby nie wychodzić z głównej pętli programu? Jeżeli w pętli głównej znajdują się jakieś ważne procesy sterujące to wchodząc do menu, sterowanie z pętli głównej powinno się odbywać jakby w "tle" i nie powinno być zaburzane przez obsługę menu.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lip 2017, o 09:16 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 paź 2013
    Posty: 1978
    Lokalizacja: Lipsko
    Pomógł: 125

    Ja to u siebie nazywam zmienną "tryb" i gdy jest równa zero to jestem na ekranie głównym, wartość jeden to menu, kolejne wartości - wszystko zależy jak rozbudowany jest program i może to być np. kolejne menu (np. serwisowe) lub specjalną faza wykonywanego programu. Wybór trybu i wejście do nieco jest za pomocą zwykłego warunku if. To co ma się stale wykonywać jest poza warunkiem i wykonuje się niezależnie od jakiegokolwiek trybu. Istotnym jest, że cały program ma się wykonywać nieblokująco z maksymalną prędkością, bo w przeciwnym wypadku może to nie działać dobrze.

    _________________
    http://www.sylwekkuna.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lip 2017, o 09:32 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    Właśnie się zastanawiam czy nie wykorzystać funkcji SWICH. A jeszcze chciałbym to obsłużyć enkoderem.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lip 2017, o 09:44 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 paź 2013
    Posty: 1978
    Lokalizacja: Lipsko
    Pomógł: 125

    Teoretycznie można, ale ja akurat switch wykorzystuje w samym menu. Dla dwóch, trzech warunków trybu to raczej nie ma sensu.

    _________________
    http://www.sylwekkuna.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lip 2017, o 12:00 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    SylwekK napisał(a):
    Teoretycznie można, ale ja akurat switch wykorzystuje w samym menu. Dla dwóch, trzech warunków trybu to raczej nie ma sensu.


    Masz jakiś prosty przykładowy kod, jak Ty to robisz.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lip 2017, o 12:35 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 paź 2013
    Posty: 1978
    Lokalizacja: Lipsko
    Pomógł: 125

    Przykładowa struktura programu może wyglądać np. tak:

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Przypominam, że najlepiej będzie to działać jeśli program będzie tak napisany aby w żadnym miejscu nie blokował i nie opóźniał. U mnie nawet obsługa wyświetlacza wywoływana jest cyklicznie i wykonuje się przy jednym obiegu zaledwie kilkanaście niezbędnych mikrosekund, a nie milisekund choć w tym wypadku nie jest to wymóg, a po prostu lubię jak się pętla szybko wykonuje :).
    Wszelkie opcje w menu obsługiwane są również w locie, a wspomagam się tylko znacznikami (flagami) i timerami programowymi do omijania niepotrzebnych w danym momencie fragmentów programu.


    Autor postu otrzymał pochwałę

    _________________
    http://www.sylwekkuna.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lip 2017, o 20:09 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    Jeżeli obsługuję to przyciskami to nie ma problemu, ale jakoś nie mogę tego obsłużyć enkoderem, chodzi mi o to aby w różnych pozycjach menu za pomocą enkodera zmieniać różne parametry programu.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 lip 2017, o 21:11 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    W pętli głównej mam warunki
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    za pomocą przycisku enkodera zwiększam sobie zmienną poz_menu, teraz chcę napisać funkcje do obsługi enkodera - obrót enkodera,
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    chcę aby w zależności od zmiennej poz_menu obracając enkoderem zmieniać zmienna godziny lub minuty, jednak coś mi to nie działa.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 lip 2017, o 10:49 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 sty 2016
    Posty: 1174
    Lokalizacja: Kraków
    Pomógł: 94

    A może w funkcji enkoderek zmieniaj wartość jakiejś zmiennej dodatkowej. A w funkcji main(), w zależności od wartości poz_menu, zwiększasz lub zmniejszasz odpowiednią zmienną.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 lip 2017, o 11:12 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 paź 2013
    Posty: 1978
    Lokalizacja: Lipsko
    Pomógł: 125

    Zrób sobie dodatkową funkcję, która będzie podczas edycji permanentnie wywoływana, w której będziesz czytał przyrost enkodera i w zależności od niej modyfikował zmienną. Funkcja powinna uwzględniać minimalną i maksymalną wartość modyfikowanej zmiennej aby nie wylecieć z zakresu jaki sobie wymyśliłeś.

    ------------------------ [ Dodano po: 42 minutach ]

    Przykład jak to robię u siebie:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    bit pierwszy flagi "edit" togluję przyciskiem enkodera na początku obsługi menu. Pomyśl jak zbudować u siebie funkcję "modyfikuj". Nie zagłębiałem się w Mirka obsługę enkodera to też nie wiem jak tam "wyjście" danych jest zrealizowane.
    xiw to z kolei zmienna pomocnicza INT 16-bitowa. Dzięki temu mam załatwioną konwersję typów (różne zmienne modyfikuję) i łatwiejszą obsługę samej funkcji. Funkcja już sama zadba aby nie przekroczyć krytycznych parametrów i modyfikuje zmienną z zadanym mnożnikiem co w moim przypadku jest bardzo istotne.


    Autor postu otrzymał pochwałę

    _________________
    http://www.sylwekkuna.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 lip 2017, o 21:56 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    Marhef napisał(a):
    A może w funkcji enkoderek zmieniaj wartość jakiejś zmiennej dodatkowej. A w funkcji main(), w zależności od wartości poz_menu, zwiększasz lub zmniejszasz odpowiednią zmienną.

    Dzięki tak właśnie zrobiłem i zadziałało.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 lip 2017, o 06:56 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    SylwekK napisał(a):
    Zrób sobie dodatkową funkcję, która będzie podczas edycji permanentnie wywoływana, w której będziesz czytał przyrost enkodera i w zależności od niej modyfikował zmienną. Funkcja powinna uwzględniać minimalną i maksymalną wartość modyfikowanej zmiennej aby nie wylecieć z zakresu jaki sobie wymyśliłeś.

    ------------------------ [ Dodano po: 42 minutach ]

    Przykład jak to robię u siebie:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    bit pierwszy flagi "edit" togluję przyciskiem enkodera na początku obsługi menu. Pomyśl jak zbudować u siebie funkcję "modyfikuj". Nie zagłębiałem się w Mirka obsługę enkodera to też nie wiem jak tam "wyjście" danych jest zrealizowane.
    xiw to z kolei zmienna pomocnicza INT 16-bitowa. Dzięki temu mam załatwioną konwersję typów (różne zmienne modyfikuję) i łatwiejszą obsługę samej funkcji. Funkcja już sama zadba aby nie przekroczyć krytycznych parametrów i modyfikuje zmienną z zadanym mnożnikiem co w moim przypadku jest bardzo istotne.


    Pomysł z napisaniem funkcji "modyfikuj" bardzo fajny bardzo poprawia czytelność kodu, mam 2 pytanka:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    - dlaczego przed xiw jest & ?
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    - nie wystarczy w warunku sam edit ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 lip 2017, o 07:22 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 paź 2013
    Posty: 1978
    Lokalizacja: Lipsko
    Pomógł: 125

    Co do pierwszego pytania to chodzi o przekazanie adresu zmiennej (w tym miejscu namawiam do zaopatrzenia się w BB gdzie wszystko jest ładnie opisane) natomiast edit oczywiście może być samodzielny o ile nie wykorzystujesz go jeszcze w innych celach... Ja wykorzystuje, bo mam różne typy edycji w różnych miejscach :)

    _________________
    http://www.sylwekkuna.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 lip 2017, o 07:46 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    Oczywiście mam BB, tylko dlaczego do funkcji przekazujemy zmienną poprzez jej adres a nie bezpośredni przez jej nazwę?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 lip 2017, o 08:14 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 paź 2013
    Posty: 1978
    Lokalizacja: Lipsko
    Pomógł: 125

    Szczerze mówiąc to już nie pamiętam, bo dość dawno to pisałem, a bez tego znaczka coś nie działało po mojej myśli :)

    _________________
    http://www.sylwekkuna.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 lip 2017, o 08:23 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2014
    Posty: 155
    Zbananowany użytkownik

    Pomógł: 0

    Jak czytam BB to czaję wskaźniki, Mirek to wyłożył łopatologicznie ale dzięki temu bardzo zrozumiale, jeżeli chodzi o to aby je zastosować to już gorzej jeszcze nie czuję do końca. Dzięki za pomoc poeksperymentuje z tym kodem.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO