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 14 lip 2025, o 21:46


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
    Autor Wiadomość
    PostNapisane: 28 sty 2016, o 18:51 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 lis 2015
    Posty: 219
    Pomógł: 20

    Witam wszystkich!

    Zafascynowała mnie funkcja do obsługi drgań styków z forum Mirka.
    Chciałbym ją zmodyfikować w ten sposób żeby zwracała mi rezultat w zależności od wciśniętego klawisza. Jednak napotkałem problem którego chyba nie uda mi się rozwiązać bez Waszej pomocy.
    Otóż zmodyfikowana funkcja wygląda jak poniżej:

    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.


    Problem jest w tym, że przycisk nie reaguje prawidłowo. Tzn. dioda zmienia stan na przeciwny, ale nie za każdym razem np po dwóch naciśnięciach.

    Postanowiłem zrobić mały test.
    Użyłem dodatkowo jednej diody żeby zobaczeć co się dzieje w poszczególnych fragmentach funkcji
    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 tym przypadku dioda pomocnicza działa prawidłowo, za każdym wciśnięciem reaguje. A w funkcji głównej nie działa dioda 2. tzn działa ale dioda pomocnicza zmienia się tak jak powinna (za każdym nacisnieciem) a dioda led1 za np 2 albo 3

    Poniżej funkcja main

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


    Proszę, nakierujcie mnie gdzie robię błąd:)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 sty 2016, o 21:01 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 25 lis 2013
    Posty: 108
    Pomógł: 0

    Mam pytanie masz zdefiniowany jeden ,czy dwa przyciski?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 sty 2016, o 21:13 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 lis 2015
    Posty: 219
    Pomógł: 20

    zdefiniowane oba. Ustawione jako wejscia i podciagniete



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 sty 2016, o 21:29 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 25 lis 2013
    Posty: 108
    Pomógł: 0

    Sorry z kodu wynika , że masz dwa klawisze .A diody nie zmieniają stanu jak naciskasz klawisz szybko , wolno , czy to nie ma znaczenia ?.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 sty 2016, o 22:23 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 lis 2015
    Posty: 219
    Pomógł: 20

    chyba to nie jasno opisalem. dioda 3 reaguje prawidlowo. tzn za kazdym przycisnieciem zmienia stan na przeciwny. diody 1 i 2 reaguja ale za dwoma albo trzema nacisnieciami. czy szybko czy wolno naciskam jest to samo



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 sty 2016, o 00:42 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 sty 2012
    Posty: 777
    Lokalizacja: Karpicko k. Wolsztyna
    Pomógł: 197

    Z ciekawości przetestowałem twój program i faktycznie objawy są takie jak opisałeś. W czasie szukania przyczyn takiego działania zakomentowałem jeden warunek w pętli while i dioda z drugiego warunku zaczęła działać prawidłowo. To nasunęło mi odpowiedź dlaczego jeden warunek działa dobrze a dwa już nie.

    Załóżmy, że wciśnięty jest klawisz 1 a program zaczyna sprawdzać drugi warunek w pętli while. Po wejściu do funkcji wykona się pierwszy warunek if
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Zmienna wynik zostanie ustawiona na jeden i tą wartość zwróci funkcja.
    Po wyjściu z funkcji ta wartość zostanie przyrównana do 2 (bo program sprawdzał drugi warunek w while).
    Ten if się nie wykona bo funkcja zwróciła wartość 1.

    Chwilę później program zacznie sprawdzać pierwszy warunek w while. Wewnątrz funkcji, pierwszy if już nie będzie spełniony bo chwilę wcześnie zmienna key_lock1 została ustawiona na 1. Klawisz jest nadal wciśnięty więc żaden warunek wewnątrz funkcji nie będzie spełniony i funkcja zwróci 0.

    A dlaczego zero skoro wcześniej zmienna wynik została ustawiona na 1? Ano dlatego, że zmienna wynik to zmienna lokalna, której wartość jest tracona po wyjściu z funkcji.

    W poprzednim wywołaniu funkcji jej wartość została ustawiona na 1. I ta wartość została zwrócona. Jednak po ponownym wywołaniu funkcji zmienna wynik została utworzona na nowo i zainicjowana wartością 0. Skoro żaden warunek wewnątrz funkcji się nie wykona to funkcja zwróci 0. Ta wartość zostanie porównana z wartością równą 1 (pierwszy warunek w while).
    I tym sposobem żadna dioda nie zmieni swego stanu.

    Program dobrze zadziała jeśli podczas wciśnięcia któregoś z klawiszy najpierw zostanie sprawdzony warunek (w pętli while) odpowiadający temu klawiszowi.


    Autor postu otrzymał pochwałę


    Ostatnio edytowano 29 sty 2016, o 16:28 przez jacekk232, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 sty 2016, o 02:06 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 09 gru 2014
    Posty: 1540
    Pomógł: 269

    jez2000 napisał(a):
    Proszę, nakierujcie mnie gdzie robię błąd:)


    W pętli głównej.
    Myślę, że powinieneś powołać sobie jeszcze jedną zmienną i do niej przypisywać to co zwraca funkcja press1().
    Dopiero po tym "zabiegu" sprawdzać warunki.

    Ja bym to zrobił 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.


    Poza tym dla lepszej czytelności kodu #define LED1_TOG zamiast #define led1_tog, oraz if(1 == temp) zamiast if(temp == 1).
    Myślę, że lepiej jest również zastosować uint16_t dla key_lock1 i key_lock2 zamiast uint8_t.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 sty 2016, o 07:01 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 lis 2015
    Posty: 219
    Pomógł: 20

    Dzieki za pomoc!
    Jak wrócę do domu to pokombinuję i zobaczę co się dzieje.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 sty 2016, o 10:06 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27416
    Lokalizacja: Szczecin
    Pomógł: 1043

    tylko, że takie coś:

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


    spowoduje, że albo jedna albo druga dioda będzie świecić połową swojej jasności czyli 50% PWM, zamiast zmienić swój stan po wciśnięciu klawisza.....

    trzeba jeszcze ew kasować stan:

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


    to ma szanse działać być może zgodnie z oczekiwaniami autora, ale powiem tak .... te funkcje z bloga były myślane tak aby stosować je nieco inaczej ... przede wszystkim do obsługi kilku pojedynczych klawiszy, a robienie klawiatury - hmmm myślę że warto byłoby wtedy podejść całkowicie inaczej ...

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 sty 2016, o 10:25 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 09 gru 2014
    Posty: 1540
    Pomógł: 269

    Przetestowałem i diody świecą zgodnie z oczekiwaniem. Wciskamy klawisz pierwszy i dioda zmienia stan na przeciwny. Wciskamy klawisz drugi i druga dioda zmienia stan na przeciwny. Diody świecą pełnym światłem.

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


    W funkcji press1() jest zerowanie zmiennej wynik, gdy żaden z klawiszy nie zostanie wciśnięty to funkcja ta zwraca nam wartość 0. Czyli zmienna temp w wyniku wywołania funkcji otrzyma wartość 0. Żaden z warunków nie będzie spełniony, diody zmienią stan dopiero po wciśnięciu klawiszy.

    Panie Mirku, dlaczego pana zdaniem diody powinny świecić połową jasnośći?
    Wydaje mi się, że świecą pełną jasnością. No chyba, że mi się tylko wydaje! :D



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 sty 2016, o 11:16 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27416
    Lokalizacja: Szczecin
    Pomógł: 1043

    anshar napisał(a):
    Panie Mirku, dlaczego pana zdaniem diody powinny świecić połową jasnośći?

    bo nie zauważyłem tego ;)
    anshar napisał(a):
    W funkcji press1() jest zerowanie zmiennej wynik


    anshar napisał(a):
    Wydaje mi się, że świecą pełną jasnością. No chyba, że mi się tylko wydaje!

    Wcale ci się nie wydaje ... masz rację ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 sty 2016, o 12:09 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 09 gru 2014
    Posty: 1540
    Pomógł: 269

    ;) Dziękuje! Pozdrawiam serdecznie!



    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: 12 ] 

    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