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



Teraz jest 25 cze 2025, o 04:51


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 7 maja 2025, o 21:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 586
Pomógł: 0

Witam.
Chciałem podpowiedzi w temacie jak prawidłowo zaprojektować program dla Alarmu w przypadku naruszenia czujki .
Czujka alarmowa jest bardzo czuła ponieważ jest na zewnątrz i jest naruszana przez owady , ptaki itp.
Chciałem aby alarm uruchamiał nie po pierwszym naruszeniu tylko inaczej :
- Po pierwszym naruszeniu czujki przez czas np 5 minut procesor czuwa i czeka czy nastąpi KOLEJNE naruszenie:
- Jeśli nastąpi KOLEJNE naruszenie to wywołać chcę alarm.
- Jeśli w czasie wspomnianych 5 minut nie nastąpi naruszenie układ wraca do stanu przed pierwszego naruszenia.

Pytanie polega na tym jak fachowo napisać program , myśl mam taką : zdefiniować zmienną globalną np. uint8_t Stan Alarmu
- uint8_t Stan Alarmu=0; // dla stanu stabilnego
- uint8_t Stan Alarmu=1; // dla stanu po pierwszym wyzwoleniu czujki
- uint8_t Stan Alarmu=3; // ALARM
i w programie chcę wykożystać dla porównania i działania wartośc uint8_t Stan Alarmu .
Czy takie podejście do programu będzię fachowe?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2025, o 20:53 
Offline
Użytkownik

Dołączył(a): 09 lip 2019
Posty: 121
Pomógł: 12

Hej,
Nie mam pewności, czy dobrze wszystko zrozumiałem w pytaniu, ale jeśli chodzi o samą zmienną – można oczywiście do tego podejść tak jak napisałeś.Przy czym – jeśli dobrze rozumiem zmienna StanAlarmu ma być czymś w rodzaju implementacji „maszyny stanu”. Być może dobrze byłoby się zastanowić i użyć w tym przypadku enuma

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


I potem uzyc zmiennej w ten sposób
AlarmStan stanAlarmu = ALARM_STABILNY;
Jeśli z tego w ten sposób skorzystasz, to zamiast gdzieś w kodzie używać liczb 0, 1 i 3 będzie Ci prościej użyć wartości enuma – kod będzie czytelniejszy.

Być może warto się zastanowić nad trochę innym podejściem z wykorzystaniem timerów programowych, które Mirek opisywał tutaj.
http://mirekk36.blogspot.com/2012/10/ob ... a-cd3.html
jest też poradnik tutaj https://www.youtube.com/watch?v=FA9gWa88snM

Może narzędzie to nie jest najprostsze do zrozumienia, ale jak już się je ogarnie, to czasem ogromnie upraszczają konstrukcję programu.

Jakiś czas temu zrobiłem swoją implementację na podstawie poradników mirka i dosłownie w kilkanaście minut zrobiłem coś co prawdopodobnie chciałbyś osiągnąć :)

Możesz podejrzeć to co skrobnąłem – dołączam źródła (katalog src) i skompilowany program dla ATmega32 i ATmega644p (katalog bin) – odpaliłem to na zestawie ATB z m644 (nie mam pod ręką m32, ale powinno w teorii zadziałać)
Załącznik:
kmAlertTest.zip


Wystarczy podłączyć diody do pinów portu PC0-PC4 i któryś z przycisków do portu PB0

Dioda na PC4 miga sygnalizując pracę układu. Dioda na PC1 pokazuje czy jesteśmy aktualnie w trybie po pierwszym wyzwoleniu czujki, dioda PC0 sygnalizuje stan alarmu.

Podstawą programiku była aplikacja testowa zawierająca obsługę przycisków i timerów programowych
https://gitlab.com/c-mos/kmAvrTests/kmButtonsTest

W stosunku do oryginału zmieniłem parę rzeczy:
W pliku kmSoftwareTimer.h zmieniłe typ
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W oryginale był zakres uint16_t – ale ten daje w tej implementacji maksymalny interwał oczekiwania jakieś 65 sekund, a chcemy mieć 5 minut
W pliku config.h
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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


Plusem jest to, że nic się nie blokuje w czasie działania programu. Do tego automatem załatwiane są pewne konteksty czasowe - typu przedłużenie okresu czuwania w przypadku kiedy przyjdzie kolejny sygnał czujki, czy przedłużenie alarmu w przypadku kiedy czujka zostanie wyzwolona ponownie i tak dalej.

Mam nadzieję, że się przyda to do czegoś :-)

Pozdrowienia.


Autor postu otrzymał pochwałę

Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2025, o 22:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 586
Pomógł: 0

Bardzo Ci dziękuje kolego moscow wszystko dzieki Tobie teraz zrozumiałem



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 maja 2025, o 14:45 
Offline
Użytkownik

Dołączył(a): 09 gru 2016
Posty: 47
Pomógł: 4

W mojej ocenie najłatwiej po prostu kupić zewnętrzną czujkę do alarmu która sama zadba o ignorowanie fałszywych alarmów takich jak ptak, kot, owady, itp. Zapewne masz czujkę do zastosowań wewnętrznych które są super czułe i wykryją nawet mysz, czujki zewnętrzne wykryją człowieka, ale nie generują fałszywych alarmów.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO