Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino - mini stacja meteo

Crayou 29 Mar 2016 21:13 4173 43
  • #31 29 Mar 2016 21:13
    Crayou
    Poziom 11  

    Mała kontynuacja:
    1. Dołożyłem barometr BMP180
    2. Zdefiniowałem symbole na LCD: termometr, kropelka, stopnie C, "ś"
    3. Przeorganizowałem ekrany

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tak się prezentuje na chwilę obecną:

    Link


    W planach: czujka Dallasa bezprzewodowo.

    Jako że temat trochę się rozrósł - można zmienić tytuł/przenieść wątek - nie mam nic przeciwko.

  • #33 31 Mar 2016 11:05
    Crayou
    Poziom 11  

    Cześć.
    No niestety, nie umiem znaleźć przyczyny. Nie tyle miganie, co jedno mignięcie. Każdy "ekran" ma tą samą konfigurację ale przy pierwszym mignięcia nie ma...

  • #34 31 Mar 2016 12:57
    JacekCz
    Poziom 31  

    dondu napisał:

    Crayou napisał:
    Korzystam z bibliotek:
    <OneWire.h>
    <DS18B20.h>

    Jak mamy sprawdzić ich poprawność skoro ich nie załączasz? Bibliotek o tej nazwie do obsługi DS18B20 jest wiele.



    I wiele, jak można się domyślić, średniej jakości. Wybaczcie złośliwość ale tak to widzę.

  • #35 31 Mar 2016 14:02
    Crayou
    Poziom 11  

    Wiesz, nie było w nich napisane nic o jakości... Nie mogę tego sprawdzić. Korzystam z tych, które udostępniają inni w swoich projektach, przykładach.
    Biblioteki w załączniku.

  • #36 01 Kwi 2016 00:39
    JacekCz
    Poziom 31  

    Crayou napisał:
    Wiesz, nie było w nich napisane nic o jakości... Nie mogę tego sprawdzić. Korzystam z tych, które udostępniają inni w swoich projektach, przykładach.


    Niewiele jest publikowanych bibliotek, które totalnie nie chodzą. Nikt nie che wyjśc na głupka.

    Myślę że wiele, prawie wszystkie, chodzą przynajmniej w "przychylnym otoczeniu".
    Problem gdy to otoczenie wychodzi w taką stronę, jakiej programista nigdy nie projektował czy nie testował.

    Nie złośliwy przykład: Popularna DOBRA biblioteka do enkodera - ale nie do dwóch enkoderów różnych typów w jednym projekcie - to nie jest planowane.

    Wiele mocno ŚREDNICH bibliotek np powstałych w ciepłych krajach, dallasa tam tak nie testowano ;-) w Polsce też. Ekspres do kawy, zwis na twardo gdy jednocześnie braknie wody i kawy - żartuję zawodowo, programista nie odróżniał & i &&

  • #38 17 Mar 2017 19:08
    Crayou
    Poziom 11  

    Wracam do tematu.
    W międzyczasie stacja dorobiła się łączności bezprzewodowej na nRF24L01 - przesyła tylko temperaturę zewnętrzną (docelowo więcej parametrów). Od niedawna uruchamiam wyświetlacz matrycowy 8x32 pix, który ma zastąpić LCD z projektu. Zasadniczo już zastąpił ale mam pewien kłopot z transmisją bezprzewodową.
    Otóż - zarówno wyświetlacz jak i nRF24L01 do działania potrzebują z Arduino pinów MOSI, MISO, SCK i SS. Po podłączeniu tego razem wyświetlacz głupieje. Jak rozumiem, te dwa urządzenia nie mogą współistnieć na tych samych pinach...? To nie zadziała jak I2C, gdzie urządzenia łączy się jedno za drugim (?).
    Jeśli nie można łączyć razem tych dwóch modułów poprzez wspomniane piny, to jest jakaś alternatywa?
    Pozdrawiam.

    EDIT:
    Arduino - mini stacja meteo
    ...no jakoś się zrobić da ;)

  • #39 19 Mar 2017 16:25
    Crayou
    Poziom 11  

    Póki co przesiadłem się na RF433 z racji ich mniejszej "pinożerności". Tylko mam mały kłopot - wysyła mi tylko dwie cyferki... Gdzie mam błąd?
    Kod wysyłania nadajnika:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie wklejam całego kodu, bo jest obszerny - obsługuje też LCD. Korzystam z biblioteki VirtualWire.

    W odbiorniku:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    ...i wyświetlając buffer na wyświetlaczu, zawsze mam 2 cyrfy i dwa zera po przecinku. Np. wysyłam temperaturę 24.56 a odbieram 24.00. Kombinowałem mnożąc temperaturę wysyłaną przez 100, aby uniknąć przecinków i wysyłać int a nie float, odbierać int, dzielić przez 100 ale to też się nie udało...
    Jakieś sugestie? Bo mi tu pół niedzieli spełzło na niczym :(


    EDIT:
    A tu kłopot z mnożeniem temperatury razy 100.
    Napiszę prostszy program, aby uświadomić Wam w czym leży problem.
    Pomiar temperatury na DS18B20 wysyłany drogą radiową przez RF433:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tu wszystko działa OK. Ale gdy chcę stworzyć nowy int (lub float), który będzie temperaturą pomnożoną *100 (unikam przecinka przy wysyłaniu przez radio), wtedy mam tylko dwa poprawne pomiary a potem DS19B20 "wariuje".

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Tak to wygląda:
    Arduino - mini stacja meteo
    Dlaczego psuje mi się float temperature? Przecież po dokonaniu odczytu go nie dotykam. Wrzucam tylko do innej zmiennej...

  • #40 20 Mar 2017 17:56
    Crayou
    Poziom 11  

    Troszkę monolog z mojej strony ale - zostawię rozwiązania dla potomnych. Przyczyna wyświetlania tylko 2 cyfr dość banalna jak się okazało:
    - zmienna Sensor1Data była zadeklarowana jako int - zmieniono na float
    - konwersja Sensor1Data = atoi(Sensor1CharMsg); w prawidłowej postaci powinna wyglądać Sensor1Data = atof(Sensor1CharMsg);
    Śmiga - trzeba rozbudowywać projekt o nowe gadżety ;)

  • #41 18 Maj 2017 19:00
    Crayou
    Poziom 11  

    Cześć po przerwie.
    Aktualnie jest tak: stacja meteo otrzymała wyświetlacz led 8x32 pixele i moduł nRF24L01. Nadajnik wyposażony w LCD 2x16 wysyła temperaturę zewnętrzną, wilgotność powietrza oraz ciśnienie atmosferyczne. Resztą zajmuje się "baza". Jest parę spraw do dopracowania (czcionka, temperatura pokojowa, symbole 'C i inne).
    Teraz chciałbym wyświetlić tendencję ciśnienia - czy rośnie, czy maleje na przestrzeni np paru godzin. Tylko nie bardzo wiem jak się za to programowo zabrać... Odczyt ciśnienia jest raz na całą pętlę. Raz na godzinę trzeba by wrzucać wartość ciśnienia "do pamięci" i po zapisaniu np 3 wartości porównać je ze sobą i sprawdzić tendencję. Dobrze kombinuję? Jak zrealizować takie gromadzenie danych i porównywanie ich między sobą?

    Na dziś taki efekt (troszkę kamerka nie nadąża):

    Link


    Z RF433 zrezygnowałem, bo są bardzo kapryśne i licho u nich z zasięgiem - wystarczy postawić butelkę wody na blacie przy nadajniku i już głupiało. Pomiar temperatury pokojowej da się zrealizować łatwo modułem zegara (wbudowany pomiar temperatur) ale temperatura wewnątrz obudowy jest wyższa niż pokojowa. Można by po prostu odjąć jakąś wartość stałą ale póki co nie wiem czy temperatura w obudowie nie zmienia się w czasie pracy.

  • #42 22 Cze 2017 12:57
    Crayou
    Poziom 11  

    Jako, że napchałem już stację dużą ilością wyświetlanych informacji, żonka się piekli że musi długo czekać aby zobaczyć temperaturę zewnętrzną. Chciałbym móc wywołać ją w każdym momencie. Wykombinowałem sobie, że najlepiej byłoby to robić pilotem IR. Nie mogę umieścić w loopie funkcji odczytywania pilota, bo np. w czasie trwania animacji nie będzie żadnej reakcji.
    Więc...? Po raz pierwszy powinienem zainteresować się przerwaniami?
    Przerwanie samo w sobie nie odczyta konkretnego kodu z pilota, tylko zmianę stanu na wejściu cyfrowym. Mógłbym np. przerwaniem sprawdzać czy jakikolwiek sygnał IR się pojawił a w funkcji, która jest wywoływana przerwaniem, sprawdzić, czy odebrany kod z pilota jest poprawny -> wywołaj funkcję temperatury.
    Ale co się będzie działo, gdy będę klikał innym pilotem (np TV), co chwile wywoływał przerwanie, które nie będzie wywoływało żadnej funkcji? Po wykonaniu przerwania do którego momentu w loopie wrócimy? Tam gdzie przerwano, czy od początku?
    Boję się, że każda zmiana kanału w TV może rozpoczynać wykonywanie loopa w stacji meteo od nowa...
    Może da się to inaczej rozwiązać?

  • #43 24 Cze 2017 00:07
    zster

    Poziom 11  

    Przerwanie zatrzymuje wykonywanie kodu z funkcji loop() ( w Arduino ) a po skończeniu wykonywania funkcji z przerwania, kod jest wykonywany od miejsca, w którym przerwanie nastąpiło.

    Pamiętaj tylko, że funkcja wywoływana przerwaniem musi być extremalnie "krótka". Najlepiej ustawiać w niej tylko flagę, a realizację zadań z nią związanych przerzucić do innej funkcji czy miejsca w loop() . W takim wypadku , po ustawieniu flagi należy "wyłączyć" to przerwanie, a włączyć je dopiero po wykonaniu dekodowania komendy IR.

    Wszystko zależy od tego, czy chcesz by urządzenie reagowało na każdy przycisk każdego pilota IR czy tylko na określony przycisk...

    Możesz zobaczyć jak to jest zrobione w popularnej bibliotece : http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html
    i zaadaptować rozwiązania do swojego projektu.
    Lub z niej skorzystać.

  • #44 25 Cze 2017 11:26
    Crayou
    Poziom 11  

    Korzystam z irremote.
    Czytałem, że nawet delay nie działa w przerwaniach i może też zaburzać funkcje millis, więc faktycznie musi być króciutka i "podstawowa".
    Układ miałby reagować na konkretny przycisk. Pierwsze testy z odbiornikiem IR dawały pozytywne efekty (włączanie LEDa pilotem). Teraz błędnie podłączyłem z pośpiechu i ... niby odbiera komendy z pilota ale naciskając ten sam klawisz za każdym razem odczytuje inny kod :( Znaczy się chyba coś upaliłem. Pierdoła ze mnie :(

Szybka odpowiedź lub zadaj pytanie
Dziękuję Ci. Ta wiadomość oczekuje na moderatora.
 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME