Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Termometr pokojowy z histerezą na DS18B20

Flaman11 04 Kwi 2013 19:35 21147 24
  • Termometr pokojowy z histerezą na DS18B20
    Witam,

    chciałem zaprezentować termometr pokojowy, który został zbudowany dla rodziców dziewczyny do monitorowania temperatury pieca.

    Termometr został zbudowany z wykorzystaniem mikrokontrolera Atemga8 w obudowie TQFP32, a za czujnik temperatury służy DS18B20. Płytki pochodzą z innych projektów.

    Wyświetlacze są multipleksowane z częstotliwością około 200Hz, za taktowanie procesora odpowiada wewnętrzny rezonator o częstotliwości 8MHz. Za odmierzanie czasu służy 10 bitowy zegar wewnętrzny odmierzający odcinki czasu równe około 5ms. Zegar również odmierza czas między komendą pomiaru temperatury, a jej odczytem z czujnika po upływie 1 sekundy. Na czas komunikacji z czujnikiem wyłączany jest globalny system przerwań. A w pętli głównej konwersja odczytu na temperaturę. Obsługa czujnika ogranicza się do wysłania komendy pomiaru temperatury, a po upływie jednej sekundy do jej odczytania z pominięciem sprawdzania ID i sprawdzenia sumy kontrolnej. Jako, że termometr będzie praktycznie pracował w temperaturach dodatnich, to program również nie jest wyposażony w sprawdzanie znaku.

    Termometr bada tendencję wzrostu temperatury co około 4minuty. Z histerezą równą 2 st.C. Jeżeli temperatura rośnie, to na wyświetlaczu świecą dwie kropki. Jeżeli temperatura waha się w przedziale 3st.C, kropki wygaszone. Natomiast jeżeli temperatura spada, to naprzemiennie świeci jedna bądź druga kropka przez jedną sekundę.

    Zastosowane elementy:

    Atmega8 TQFP x1
    DS18B20 TO92 x1
    wyświetlacz podwójny 7-mio segmentowy DA08-11SRWA wspólna anoda x1
    BC807 SOT23 x2
    3k3 0805 x3
    150R 0805 x8
    10k 0805 x1
    100nF 0805 x3
    10uF/50V SMD( nie pamiętam obudowy) x2

    Koszt ciężko powiedzieć, gdyż wszystko było, dlatego nie będę pisał.

    Poniżej wrzucam fotki i film z działania.
    Termometr pokojowy z histerezą na DS18B20 Termometr pokojowy z histerezą na DS18B20


    Termometr pokojowy z histerezą na DS18B20 Termometr pokojowy z histerezą na DS18B20

    W załączniku plik źródłowy w języku basic i wsad.

    Załączniki:

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz pendrive 32GB.
  • CControls
  • #2 05 Kwi 2013 00:21
    Jacek Rutkowski
    Poziom 24  

    To jest ważny punkt w pomiarze. Robiłem podobny termometr z wykorzystaniem LM35 i pomiarem przez ADC. Przy zainstalowaniu czujnika na wyjściu gorącej wody z pieca przed pompą obiegową temperatura bez załączonej pompy była ok 20-30°C niższa niż na termometrze wskazówkowym zainstalowanym w płaszczu wodnym. Dopiero załączenie pompy zmniejszało różnicę do ok 3°C.
    Pompa była przez większość czasu wyłączona ze względu na dobre ocieplenie domu i przegrzewanie pomieszczeń przy nastawie 40°C na piecu.
    Dopiero zamocowanie czujnika pod izolacją cieplną płaszcza pozwoliła na dokładny pomiar.

  • #3 05 Kwi 2013 07:33
    zgierzman
    Poziom 19  

    Zrobiłem kiedyś termometr z 1wire i multipleksowanym wyświetlaczem (4 znaki), ale nie mogłem pogodzić multipleksowania i transmisji. Albo sypały się dane i miałem błędne CRC, albo można było zauważyć mrugnięcie wyświetlacza kiedy zatrzymywałem przerwania dla wysłania/odebrania danych. 1wire jest dość wolne...
    Napisz, czy u ciebie nie ma tego efektu, bo nie wiem, czy warto punkt wydać.

    Warto by zrobić dedykowaną płytkę, wszystko weszło by na laminat nie wystający spod wyświetlacza. Elegancka kosteczka wielkości dokładnie takiej jak wyświetlacz, łatwa do zabudowania.

  • #4 05 Kwi 2013 09:01
    SylwekK
    Poziom 29  

    Zastanawia mnie dlaczego wyłączasz przerwania przy odczycie z DSa. Bez problemu cały odczyt można zrobić w przerwaniach, łącznie z multipleksem bez szkody dla wyświetlania. Oczywiście pomysł z kropkami jak najbardziej dobry chociaż histerezę bym do max 2 stopni zawęził.

  • #5 05 Kwi 2013 09:55
    squeze
    Poziom 12  

    SylwekK napisał:
    Bez problemu cały odczyt można zrobić w przerwaniach, łącznie z multipleksem bez szkody dla wyświetlania.


    Z tego co kojarzę to na odczyt z DS-a trzeba czekać około 750 ms i co _delay_ms w przerwaniu?

    Owszem można ale w przerwaniu ustawić tylko "flagę" a odczyt w pętli głównej.
    Bo nieporozumieniem jest robienie całego odczytu w przerwaniu.

  • #6 05 Kwi 2013 10:10
    SylwekK
    Poziom 29  

    Tak trzeba czekać, ale to nie jest absolutnie żaden problem. Można to zrobić na kilka sposobów, jednym z nich jest właśnie wystawienie flagi, ale są sytuacje gdzie cały odczyt można tam wcisnąć. Nie pamiętam już co było powodem, ale właśnie w jednym ze swoich sterowników odczyt umieszczony był w przerwaniach razem z multipleksem i czymś tam jeszcze. Oczywiście żadnych wait w przerwaniach nie używam. Opóźnienia opieram na licznikach programowych i przeskokach. Programuję w BASCOM-ie i prawdę mówiąc nie pamiętam już kiedy ostatnio używałem wait w jakiejkolwiek postaci...

  • #7 05 Kwi 2013 10:14
    slaw0
    Poziom 11  

    Można zrobić wyświetlacz bez multipleksowania na dwóch rejestrach przesównych i odświeżać go co np sekundę, wtedy jest dużo czasu na resztę programu.

  • CControls
  • #8 05 Kwi 2013 10:22
    Flaman11
    Poziom 17  

    hubertfab jest to proste urządzenie, które nie stanowi problemu w budowie, ale nie rozumiem w czym problem?

    LM35 też mógłby być, ale moim zdaniem pomiar byłby obarczony większym błędem, gdyż na dłuższym przewodzie w tym wypadku 5m i temperaturze to temperatura przewodu mogła by fałszować wynik.

    Z czterema wyświetlaczami również działa. Dorzucam film na czterech wyświetlaczach, z tym, że 3 i czwarty wyświetla stałą cyfrę.


    Obsługa czujników odbywa się w pętli głównej, a nie w przerwaniu, gdzie znajdują się również wszystkie operacje arytmetyczne, dla większej przejrzystości programu i wygody. Skoro komunikacja nie odbywa się w przerwaniu, to należy je wyłączyć, by przerwanie nie zaburzało komunikacji.

    To jest naprawdę prosty program, więc co za różnica tak naprawdę gdzie odbywa się komunikacja. Gdyby było potrzebne dokładne odmierzanie czasu, to by się kombinowała, a tak szybko i sprawnie ;)

    Histereza wynosi +- 2st.

  • #9 05 Kwi 2013 13:19
    qbass301
    Poziom 9  

    Cześć,
    Układ zgrabny, ważne, że użytkownik zadowolony.
    Co do 1wire to myślę, (choć specjalista nie jestem), że można to zrobić bez wyłączania przerwan. Timer konfigurujemy w tryb normal, ale lepiej chyba w CTC, konfigurujemy, żeby uzyskać te 100Hz dla wyświetlaczy, czyli mamy już multipleksowanie zrobione :-), wysyłamy polecenie konwersji, liczymy 100 przerwan w programie- minęła sekunda, wysyłamy polecenie odczytu i tyle. Potem znowu to samo,ogólnie liczyć programowo przerwania i z tych 5ms można sobie porobić inne liczniki. Myślę, że powinno działać.
    Pozdrawiam

  • #10 05 Kwi 2013 13:39
    Linoge
    Poziom 26  

    Ktoś może mi wyjaśnić rolę kondensatora C5 ?
    Brak większej pojemności na wyjściu stabilizatora i 100nF dla zasilania cyfrowej części atmegi.

    Jeśli chodzi o problem pogodzenia przerwań z obsługa one wire, mnie udało się tego dokonać przez optymalizację przebiegu samego przerwania, gdzie nie były dokonywane żadne zbędne obliczenia, jedynie "wyrzucanie" na port "gotowej" sekwencji.

  • #11 05 Kwi 2013 15:14
    Flaman11
    Poziom 17  

    Widzę, że 1Wire i przerwania to zawsze dobry temat na dyskusje :)

    Dlatego wrzucam drugą wersję programu termometru z obsługą 4 wyświetlaczy bez wyłączania przerwań. Obsługa czujnika odbywa się w przerwaniu. A reszta operacji już w pętli głównej, tak by jak najmniej działo się w przerwaniu.

    W pierwszym zgłoszonym przerwaniu do czujnika zostaje wysłana komenda pomiaru temperatury i ustawiona flaga blokująca komunikację. Po upływie sekundy następuje odczyt temperatury z czujnika i ustawiona flaga zezwalająca na przeliczenie wartości oraz ustawiona flaga na zezwolenie wysłania komendy pomiaru temperatury przy najbliższym przerwaniu. Praca zegara nie została zmieniona i wyświetlacze są multipleksowane z tą samą częstotliwością. 3 i 4 wyświetlacz podaje symbol st. C.

    Załączniki:
  • #12 05 Kwi 2013 21:01
    zgierzman
    Poziom 19  

    Też nie używam WAIT, a już na pewno nie na 750ms dla przetworzenia danych w czujniku. Tu nawet nie chodzi o przerwania. Po prostu samo odebranie ramki z danymi trwa swoje milisekundy. Pojedyncze, ale zawsze.
    Przy odświeżaniu 50Hz i czterech cyfrach mamy po 5 ms na cyfrę. Przedłużenie świecenia jednej z nich o kolejne 2 czy 3 ms powoduje jej zauważalne mrugnięcie (rozjaśnienie) ...

    Filmy nie są w tej sytuacji miarodajne, bo jak wiadomo kamera łapie rzeczy których normalnie nie widać i odwrotnie - nie potrafi pokazać rzeczy które w realu fajnie wyglądają.

  • #13 05 Kwi 2013 21:55
    cefaloid
    Poziom 30  

    zgierzman napisał:
    Zrobiłem kiedyś termometr z 1wire i multipleksowanym wyświetlaczem (4 znaki), ale nie mogłem pogodzić multipleksowania i transmisji. Albo sypały się dane i miałem błędne CRC, albo można było zauważyć mrugnięcie wyświetlacza kiedy zatrzymywałem przerwania dla wysłania/odebrania danych. 1wire jest dość wolne...


    zgierzman napisał:
    Po prostu samo odebranie ramki z danymi trwa swoje milisekundy. Pojedyncze, ale zawsze.
    Przy odświeżaniu 50Hz i czterech cyfrach mamy po 5 ms na cyfrę. Przedłużenie świecenia jednej z nich o kolejne 2 czy 3 ms powoduje jej zauważalne mrugnięcie (rozjaśnienie) ...


    Owszem powoduje.
    Miałem kiedyś identyczny problem, temperaturę mierzyłem co 10s i mrugnięcia o których piszesz były dla mnie nieakceptowalne.

    I w końcu znalazłem bardzo eleganckie rozwiązanie:
    - jak jak piszesz obsługa wyświetlacza to 5ms na cyfrę.
    - komunikacja z DS18B20 do 2-3ms

    A więc zrobiłem tak, że obsługiwałem komunikację z DS18B20 tak jakby był piątą cyfrą wyświetlacza. Czyli pomiędzy czwartą a pierwszą cyfrą zawsze przez tyle samo ms nie świeci żadna cyfra, czas ten jest zawsze stały i zarezerwowany na ewentualną komunikację z DS18B20.

    Proste i zero mrugnięć. Autorowi tematu również proponowałbym dołożenie w w kodzie 'Case 4' i umieszczenie komunikacji 1wire właśnie tam....
    'Case 4' to byłoby:
    - nic nie rób
    - lub wywołaj Wyswietl_pom
    - lub wywołaj Pomiar_sub

    Aby była to super fajna i kompletna obsługa DS18B20 to przydałoby się sprawdzanie 'presence pulse' czyli czy termometr istnieje, oraz kontrola CRC8 (Bascom ma gotową funkcję), ale to już jak autor chce się pobawić.

    Jeśli nie dało by się wygospodarować 'piątej cyfrze' odpowiednio dużo milisekund na pełną komunikację, to pamiętaj że można komunikację 1wire rozbić na kawałki rozdzielone obsługą wyświetlacza tzn. np można nawet wysyłać w trakcie przydzielonym 'piątej cyfrze' tylko po jednym rozkazie 1wire na pętlę. DS18B20 nie buntuje się przy takiej obsłudze.

  • #14 05 Kwi 2013 22:12
    Flaman11
    Poziom 17  

    Wszystko zależy od projektu. Jeżeli nie używane są timery, to czemu nie używać funkcji wait? Przecież konfiguracja zegara i późniejsze wstawki zajmą znacznie więcej miejsca w programie. Tu od początku nie było funkcji wait, a został użyty zegar z tego względu, by program mógł pracować dalej, gdy czujnik wciąż wykonuje pomiar.

    Tak aparat już wyłapuje multipleksowanie, ale w rzeczywistości nie widać migotania.

  • #15 05 Kwi 2013 22:21
    cefaloid
    Poziom 30  

    ^^^^ Bo masz tylko 2 lub 4 cyfry i czas komunikacji z DS18B20 jest niewielkim procentem czasu świecenia jednego znaku więc efekt mrugnięcia jest, ale mało dokuczliwy.

    Ja miałem 10 znaków i musiałem mocno skrócić czas świecenia 1 znaku. A wtedy te kilka ms na komunikację z termometrem to było więcej niż czas świecenia jednego znaku i wtedy było to strasznie denerwujące i widoczne mruganie.

  • #16 05 Kwi 2013 22:26
    Flaman11
    Poziom 17  

    cefaloid napisał:
    Proste i zero mrugnięć. Autorowi tematu również proponowałbym dołożenie w w kodzie 'Case 4' i umieszczenie komunikacji 1wire właśnie tam....
    Czyli 5 cyfra 'Case 4' to byłoby:
    - nic nie rób
    - lub wywołaj Wyswietl_pom
    - lub wywołaj Pomiar_sub

    Aby była to super fajna i kompletna obsługa DS18B20 to przydałoby się sprawdzanie 'presence pulse' czyli czy termometr istnieje, oraz kontrola CRC8 (Bascom ma gotową funkcję), ale to już jak autor chce się pobawić.


    Bardzo eleganckie rozwiązanie pogodzenia pracy wyświetlacza z obsługą 1Wire.

    Co do sprawdzanie obecności czujnika, czy sprawdzanie sumy kontrolnej, to nie przesadzajmy. Termometr jest czysto informacyjny, nie odpowiada za kontrolę żadnego innego urządzenia, więc zabezpieczenia nie są tu wymagane. Urządzenie nie powstało jak to ktoś wcześniej napisał by zaimponować, a jedynie zaoszczędzić chodzenie do pieca i sprawdzanie czy należy do niego dołożyć :)
    Gdyby to było urządzenie komercyjne, to wtedy już inaczej sprawa by wyglądała, a tak nie wygłupiajmy się :D

    cefaloid napisał:

    Bo masz tylko 2 lub 4 cyfry i czas komunikacji z DS18B20 jest niewielkim procentem czasu świecenia jednego znaku więc efekt mrugnięcia jest, ale mało dokuczliwy.


    To też właśnie od początku zdawałem sobie z tego sprawę i dlatego dla mnie wyłączenie systemu przerwań nie było żadną ujmą, a jedynie realizacją projektu.

  • #17 06 Kwi 2013 11:18
    1477378
    Użytkownik usunął konto  
  • #19 07 Kwi 2013 14:37
    Jacek Rutkowski
    Poziom 24  

    Wystarczy dodać prostą logikę do alarmu, gdy przez np. 30 minut jest alarm, wyłączenie jego działania a ponowne załączenie możliwe gdy piec osiąga temperaturę >35°C i < 45°C, tzn został ponownie uruchomiony. Ja w ten sposób zabezpieczam się przed wyciem alarmu gdy zabraknie zasilania np. w lato lub zimo gdy nie palę w piecu.

  • #20 07 Kwi 2013 15:06
    slaw0
    Poziom 11  

    Wydaje mi się ,że marcin387 myślał o alarmie za wysokiej temperatury, bo za niskiej nie ma co alarmować dźwiękiem, najwyżej piec zgaśnie (ewentualnie kilka piknięć, jednorazowo przypominających: idź podłóż do pieca:))

  • #21 07 Kwi 2013 15:31
    Flaman11
    Poziom 17  

    Nie skarżyli mi się na zbyt wysoką temperaturę, dlatego nie o tym buzer miał informować. Co do dwóch ostatnich pomysłów to mi się podobają po połączeniu ich w jeden wspólny i lekko modyfikując go w taki sposób:

    Po spadku temperatury poniżej granicznej, co kilka minut krótki sygnał dźwiękowy, a wyłączenie zasilania i ponowne włączenie uruchomi alarm po spełnieniu warunków opisanych przez kolegę Jacka.

    Jednakże tak, czy inaczej jest to jedynie pomysł, który nie zostanie już zrealizowany, ale może ktoś będzie budował podobny termometr, to niech korzysta :)

    A w razie potrzeby pomogę w modyfikacji kodu lub go napiszę i udostępnię.

  • #22 07 Kwi 2013 16:15
    1477378
    Użytkownik usunął konto  
  • #23 10 Kwi 2013 08:49
    yogi009
    Poziom 42  

    Czy Kolega Autor zechce wrzucić pliki Eagle? Zawsze byłby to pełny projekt do szerszego, hobbystycznego wykorzystania.

  • #24 10 Kwi 2013 21:01
    Flaman11
    Poziom 17  

    Oczywiście, że chętnie wrzuciłbym pliki Eagle'a, ale jak pisałem na wstępie. Płytki są z różnych projektów. Zaprojektuje płytkę, to wrzucę pliki jak również nową wersję softu, do której dołożyłem obsługę buzera według logiki kolegi Jacek Rutkowski. Jak tylko skończę płytkę i dopiszę komentarze do programu, tak by każdy wiedział, gdzie się co dzieje, to wszystko udostępnię.

  • #25 14 Cze 2013 22:21
    Flaman11
    Poziom 17  

    Powstała nowa wersja oprogramowania i pod nią zaprojektowałem płytkę, niestety projekt płytki został usunięty i muszę wykonać ją jeszcze raz, a nie mam w tej chwili czasu, ale wrzucę chociaż nowy soft. Płytka jak i nowszy soft powstał już dawno temu, jakoś zaraz po wrzuceniu termometru na elektrodę, a się nawet zmotywowałem do pewnych zmian i zaprojektowania płytki ze względu na duże zainteresowanie projektem.

    Krótko o zmianach w programie:

    - obsługa 4 wyświetlaczy, z tym że 3 i 4 wyświetlacz służy do wyświetlania st. C
    - obsługa buzera pełniący funkcje alarmu temperatury poniżej 45 st.
    - po włączeniu zasilania, jeżeli temperatura wynosi < 45st. alarm nieaktywny
    - jedna kropka w wyświetlaczu informuje o tendencji wzrostu temperatury, tak samo jak było to we wcześniejszej wersji, druga kropka informuje, czy alarm jest aktywny
    - po powtórzeniu 5 alarmów alarm ulega dezaktywacji i zostanie aktywowany w tryb czuwania po przekroczeniu temperatury 45 st.
    - sygnał dźwiękowy trwa około 10 sekund z powtarzaniem co 1 minutę. Po upływie 5 minut od chwili załączenia alarmu, alarm zostaje dezaktywowany.
    - w trakcie alarmu wyświetlacz miga w trybie "płynące światło"
    - częstotliwość multipleksowania została zwiększona do częstotliwości 200Hz

    W załączniku plik źródłowy i wsad.

    Załączniki: