• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sterownik 2 diodami za pomocą drabinki rezystorowej
#11
Witam,
Nie chcę tu niepotrzebnie "bić piany", ale...
@namok
Jakakolwiek krytyka powinna być konstruktywna i w tym przypadku należałoby podać minusy proponowanego- czyjegoś- rozwiązania i plusy swojego. Czytając powyższe kilka Twoich postów wniosek jest jeden, zastosować funkcję millis(), ale co, jak, nawet mglisto nie ma.
Jak napisałeś, jest to forum techniczne i należy zwracać uwagę na szczegóły. W takim razie na ile szczegółowe jest stwierdzenie, że cykl programu nie może być zbyt duży. Tzn.? Kiedyś też myślałem, że pewna "rzecz" jest zbyt duża lecz szybko się okazało, że nie. Prawie wszystko ma względne odniesienie.
Jeśli obsługa przerwań od wejść byłaby zła, to myślę, że w Arduino brakowałoby implementacji przerwań zewnętrznych. Ale to moje zdanie.
Odnośnie samych szczegółów, to co określiłbyś mianem sytuacji podbramkowej w układzie z niniejszego wątku. Najważniejszym zdarzeniem jest tu przecież wciśnięcie przycisku.
Kwestii Timers.h nie będę drążyć, gdyż autor wątku napisał, iż nie do końca wie jak z niej skorzystać.
Z jednym się mogę zgodzić, że w tym przypadku program nie musi się opierać na przerwaniach. Przy podanych czasach świecenia diod nie jest potrzebna natychmiastowa reakcja układu i pewnie czas reakcji zbliżony do czasu wykonania jednej sekwencji instrukcji z pętli loop() z pewnością wystarczy.
Ale do rzeczy.
W kodzie- tu już pisze do autora wątku- pominięty jest przypadek gdy przyciśnięte są oba przyciski. Taki stan też należałoby uwzględnić.
Do detekcji korzystasz z jednego wejścia analogowego- tego się trzymajmy- i wciśnięcie przycisku rozpoznajesz poprzez zmianę wartości, a raczej przedziału wartości. W kodzie sprawdzasz if-em do jakiego przedziału należy wartość i zapalasz/gasisz diody.
Ja rozwiązałbym to w następujący sposób:
- dwie zmienne globalne przechowujące wartości zwracane przez funkcję millis(),
- dwie zmienne globalne. Pierwszą, mogąca posiadać trzy wartości byte zależne od obecnego stanu układu (diody zgaszone, zapalona 1, zapalona 2), Drugą mogącą posiadać cztery wartości byte zależne od (Oba przyciski OFF, Przyciski 1 ON, Przycisk 2 ON, Oba przyciski ON ),
- na początku pętli loop() odczytywałbym wartość na wejściu analogowym oraz czas,
- jeśli nastąpiła zmiana to do drugiej zmiennej "od czasu" zapisał czas tej zmiany,
- obliczyłbym różnicę pomiędzy czasem odczytanym na początku pętli, a czasem ostatniej zmiany stanu przycisków,
- biorąc pod uwagę otrzymaną różnicę, oraz obecny stan układu i stan przycisków przypisał odpowiednią czynność lub nie robić nic.
Z pewnością można to zrobić jeszcze prościej, ale póki sam nie piszę programu to na wcześniejszym etapie go nie optymalizuję.
Pozdrawiam,
 
Odpowiedź
#12
(31-01-2017, 11:27)Smaczek napisał(a): Jakakolwiek krytyka powinna być konstruktywna i w tym przypadku należałoby podać minusy proponowanego- czyjegoś- rozwiązania
A poniższego oczywiście nie zauważyłeś bo nie pasuje do teorii: 
Cytat:Obsługa przycisków w przerwaniu od wejścia jest zła i nie należy jej stosować(pomijam sytuacje "podbramkowe").
Po naciśnięciu przycisku początkujący będzie się spodziewał jednego przerwania a otrzyma kilka/kilkanaście przerwań.


Cytat:Czytając powyższe kilka Twoich postów wniosek jest jeden, zastosować funkcję millis(), ale co, jak, nawet mglisto nie ma.
Forum jest od pomagania, naprowadziania na rozwiązanie a nie dawania "gotowców".

Cytat:Jeśli obsługa przerwań od wejść byłaby zła, to myślę, że w Arduino brakowałoby implementacji przerwań zewnętrznych. Ale to moje zdanie.
A gdzie napisałem że nie należy stosować przerwań od wejść? Napisałem:
Cytat:Obsługa przycisków w przerwaniu od wejścia jest zła i nie należy jej stosować


Cytat:Kwestii Timers.h  nie będę drążyć, gdyż autor wątku napisał, iż nie do końca wie jak z niej skorzystać.
Kwestia timers wzięła się z Twojego stwierdzenia:
Cytat:Moim skromnym zdaniem to biblioteka Timers nie będzie za bardzo przydatna w tym projekcie.
które jest oczywistą nieprawdą.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#13
Witam,
No to kolejnym postem w tym wątku pomogles. Konkretnie, konstruktywnie i tematycznie.
Pozdrawiam.
 
Odpowiedź
#14
(31-01-2017, 16:31)Smaczek napisał(a): Witam,
No to kolejnym postem w tym wątku pomogles. Konkretnie, konstruktywnie i tematycznie.
Pozdrawiam.

Nie potrafisz merytorycznie ustosunkować się do mojego postu więc udajesz że nie rozumiesz co napisałem. A może rzeczywiście nie rozumiesz. Tym gorzej dla ciebie.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#15
kod juz mam, co prawda byl płatny ale odblokował mój projekt. Wykorzystano w nim funkcje milis
tak to wyglada w praktyce:
https://youtu.be/_bOnMI_Y5Wo
a tak w docelowym projekcie:
https://youtu.be/BMUKxoIzPgY
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości