31-01-2017, 11:27
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,
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,