logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Prosty kod alarmu dla piwnicy w języku C na Attiny13/Atmega8 z krańcówką drzwi

yogi009 28 Lut 2021 16:10 792 14
  • #1 19287860
    yogi009
    Poziom 43  
    Muszę jakoś zabezpieczyć w prosty i podstawowy sposób piwnicę, bo tam duży ruch panuje. Kiedyś zrobiłem coś takiego na bramkach, ale tamten model po zgłoszeniu nieautoryzowanego wejścia wył bez przerwy. Ktoś mi wtedy zwrócił uwagę, że jeśli mnie nie będzie, to sąsiedzi po 6 godzinach wycia syrenki w końcu się zirytują. No i teraz kombinuję wersję na Attiny13/Atmega8.

    Praca prosta:

    1. Po włączeniu zasilania mamy czas na zamknięcie drzwi (z krańcówką - np. 20 sekund),
    2. układ sobie czuwa, po otwarciu drzwi mamy czas na jego deaktywację (lub wyłączenie, np. 15 sekund),
    3. jeżeli nie wyłączymy zasilania, zaczyna pulsacyjnie wyć syrenką np.przez minutę, potem np. minuta przerwy i znowu minutowe wycie, tak 3 razy - potem wyłączenie alarmu i cisza.

    Jako wyłączenie/włączenie zasilania (akumulatorek) przewiduję np.wtyk jack jako breloczek do klucza od piwnicy. Otwieramy drzwi, wtyk wtykamy w gniazdo i w ten sposób odcinamy zasilanko układu. Wychodząc musimy wyjąć wtyk z kluczem z gniazda, więc jest pewność, że włączymy układ alarmowy.

    W kodowaniu mistrzem nie jestem, oczywiście zaprogramuję jakiś port jako wejście z krańcówki, dwa inne jako wyjście na syrenę i na pikający buzzer informujący o konieczności rozbrojenia lub o upływającym czasie podczas zamykania drzwi. Jednak chciałbym to zrobić dobrze, z jakimś watch-dogiem, żeby sprawdzał, czy się system nie zawiesił. Do tego jakieś oszczędzanie energii, w końcu praca tego układu to praktycznie 99% czasu na oszczędzaniu właśnie. Może ktoś z Was trafił na jakiś prosty kod realizujący tego typu funkcje i zechce się podzielić. Pozdrawiam.
  • Pomocny post
    #2 19289326
    bart-projects
    Poziom 29  
    Łap gotowy Hex lub Bin (do wyboru). Machnąłem to w Bascom bo to dosłownie minuta i dłużej chyba uruchamia się AtmelStudio7.
    Kod jest prosty jak świński ogon więc możesz go sobie przetłumaczyć, ale szybciej zmienisz go wersją Demo Bascoma. Wszystko opisane. Osobiście pomyślałbym o tym, że po wykryciu zamkniętych drzwi można od razu przejść do pilnowania...ale o tym nie pisałeś.

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #3 19289415
    yogi009
    Poziom 43  
    Dzięki bart, co prawda nie znam zupełnie Bascom'a (muszę to przełożyć na C), ale kto wie, niech ten kod będzie dla wszystkich. Kompilacja w konsoli trwa trzy mrugnięcia okiem... albo dwa :-) Czy w Twoim kodzie jest usypianie i watchdog?

    Co do funkcjonalności... Całość jest pomyślana tak, żeby trudniej się było pomylić. Otwierasz drzwi do piwnicy i masz np. 15 sekund na włożenie wtyku jack (breloczek przy kluczach) do właściwego gniazda. A gniazdo po prostu odcina zasilanie układu.

    Przy wychodzeniu musisz wyjąć ten "breloczek" z gniazda (czyli włącza się zasilanie ukłądu) i wtedy masz np. 20 sekund na zamknięcie drzwi.

    W obu tych stanach przejściowych (15 i 20 sekund) będzie ciche pikanie buzzera przypominające, że układ zaraz zacznie wyć, albo że się uzbroi.

    I właśnie dlatego nie ma potrzeby wykrywanie zamkniętych drzwi. Całość skupia się na wykrywaniu ich otwarcia.
  • #7 19289489
    yogi009
    Poziom 43  
    W pierwszym poście napisałem, że kod bez przerwań w C napiszę, to nie jest problem. Natomiast dwie funkcje na przerwaniach są chyba istotne, pierwsza oszczędza akumulator, druga resetuje układ w przypadku zawieszenia. Nie chcemy, żeby w wyniku zawieszenia programu pomieszczenie nie było pilnowane. Myślę, że bardziej mnie interesuje kod w C, dziękuję za Twoje źródełka, na pewno się komuś przydadzą.

    W przypadku klasycznego kodu w C (bez przerwań) czuję, że wystarczą ze dwie pętle i case albo kilka prostych warunków.

    Dodano po 10 [godziny] 4 [minuty]:

    No dobrze, wrzucę mały schemacik do testów, żeby było mniej więcej wiadomo, jak poukładaliśmy porty.

    Prosty kod alarmu dla piwnicy w języku C na Attiny13/Atmega8 z krańcówką drzwi
  • Pomocny post
    #8 19291297
    ArturAVS
    Moderator
    Lepiej zamiast "odcinania" zasilania brelokiem (Jack) użyć ADC i zrobić wejście parametryczne (jak w prawdziwych alarmach). ADC zmierzy napięcie z dzielnika (rezystor w układzie do np. +5V i drugi przylutowany do Jack'a) i tylko w przypadku prawidłowego wyłączy alarm.
    Prosty kod alarmu dla piwnicy w języku C na Attiny13/Atmega8 z krańcówką drzwi
  • Pomocny post
    #9 19291309
    ex-or
    Poziom 28  
    yogi009 napisał:
    W przypadku klasycznego kodu w C (bez przerwań) czuję, że wystarczą ze dwie pętle

    Ja czuję, że to kierunek prowadzący w buraki. Tutaj prosi się o automat skończony. Wtedy program wygląda mniej więcej tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Funkcjonalność programu jest zamknięta w state_machine(). To co poza to zadania administracyjne, niezwiązane z realizowanym zadaniem. Zadania są rozdzielone, łatwo to przeanalizować, testować, modyfikować.
    Przedstwawiony opis i schemat nasuwa kilka pytań.
    Co to znaczy, że syrena ma wyć "pulsacyjnie"? To ma załatwić procek, czy to ficzer samej syreny?
    Jeśli buzzer jest piezzo to najlepiej działa kiedy podaje się mu sygnał w przeciwfazie, a więc z dwóch nóg procka.
    Czy nie powinno być jakiegoś monitoringu i sygnalizacji stanu baterii? W t13 Internal Vref nie jest dopięty do kanału ADC więc potrzebny by był dzielnik na którejś nodze

    Dodano po 5 [minuty]:

    ArturAVS napisał:
    ADC zmierzy napięcie z dzielnika

    Żeby to miało mieć ręce i nogi trzeba by skorzystać z komparatora. Ciągłe testowanie przez ADC jest dosyć słabe pod względem oszczędności baterii.
    Piny komparatora wiszą na pinach PWM, co koliduje z ewentualnym buzzerem.

    Dodano po 18 [minuty]:

    ex-or napisał:
    Żeby to miało mieć ręce i nogi trzeba by skorzystać z komparatora. Ciągłe testowanie przez ADC jest dosyć słabe pod względem oszczędności baterii.

    Właściwie to wymaga przemyślenia: czy lepiej: mieć cały czas włączony komparator, a więc i napięcie referencyjne, czy też Vref mieć przeważnie wyłączone, a co jakiś czas włączone na czas pomiaru ADC.
    Pytanie zasadnicze: co to za bateria (czytaj: czy trzeba walczyć o każdy mikroamper)?
  • #10 19291370
    ArturAVS
    Moderator
    ex-or napisał:
    Ciągłe testowanie przez ADC jest dosyć słabe pod względem oszczędności baterii.

    A po co go ciągle testować? Ustawić jedno przerwanie co np. sekundę i wtedy sprawdzać stan ADC.
    ex-or napisał:
    Piny komparatora wiszą na pinach PWM, co koliduje z ewentualnym buzzerem.

    A to nie ma buzzerów z generatorem?
    ex-or napisał:
    Pytanie zasadnicze: co to za bateria (...)?

    Podejrzewam że jakiś typowy 12V(ze względu na syrenę) więc sama przetwornica/regulator 5V i tak zeżre większość tego co się oszczędzi "usypiając" '13. Skoro już korzystamy z ADC to kolejny dzielnik i pomiar stanu akumulatora oraz sygnalizacja np. trzema długimi piknięciami konieczności wymiany/naładowania.
    ex-or napisał:
    czy trzeba walczyć o każdy mikroamper


    Raczej wątpię i to tylko zbędne fanaberie. Kilka mA w stanie standby nie powinno być problemem.
  • #11 19291376
    yogi009
    Poziom 43  
    ex-or napisał:
    Tutaj prosi się o automat skończony.


    I tu mi się natychmiast kończy wyobraźnia :-)

    ex-or napisał:
    Pytanie zasadnicze: co to za bateria (czytaj: czy trzeba walczyć o każdy mikroamper)?


    Zasilanie będzie realizowane z pakietu Li-Ion, albo LiFePO4, także mam jakieś 2,5 Ah. Nie musimy walczyć o mikroampery. Chciałbym, żeby taki akumulator wytrzymał te 3-6 miesięcy.
  • Pomocny post
    #12 19291518
    ex-or
    Poziom 28  
    ArturAVS napisał:
    A po co go ciągle testować? Ustawić jedno przerwanie co np. sekundę i wtedy sprawdzać stan ADC.

    Własnie o tym mówię. Odpalanie przerwaniem czy pętla busy wait - zasada jest identyczna.
    ArturAVS napisał:
    A to nie ma buzzerów z generatorem?
    Gdzieś pewnie są, ale czy akurat w tym projekcie?
    ArturAVS napisał:
    Kilka mA w stanie standby nie powinno być problemem

    W takim wypadku nie ma co się bawić w usypianie bo "kilka" mA to kilka razy więcej niż pobiera t13 w Run Mode. Ewentualnie można dać "lekkie" usypianie Idle Mode.
    yogi009 napisał:
    I tu mi się natychmiast kończy wyobraźnia

    A jednak coś Ci się kołacze skoro wspomniałeś o switch-case ;-)
    Urządzenie w czasie pracy znajduje się w kilku określonych stanach (czuwanie, naruszenie, spoczynek itd). W danym stanie wykonuje się ściśle określone zadanie. Przejścia międzystanowe są też ściśle określone. Po dokładnym rozpisaniu zaprogramowanie (np. switch-kejsami) to szczegół. Lepszy opis: https://ep.com.pl/files/1436.pdf Przykładowa maszyna stanów w podobnym wątku: https://www.elektroda.pl/rtvforum/topic3772624.html

    Dodano po 8 [minuty]:

    yogi009 napisał:
    mam jakieś 2,5 Ah. Nie musimy walczyć o mikroampery. Chciałbym, żeby taki akumulator wytrzymał te 3-6 miesięcy.
    O każdy może nie, ale przy takiej baterii oszczędności są jednak konieczne.
  • #13 19291741
    yogi009
    Poziom 43  
    ex-or napisał:
    A jednak coś Ci się kołacze skoro wspomniałeś o switch-case
    Urządzenie w czasie pracy znajduje się w kilku określonych stanach (czuwanie, naruszenie, spoczynek itd). W danym stanie wykonuje się ściśle określone zadanie. Przejścia międzystanowe są też ściśle określone. Po dokładnym rozpisaniu zaprogramowanie (np. switch-kejsami) to szczegół. Lepszy opis: https://ep.com.pl/files/1436.pdf Przykładowa maszyna stanów w podobnym wątku: https://www.elektroda.pl/rtvforum/topic3772624.html


    Wielkie dzięki za te materiały, chyba mnie czeka odrobina czytania.

    ex-or napisał:
    O każdy może nie, ale przy takiej baterii oszczędności są jednak konieczne.


    Właśnie dlatego nie zakładałem żadnych komparatorów, czy innych zewnętrznych elementów pobierających prąd. Attiny rejestruje tylko impuls z krańcówki. Rozwiązanie, w którym włożenie wtyku jack odcina zasilanie może nie jest w pełni profesjonalne (w tym alarmie nie o to chodzi), ale obniża pobór prądu (w zasadzie do samego mikrokontrolera). Mogę zrobić nieco większy akumulatorek, tylko to takie pójście na lenistwo, lepiej narysować lepszy schemat i klepnąć nieco mądrzejszy kod.
  • Pomocny post
    #14 19291969
    PiotrPitucha
    Poziom 34  
    Witam
    Przy tak skomplikowanym układzie i programie :)
    można zmodyfikować założenia i spokojnie zejść z poborem
    prądu na kilkanaście uA a może nawet niżej.
    Kilka zasad:
    - zjechać z zegarem ile się tylko da, np. wewnętrzny zegar 1MHz, albo niżej na kwarcu zegarkowym, bo procesor się będzie nudził ;
    - zastosować stabilizator liniowy o bardzo małym poborze własnym, Microchip robi takie które biorą poniżej 100nA ;
    - zastanowić się nad wybudzaniem, proces wybudzania pobiera dość dużo energii i istnieje granica częstotliwości wybudzania przy której przestaje się to opłacać ;
    - ADC w bilansie energetycznym pobiera relatywnie dużo, jeśli zaprojektuje się procedurę bez ADC ;
    - koniecznie Atmega z serii P czyli PicoPower stosowana w Arduino.
    Rozpiska które moduły wpływają na pobór prądu są w opracowaniu o tytule 10 lat na jednej baterii, opis angielski ale bardzo prosty (nie pamiętam czy dokładnie taki tytuł ale tak się da wygooglać).
    Pozdrawiam

Podsumowanie tematu

Użytkownik poszukuje prostego rozwiązania alarmowego dla piwnicy, opartego na mikrokontrolerach Attiny13/Atmega8, z wykorzystaniem krańcówki drzwi. Proponowany system ma czas na zamknięcie drzwi po włączeniu zasilania oraz możliwość dezaktywacji alarmu po otwarciu drzwi. W przypadku braku reakcji, alarm ma wyć pulsacyjnie przez określony czas. W dyskusji poruszono różne aspekty implementacji, w tym konwersję kodu z Bascom na C, wykorzystanie przerwań, oszczędność energii oraz alternatywne metody wyłączania zasilania. Uczestnicy sugerują zastosowanie ADC do detekcji stanu zasilania oraz optymalizację poboru energii, a także rozważają użycie stabilizatorów o niskim poborze prądu.
Podsumowanie wygenerowane przez model językowy.
REKLAMA