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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 9 lip 2025, o 19:39


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
    Autor Wiadomość
    PostNapisane: 11 cze 2016, o 11:27 
    Offline
    Nowy

    Dołączył(a): 02 maja 2016
    Posty: 16
    Pomógł: 0

    Witam, tak jak w temacie - poszukuję sposobów na uzyskanie kontrolowanego resetu mikrokontrolera, w moim przypadku jest to attiny13a.

    Na początku od razu mówię, że nie jestem jakimś "mózgiem" w sprawach programowania.
    Głównym problemem, z którym się droczę jest zresetowanie odliczania czasowego, gdy moje schody przestaną świecić. Aktualnie mam taką sytuację, że gdy ATTiny13a wykryje stan wysoki na jednej z jej pinów, to zaczyna odliczać 2 minuty po czym daje na pinie wyjściowym stan wysoki, który jest podany na ATMegę8. Gdy Mega dostanie stan wysoki - gasi wszystkie schody (Tak, wiem, pewnie są prostsze sposoby na uzyskanie takiego wygaszania czasowego, jednak tak jak mówiłem, nie jestem dobry w te klocki, przez co użyłem tego pomysłu, który jako jedyny przyszedł mi na myśl).
    Jednak problem się pojawia, ponieważ czasami dzieje się tak, że jest "ruch" na schodach, przez co zdarza się tak, że wyłączają się schody, gdy dana osoba dopiero po nich wchodzi - dlatego chciałbym zastosować reset odliczania, za każdym razem, gdy schody zapalą się na nowo.
    Wpadłem na taki pomysł, żeby podać fizycznie przewodem stan niski z "leda" na reset attiny. Wtedy, gdy schody byłyby zgaszone, to ten stan niski poszedłby na pin resetu i go zresetował - jednak nie wiem, czy jest to zgodne z etyką i to w ogóle ma prawo działać, a nie chcę niczego uszkodzić.
    Jeżeli mielibyście jakieś inne pomysły jak dokonać resetowania odliczania, przy gaszeniu ledów, to byłoby świetnie ;)
    Poniżej wstawiam napisany program na ATTiny13A, który odlicza czas.

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



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 cze 2016, o 11:39 
    Offline
    Użytkownik

    Dołączył(a): 19 lip 2013
    Posty: 774
    Pomógł: 40

    Nie znam C ale musisz zrobić sobie timer który będzie co 500mA sprawdzał czy ktos jest na schodach jesli jest to światło zapalone czas =0 jeśli nie ma to incr czas.Jak dojdzie do ustawionego pulapu wyłączy światło.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 cze 2016, o 12:05 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    Zakładam, że chcesz zrobić tak:
    - światło włącza się, gdy z detektora ruchu otrzyma stan wysoki na pinie PB2 i świeci się przez ustalony czas,
    - jeśli w tym czasie ponownie pojawi się lub będzie się utrzymywał stan wysoki na pinie PB2, to czas powinien zacząć się odliczać od nowa.
    Możesz spróbować tak:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    W ten sposób światło powinno zgasnąć zadaną ilość czasu po zaniku sygnału z detektora ruchu.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 cze 2016, o 14:24 
    Offline
    Nowy

    Dołączył(a): 02 maja 2016
    Posty: 16
    Pomógł: 0

    andrews napisał(a):
    Zakładam, że chcesz zrobić tak:
    - światło włącza się, gdy z detektora ruchu otrzyma stan wysoki na pinie PB2 i świeci się przez ustalony czas,
    - jeśli w tym czasie ponownie pojawi się lub będzie się utrzymywał stan wysoki na pinie PB2, to czas powinien zacząć się odliczać od nowa.
    Możesz spróbować tak:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    W ten sposób światło powinno zgasnąć zadaną ilość czasu po zaniku sygnału z detektora ruchu.


    Dzięki wielkie za pomoc, jednak nie do końca o to mi chodziło, pewnie przez to, że napisałem trochę to wszystko zagmatwanie.

    Przedstawię od początku jak wygląda sytuacja:

    Stan wysoki na Pinie PB2 otrzymuję poprzez poprowadzenie przewodu z pinu na ATMedze8, który odpowiada za sterowanie sygnałem jednego stopnia ledowego. Tak więc, gdy detektory wykryją ruch na schodach, zapalą się wszystkie stopnie za pośrednictwem ATMega8, wtedy pojawi się stan wysoki na PB2 na ATTiny13A - co wiąże się z tym, że rozpocznie się odliczanie czasu w ATTiny13A.

    Teraz przejdę do tego, co chciałem otrzymać:

    Gdy drugi detektor wykryje ruch, czyli gdy osoba wejdzie na piętro, rozpoczyna się sekwencja wygaszania stopni LED za pośrednictwem ATMega8. I teraz, gdy stopnie LED są wygaszone, program cały czas odlicza zadany czas, a chciałbym, żeby przerwał odliczanie i był w stanie gotowości, by zaczął odliczanie, gdy ponownie ktoś będzie chciał wejść na górę/zejść na dół.

    Możesz zadać sobie pytanie "a po co mi te odliczanie, skoro stopnie same się gaszą, gdy drugi detektor wykryje ruch?". Dlatego chciałbym zastosować takie odliczanie, ponieważ czasami gdy nikt nie wchodzi po schodach, stopnie się same zapalają - wynika to z tego, że czasami wystarczy podmuch cieplejszego wiatru, by detektor uznał to za ruch. Dlatego też, gdyby tak się stało, chciałbym by ATTiny13A po odliczeniu czasu, podał stan wysoki na PB4, który będzie odpowiadał za natychmiastowe wygaszenie wszystkich stopni (PB4 jest za pomocą przewodu zwarte z pinem na ATMega8, także gdy ATMega8 otrzyma stan wysoki od PB4, automatycznie wyłącza schody).

    Mam nadzieję, że mimo zagmatwania jakoś jasno przedstawiłem o co mi chodzi.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 cze 2016, o 16:43 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    Jeśli dobrze rozumiem, masz dwa detektory (nazwijmy je dolny i górny).
    Algorytm jest taki, że kiedy dolny detektor zadziała to oświetlenie schodów zostaje załączone i aby je wyłączyć jest potrzebny sygnał z górnego detektora (i odwrotnie, zależy czy ktoś wchodzi czy schodzi).
    Odliczanie czasu ma na celu wyłączenie oświetlenia po określonym czasie, gdy nastąpi przypadkowe i niezamierzone załączenie jednego z detektorów. Wtedy mikrokontroler nie uzyska sygnału z drugiego detektora i światło będzie włączone cały czas. Odliczanie czasu ma na celu wyłączenie oświetlenia w takim przypadku, niezależnie od tego, czy sygnał z drugiego detektora zostanie wysłany, czy też nie.

    Nie wiem jak często zdarzają się takie niezamierzone załączenia, ale to nie do końca rozwiązuje problem, bo światło i tak się będzie niepotrzebnie włączać. Może lepiej zainwestować w lepszej jakości czujniki ruchu?

    No ale prościej mówiąc, światło ma się świecić:
    od momentu wykrycia ruchu przez pierwszy detektor,
    do momentu otrzymania impulsu z drugiego detektora
    lub
    do momentu odliczenia określonego czasu.

    Jeśli tak, to nie wiem po co stosujesz dwa mikrokontrolery. Jeden w zupełności wystarczy.

    Nie napisałeś tego, ale zakładam, że sygnał na PB2 zostaje wyłączony w momencie otrzymania sygnału z drugiego detektora i wygaszenia światła. W tym momencie odliczanie czasu ma zostać przerwane i układ ma oczekiwać na następny stan wysoki na PB2, po otrzymaniu którego ma zacząć odliczanie od początku. Proponowałbym tak:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Niemniej proponuję zrobić to na jednym mikrokontrolerze, bo to tylko niepotrzebna komplikacja.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 18 cze 2016, o 14:42 
    Offline
    Nowy

    Dołączył(a): 02 maja 2016
    Posty: 16
    Pomógł: 0

    andrews napisał(a):
    Jeśli dobrze rozumiem, masz dwa detektory (nazwijmy je dolny i górny).
    Algorytm jest taki, że kiedy dolny detektor zadziała to oświetlenie schodów zostaje załączone i aby je wyłączyć jest potrzebny sygnał z górnego detektora (i odwrotnie, zależy czy ktoś wchodzi czy schodzi).
    Odliczanie czasu ma na celu wyłączenie oświetlenia po określonym czasie, gdy nastąpi przypadkowe i niezamierzone załączenie jednego z detektorów. Wtedy mikrokontroler nie uzyska sygnału z drugiego detektora i światło będzie włączone cały czas. Odliczanie czasu ma na celu wyłączenie oświetlenia w takim przypadku, niezależnie od tego, czy sygnał z drugiego detektora zostanie wysłany, czy też nie.

    Nie wiem jak często zdarzają się takie niezamierzone załączenia, ale to nie do końca rozwiązuje problem, bo światło i tak się będzie niepotrzebnie włączać. Może lepiej zainwestować w lepszej jakości czujniki ruchu?

    No ale prościej mówiąc, światło ma się świecić:
    od momentu wykrycia ruchu przez pierwszy detektor,
    do momentu otrzymania impulsu z drugiego detektora
    lub
    do momentu odliczenia określonego czasu.

    Jeśli tak, to nie wiem po co stosujesz dwa mikrokontrolery. Jeden w zupełności wystarczy.

    Nie napisałeś tego, ale zakładam, że sygnał na PB2 zostaje wyłączony w momencie otrzymania sygnału z drugiego detektora i wygaszenia światła. W tym momencie odliczanie czasu ma zostać przerwane i układ ma oczekiwać na następny stan wysoki na PB2, po otrzymaniu którego ma zacząć odliczanie od początku. Proponowałbym tak:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Niemniej proponuję zrobić to na jednym mikrokontrolerze, bo to tylko niepotrzebna komplikacja.


    Coś jednak nie działa tak jak powinno. Gdy zaprogramowałem uC i podłączyłem wszystko, to gdy pojawia się stan wysoki na PB2, automatycznie, bez żadnego odliczania pojawia się stan wysoki na PB1. Od razu mówię, że nic nie jest zwarte.

    @Edit

    Rozwiązałem sprawę w taki sposób:

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


    Mimo wszystko, dziękuję bardzo za pomoc ta funkcja "if( !(PINB & 0x04) ) break;" była funkcją kluczową, której szukałem :)



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 8 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