Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Arduino - mini stacja meteo

Crayou 29 Mar 2016 21:13 6438 43
  • #31
    Crayou
    Level 13  
    Mała kontynuacja:
    1. Dołożyłem barometr BMP180
    2. Zdefiniowałem symbole na LCD: termometr, kropelka, stopnie C, "ś"
    3. Przeorganizowałem ekrany

    Code: c
    Log in, to see the code


    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.
  • #32
    zster

    Level 28  
    Witam Kolegę :)
    Wybacz brak odpowiedzi na temat migania wyświetlacza - czy udało Ci się rozwiązać ten problem?
  • #33
    Crayou
    Level 13  
    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
    JacekCz
    Level 38  
    dondu wrote:

    Crayou wrote:
    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
    Crayou
    Level 13  
    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
    JacekCz
    Level 38  
    Crayou wrote:
    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
    Crayou
    Level 13  
    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
    Crayou
    Level 13  
    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:
    Code: c
    Log in, to see the code


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

    W odbiorniku:
    Code: c
    Log in, to see the code


    ...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:
    Code: c
    Log in, to see the code


    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".

    Code: c
    Log in, to see the code

    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
    Crayou
    Level 13  
    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
    Crayou
    Level 13  
    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
    Crayou
    Level 13  
    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
    zster

    Level 28  
    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
    Crayou
    Level 13  
    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 :(