Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

- Millis() jako wyłącznik czasowy

PiotrDzz 06 Sty 2017 11:23 1245 15
  • #1 06 Sty 2017 11:23
    PiotrDzz
    Poziom 10  

    Proszę o pomoc gdyż, albo źle do tego podchodzę, albo zwyczajnie tego nie ogarniam. Chcę zrobić sterowanie (projekt) do otwierania drzwi garażowych z trybem światła w nocy i chodzi o to by po tym jak silniki przestaną pracować światło było włączone jeszcze przez jakiś czas (np. 30 sekund) ale nie zatrzymywało programu. Dlatego użyłem funkcji Millis() jednak nie wiem jak przerobić ją na działanie takie jak opisałem. Ma ktoś pomysł jak to zrobić ? Dodam że wzorowałem się na stronie Link

    Kod działa w taki sposób że światło wyłącza się zaraz po skończeniu działania kodu silników, a nie czeka jeszcze jak u mnie 5 sek.

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #2 06 Sty 2017 12:06
    dedito
    Poziom 39  

    Proponuję wyjść z tym światełkiem poza ramy warunku wykrywającego wciśnięcie 'c', bo to nigdy tak nie zadziała (pomijając już niepoprawność samego kodu i nierozumienie funkcji millis).

  • #3 06 Sty 2017 12:13
    namok
    Poziom 24  

    Kod nie działa bo część z millis() jest w złym miejscu. Obecnie sprawdzasz millis gdy przyjdą jakieś dane a one przecierz nie przujdą. Urzyj automatycznego formatowania(Narzędzia->Automatyczne formatowanie) to powinieneś zobaczyć w czym problem.

  • #4 06 Sty 2017 12:29
    PiotrDzz
    Poziom 10  

    dedito napisał:
    Proponuję wyjść z tym światełkiem poza ramy warunku wykrywającego wciśnięcie 'c', bo to nigdy tak nie zadziała (pomijając już niepoprawność samego kodu i nierozumienie funkcji millis).


    No właśnie nie mogę do końca zrozumieć tej funkcji a przejrzałem dużo stron polskich i trochę mniej zagranicznych ale nie będę ukrywał że ciężko mi to zrozumieć. Jeżeli umieszczę fragment poza if-em to czy w przypadku dodania kolejnych if-ów nie będzie to problemem ? Ogólnie cały projekt mam taki:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    I chodzi o to że chciałbym włączać światło tylko przy wysyłaniu znaku "c". Czy dalej mam próbować umieszczać funkcję poza warunkami ?


    namok napisał:
    Kod nie działa bo część z millis() jest w złym miejscu. Obecnie sprawdzasz millis gdy przyjdą jakieś dane a one przecierz nie przujdą. Urzyj automatycznego formatowania(Narzędzia->Automatyczne formatowanie) to powinieneś zobaczyć w czym problem.


    No właśnie wyjaśniłem że nie do końca rozumiem jak ma to być dlatego poprosiłem o pomoc :) Co do automatycznego formatowania to użyłem go ale w zasadzie to chyba nic się nie zmieniło. Pewnie to głupie pytanie, ale co dokładnie robi ta opcja ?

  • #5 06 Sty 2017 13:30
    dedito
    Poziom 39  

    Proponuję w ramach otwierania garażu utworzyć zmienną pomocniczą, którą będziesz załączać na początku i wyłączać na końcu procedury sterowania bramą garażu. Stan tej zmiennej będziesz sprawdzał w innym warunku sterującym światłem, gdzie już użyjesz millis do podtrzymania załączenia na określoną zwłokę.

  • #6 06 Sty 2017 14:01
    PiotrDzz
    Poziom 10  

    Ok spróbuję tak jak mówisz jednak zajmie mi to chwilę, gdyż na razie nie rozumiem jak mam to zrobić, dlatego też napiszę dopiero jutro albo za dwa dni jak to ogarnę.

  • #7 07 Sty 2017 12:55
    PiotrDzz
    Poziom 10  

    Kolego "dedito" mógłbyś naprowadzić mnie trochę dokładniej na Twoją myśl ? Mam utworzyć zmienną tylko nie rozumiem jak mam ją załączać, chodzi o to że deklaruję zmienną na początku skeczu np. "int Zmienna" a następnie po "if (DaneBT == 'c')" piszę "Zmienna=1;" następnie na końcu piszę "Zmienna=0;" i wtedy w nowym if-ie sprawdzam wartość zmiennej i odpowiednio steruję światłem ?

  • #8 07 Sty 2017 13:25
    dedito
    Poziom 39  

    W ramach procedury otwierania garażu na początku i na końcu ustaw zmienną boolowską np.

    Code:

    otwieranie_garazu = true
    załącz światło
    ......
    ......
    otwieranie_garazu = false

    Następnie w ramach funkcji loop ... utwórz dodatkową procedurę:
    - jeśli stan zmiennej otwieranie_garazu jest false i światło jest załączone wtedy odlicz ustaloną zwłokę i wyłącz światło.

  • #9 07 Sty 2017 13:59
    PiotrDzz
    Poziom 10  

    A czy drugi warunek jest potrzebny ? Tzn. ten jeżeli światło jest załączone, zrobiłem tylko na warunku "if (garaz==false)" i światło zostaje wyłączone jednak bez ustalonej zwłoki, co dalej robię źle ?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Próbowałem także usunąć linjkę "garaz = true;" i bez tego kod działa tak samo, wydaje się że nie jest to potrzebne ale poeksperymentuję jeszcze z tym Millis-em i może dojdę do tego dlaczego to nie działa.

  • #10 08 Sty 2017 17:22
    PiotrDzz
    Poziom 10  

    Przerobiłem kod tak żeby był w miarę prosty żeby zrozumieć jego działanie po kolei jednak coś jest nie tak gdyż przy wysłaniu znaku "c" dioda raz gaśnie po zadanym czasie a raz zaraz po wysłaniu "c". Kod (według mnie) wykonuje się następująco:

    Od początku:
    1. Przypisanie do zmiennej "swiatlo" wartości "true" czyli stan wysoki.
    2. W "void setup" program ustawia na pinie 12 wartość "true" czyli stan wysoki (tutaj wyjaśnię żeby było dokładniej, że program steruje diodą przez przekaźnik który jest załączany stanem niskim dlatego na początku ma być stan wysoki czyli dioda nie świeci).
    3. W "void loop" jeżeli "serial" dostępny, odczytaj "serial", i jeżeli otrzymany znak z "seriala" to "c", zaneguj stan zmiennej "swiatlo"(czyli mamy teraz stan "LOW") i ustaw zmienną "garaz" na "false". Tutaj pętla nie wykona się znowu dopóki program nie otrzyma znaku "c".
    4. Tutaj jest problem gdyż nie wiem jak to dokładnie opisać: Sprawdzaj ciągle czy "garaz" równa się "false", jeżeli tak wykonaj część programu odpowiedzialną za zwłokę i ustaw na pinie 12 stan "HIGH" czyli "true".

    Pkt. 4 powinien chyba być przed pkt. 3 gdyż warunek zostaje sprawdzony zawsze, jednak działać ma tylko gdy "garaz==false". Dobrze to rozumiem ? Gdzie robię błąd ?

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #12 08 Sty 2017 18:49
    PiotrDzz
    Poziom 10  

    Bardzo dziękuję za program i poświęcony czas.

    Zrobiłem to nie do końca dobrze ale na razie nie mogę wymyślić jak całą procedurę IF - ELSE przenieść poza sprawdzanie czy program otrzymał jakiś znak. Program działa jak na razie (chyba) dobrze, no oprócz tego, co wynika z mojego braku odpowiedniej wiedzy, że dioda nie zgaśnie po zadanym czasie jeżeli będę wysyłał znak "b" przez cały czas. Dopiero zaprzestanie wysyłania innego znaku niż "c" od razu gasi diodę (oczywiście jeżeli całkowity czas pracy silników jest większy niż zadany czas świecenia). Nie wiem jak będzie to wyglądało na późniejszym etapie gdy program będzie skończony, niemniej spróbuję jeszcze zrobić to Twoim sposobem.

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #13 22 Sty 2017 11:46
    PiotrDzz
    Poziom 10  

    Kolego "dedito" znalazłem dzisiaj taką stronę, jednak jeszcze tego nie testowałem. Miałeś styczność z tymi timerami ? Na pierwszy rzut oka wygląda to dużo lepiej niż funkcja millis() i jest "chyba" prostsza, co myślisz ?

  • #14 22 Sty 2017 12:16
    dondu
    Moderator Mikrokontrolery Projektowanie

    PiotrDzz napisał:
    Kolego "dedito" znalazłem dzisiaj taką stronę, jednak jeszcze tego nie testowałem. Miałeś styczność z tymi timerami ? Na pierwszy rzut oka wygląda to dużo lepiej niż funkcja millis() i jest "chyba" prostsza, co myślisz ?

    Czas poznać mikrokontrolery od podszewki: http://mikrokontrolery.blogspot.com/p/spis-tresci.html

  • #15 22 Sty 2017 12:48
    rs6000
    Poziom 20  

    dondu napisał:
    PiotrDzz napisał:
    Kolego "dedito" znalazłem dzisiaj taką stronę, jednak jeszcze tego nie testowałem. Miałeś styczność z tymi timerami ? Na pierwszy rzut oka wygląda to dużo lepiej niż funkcja millis() i jest "chyba" prostsza, co myślisz ?

    Czas poznać mikrokontrolery od podszewki: http://mikrokontrolery.blogspot.com/p/spis-tresci.html

    Polecam, to najlepszy blog o mikrokontrolerach (i nie tylko) po polsku.
    Napisany prostym i jasnym językiem ;)

    Pozdr

  • #16 01 Mar 2017 19:00
    PiotrDzz
    Poziom 10  

    Długo nic nie pisałem gdyż musiałem zająć się innymi sprawami, ale w końcu podaję rozwiązanie jak poradziłem sobie z moim problemem. Otóż przerobiłem program tak aby wyglądał podobnie do tego który podał kolega "dedito".

    Kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ten kod jest umieszczony w pętli Loop:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Poczekam jeszcze kilka dni gdyby ktoś miał pytania, a następnie temat zamykam :)

    PS. Dodałem kod przez Syntax C/C++ ale nie są uwzględnione wcięcia, dlaczego tak się stało ?

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME