<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=24813&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2025-05-10T14:45:53+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=24813&amp;mode</id>
<entry>
<author><name><![CDATA[kamilck13]]></name></author>
<updated>2025-05-10T14:45:53+01:00</updated>
<published>2025-05-10T14:45:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239053#p239053</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239053#p239053"/>
<title type="html"><![CDATA[Re: Program do obsługi czujki w Alarmie jak zaprojektować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239053#p239053"><![CDATA[
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.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15774">kamilck13</a> — 10 maja 2025, o 14:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AKSELINEK]]></name></author>
<updated>2025-05-08T22:07:22+01:00</updated>
<published>2025-05-08T22:07:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239041#p239041</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239041#p239041"/>
<title type="html"><![CDATA[Re: Program do obsługi czujki w Alarmie jak zaprojektować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239041#p239041"><![CDATA[
Bardzo Ci dziękuje kolego  moscow wszystko dzieki Tobie teraz zrozumiałem<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18152">AKSELINEK</a> — 8 maja 2025, o 22:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[moscow]]></name></author>
<updated>2025-05-08T20:53:25+01:00</updated>
<published>2025-05-08T20:53:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239040#p239040</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239040#p239040"/>
<title type="html"><![CDATA[Re: Program do obsługi czujki w Alarmie jak zaprojektować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239040#p239040"><![CDATA[
Hej,<br /> 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<br /><br />Np. <br />[syntax=c]typedef enum {<br />    ALARM_STABILNY = 0,        // Stan stabilny<br />    ALARM_WYZWOLONY = 1,       // Po pierwszym wyzwoleniu czujki<br />    ALARM_AKTYWNY = 3          // ALARM<br />} AlarmStan;[/syntax]<br /><br />I potem uzyc zmiennej w ten sposób<br />AlarmStan stanAlarmu = ALARM_STABILNY;<br />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.<br /><br />Być może warto się zastanowić nad trochę innym podejściem z wykorzystaniem timerów programowych, które Mirek opisywał tutaj. <br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-zwoka-czasowa-cd3.html" >http://mirekk36.blogspot.com/2012/10/ob ... a-cd3.html</a><!-- m --><br />jest też poradnik tutaj <!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=FA9gWa88snM" >https://www.youtube.com/watch?v=FA9gWa88snM</a><!-- m --><br /><br />Może narzędzie to nie jest najprostsze do zrozumienia, ale jak już się je ogarnie, to czasem ogromnie upraszczają konstrukcję programu.<br /><br />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ąć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />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ć)<br />kmAlertTest.zip<br /><br />Wystarczy podłączyć diody do pinów portu <strong>PC0-PC4</strong> i któryś z przycisków do portu <strong>PB0</strong><br /><br />Dioda na <strong>PC4 </strong>miga sygnalizując pracę układu. Dioda na <strong>PC1 </strong>pokazuje czy jesteśmy aktualnie w trybie po pierwszym wyzwoleniu czujki, dioda PC0 sygnalizuje stan alarmu.<br /><br />Podstawą programiku była aplikacja testowa zawierająca obsługę przycisków i timerów programowych <br /><!-- m --><a class="postlink" href="https://gitlab.com/c-mos/kmAvrTests/kmButtonsTest" >https://gitlab.com/c-mos/kmAvrTests/kmButtonsTest</a><!-- m --><br /><br />W stosunku do oryginału zmieniłem parę rzeczy:<br />W pliku kmSoftwareTimer.h zmieniłe typ<br />[syntax=c]typedef uint32_t kmSwtIntervalValueType;[/syntax]<br />W oryginale był zakres uint16_t – ale ten daje w tej implementacji maksymalny interwał oczekiwania jakieś 65 sekund, a chcemy mieć 5 minut<br />W pliku config.h<br />[syntax=c]// Zmieniona liczba dostępnych timerów programowych (było 2)<br />#define SWT_SIZE_OF 4<br />// definiuje ile rezy czujka odbierze sygnal w czasie zdefiniowanym<br />// przez KM_FALSE_ALERT_TIME_WINDOW zanim zostanie wyzwolony alarm<br />#define KM_ALERT_REPEATS_TO_ACTIVATE 2<br />// definiuje czas okna w ktorym powinny zostac powtorzone wyzwolenia czujki aby aktyowac alarm<br />#define KM_FALSE_ALERT_WINDOW_TIMEOUT 300000 // 5min<br />// czas trwania alarmu<br />#define KM_ALERT_TIME 10000 // 10 sec<br />// definicje timerów do konkretnych slotów<br />#define KM_SWT_TIMER_FALSE_ALERT_WINDOW KM_SWT_TIMER_2<br />#define KM_SWT_TIMER_ALERT_ACTIVE KM_SWT_TIMER_3[/syntax]<br />W pliku Application.h<br />[syntax=c]// zmieniona funkcja  – w tym programie chcemy tylko stwierdzić naciśnięcie przycisku, który zasymuluje działanie czujki – w tej roli funkcja  signalAlertReceived();<br />void _callbackButton(const kmButtonType buttonId, const kmButtonStateType buttonState) {<br />if (kmButton0 == buttonId &amp;&amp; (kmButtonReleased == buttonState ||<br />kmButtonReleasedInRepeat == buttonState)) {<br />signalAlertReceived();<br />}<br />}<br /><br />static uint8_t alertState = KM_ALERT_REPEATS_TO_ACTIVATE;<br /><br />void signalSendAlertStart(void) {<br />// wlacz alarm na okreslony czas zdefiniowany w KM_ALERT_TIME<br />dbOn(DB_PIN_0); // pin PC0<br />// uruchom timer wylaczenia alarmu<br />kmSwtStart(KM_SWT_TIMER_ALERT_ACTIVE, KM_ALERT_TIME);<br />}<br /><br />void signalSendAlertStop(void) {<br />// zatrzymaj alarm<br />dbOff(DB_PIN_0); // pin PC0<br />}<br /><br />// metoda wyzwalana kiedy nadchodzi sygnal z czujki<br />void signalAlertReceived(void) {<br />// wystartuj od nowa timer odpowiedzialny za okno czasowe falszywych alarmow<br />kmSwtStart(KM_SWT_TIMER_FALSE_ALERT_WINDOW, KM_FALSE_ALERT_WINDOW_TIMEOUT);<br />// pomocniczo pokaz stan okna czasowego falszywych alarmow<br />dbOn(DB_PIN_1);  // pin PC1<br /><br />// zmniejsz licznik falszywych alarmow (jesli wiekszy od zera)<br />if (alertState &gt; 0) {<br />alertState--;<br />}<br />// w przypadku kiedy wartosc licznika zeszla do zera w oknie czasowym - uruchom alarm<br />// alarm bedzie przedluzany za kazdym razem kiedy wejdzie nowy sygnal alarmu<br />if (!alertState) {<br />// uruchom alarm<br />signalSendAlertStart();<br />}<br />}<br /><br />// wywoływana po czasie &quot;czuwania&quot;<br />void _callbackFalseAlertTimeout(const void *userData, kmSwtIntervalValueType *newTimerValue)  {<br />// jesli czas okno falszywych alarmow zostal przekroczony uklad wraca do stanu poczatkowego<br />alertState = KM_ALERT_REPEATS_TO_ACTIVATE;<br />// pomocniczo pokaz stan okna czasowego falszywych alarmow<br />dbOff(DB_PIN_1); // pin PC1<br />// nie ustawiamy wartosci *newTimerValue - timer nie uruchomi sie ponownie<br />}<br /><br />// zatrzymanie alarmu<br />void _callbackAlertStop(const void *userData, kmSwtIntervalValueType *newTimerValue)  {<br />signalSendAlertStop();<br />// nie ustawiamy wartosci *newTimerValue - timer nie uruchomi sie ponownie<br />}[/syntax]<br /><br />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.<br /><br />Mam nadzieję, że się przyda to do czegoś <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /><br />Pozdrowienia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20760">moscow</a> — 8 maja 2025, o 20:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AKSELINEK]]></name></author>
<updated>2025-05-07T21:08:03+01:00</updated>
<published>2025-05-07T21:08:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239037#p239037</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239037#p239037"/>
<title type="html"><![CDATA[Program do obsługi czujki w Alarmie jak zaprojektować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24813&amp;p=239037#p239037"><![CDATA[
Witam.<br />Chciałem podpowiedzi w temacie jak prawidłowo zaprojektować program dla Alarmu w przypadku naruszenia czujki .<br />Czujka alarmowa jest bardzo czuła ponieważ jest na zewnątrz i jest naruszana przez owady , ptaki itp.<br />Chciałem aby alarm uruchamiał nie po pierwszym naruszeniu tylko inaczej :<br />- Po pierwszym naruszeniu czujki  przez czas np 5 minut  procesor czuwa i czeka czy nastąpi KOLEJNE naruszenie:<br />- Jeśli nastąpi KOLEJNE naruszenie to wywołać chcę alarm.<br />- Jeśli w czasie wspomnianych 5 minut nie nastąpi naruszenie układ wraca do stanu przed pierwszego naruszenia. <br /><br />Pytanie polega na tym jak fachowo napisać program , myśl mam taką : zdefiniować zmienną globalną np.  uint8_t  Stan Alarmu<br />- uint8_t  Stan Alarmu=0;  // dla stanu stabilnego <br />- uint8_t  Stan Alarmu=1;  // dla stanu po pierwszym wyzwoleniu czujki<br />- uint8_t  Stan Alarmu=3;  // ALARM<br />i w programie chcę wykożystać dla porównania i działania wartośc uint8_t  Stan Alarmu .<br />Czy takie podejście do programu będzię fachowe?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18152">AKSELINEK</a> — 7 maja 2025, o 21:08</p><hr />
]]></content>
</entry>
</feed>