Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla 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 21372 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 kartę SD 64GB.
    O autorze
    Flaman11
    Poziom 17  
    Offline 
    Specjalizuje się w: c#, asp.net, c++, bascom
    Flaman11 napisał 317 postów o ocenie 273, pomógł 1 razy. Mieszka w mieście Zgierz. Jest z nami od 2009 roku.
  • PCBway
  • #2
    Jacek Rutkowski
    Poziom 26  
    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
    zgierzman
    Poziom 21  
    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.
  • PCBway
  • #4
    SylwekK
    Poziom 30  
    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
    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
    SylwekK
    Poziom 30  
    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
    slaw0
    Poziom 12  
    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.
  • #8
    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
    qbass301
    Poziom 10  
    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
    Linoge
    Poziom 27  
    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
    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
    zgierzman
    Poziom 21  
    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
    cefaloid
    Poziom 31  
    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
    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
    cefaloid
    Poziom 31  
    ^^^^ 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
    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
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #19
    Jacek Rutkowski
    Poziom 26  
    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
    slaw0
    Poziom 12  
    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
    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
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #23
    yogi009
    Poziom 42  
    Czy Kolega Autor zechce wrzucić pliki Eagle? Zawsze byłby to pełny projekt do szerszego, hobbystycznego wykorzystania.
  • #24
    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
    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: