Mirley - Elektronika i Programowanie
projekty, programy... wszystko o elektronice
M
RSS FB TW G+
Minitermometr Uniwersalny
Październik 11, 2011 Układy Pomiarowe
Main thumb Opisywany tutaj układ jest uniwersalnym termometrem dwukanałowym. Pracuje on w zakresie temperatur od -50.0 do +99.9 stopni. Układ został zaprojektowany do mierzenia temperatury w domu i na dworze ale z powodzeniem można dla niego znaleźć wiele innych zastosowań. Po zmianie oprogramowania urządzenie może pełnić funkcję prostego termostatu, lub bardziej złożonego regulatora temperatury. Układ został zbudowany w oparciu o popularny, często stosowany czujnik/czujniki DS18B20 i mikrokontroler ATTiny2313 co znacznie uprościło jego konstrukcję i zmniejszyło wymiary. Termometr udało się tak skompresować, że prawie wszystkie elementy mieszczą się pod typowym wyświetlaczem 3-cyfry o wysokości rzędu 15mm.

Projekt jest rozwinięciem układu dostępnego pod tym adresem, z tym że prawie wszystkie elementy zostały zmienione na komponenty SMD. Oczywiście można by było upakować bardziej elementy przewlekane jednak w dobie miniaturyzacji lepiej zrobić jeden krok dalej, budując układ o możliwie najmniejszych wymiarach. Daje to możliwość zamontowania gotowego modułu termometru lub prostego termostatu w już istniejące urządzenie lub zastosowanie obudowy niewiele większej od wyświetlacza. W wersji podstawowej termometr potrafi mierzyć dwie temperatury, wykorzystując dwa czujniki podłączone na niezależnych magistralach. Zmiany wyświetlanej aktualnie temperatury dokonuje się za pomocą dwóch przycisków.

Projekt został opublikowany w Elektronice dla Wszystkich 08/2011 i jest dostępny w postaci kitu AVT2985

Działanie:

Na rysunku 1 został przedstawiony schemat ideowy termometru. Sercem urządzenia jest mikrokontroler U1 (ATTINY2313), który pracuje na wewnętrznym oscylatorze, bez dzielnika częstotliwości. Daje to w efekcie taktowanie 8MHz. Brak rezonatora kwarcowego pozwolił zmniejszyć płytkę a dodatkowo umożliwił wykorzystanie wolnego pinu XTAL jako portu wejściowego PA0, do którego obecnie dołączony jest przycisk S2. Zadaniem mikrokontrolera jest odczyt pomiaru temperatury z dwóch czujników, przeliczanie wskazań do postaci dogodnej dla wyświetlania i obsługa przycisków S1 i S2. Kondensator C1 (100nF), umieszczony blisko mikrokontrolera filtruje jego napięcie zasilania podobnie jak kondensatory C2 (10uF) i C3 (10uF), które są konieczne do prawidłowej pracy stabilizatora U3 (78L05).
Rysunek 1: Schemat Ideowy
Prostota układu wynika z zastosowanego czujnika temperatury, którym tym przypadku jest DS18B20. Stanowi on w typowym ustawieniu 12-bitowy termometr cyfrowy mogący pracować w zakresie -55 do +125 stopni. Czas przetwarzania (konwersji) temperatury do wartości binarnej (liczby) trwa nie dłużej niż 750ms. Odczyt temperatury jest w pełni cyfrowy, a łączność z mikrokontrolerem zapewnia popularna magistrala 1-Wire.
Do prezentacji temperatury wykorzystywany jest trój-cyfrowy wyświetlacz LED z wewnętrznie połączonymi segmentami, przystosowanymi do multipleksowania. Znakomicie ułatwia to proces projektowania płytki. W tym przypadku zastosowanie trzech pojedynczych wyświetlaczy uniemożliwiło by wykonanie taniej jednostronnej płytki drukowanej. Rezystory R4-R11 (330) ograniczają prąd wyświetlacza LED do wartości maksymalnej rzędu 10-12mA (na segment). Średni prąd będzie jednak mniejszy ze względu na multipleksowanie. Do sterowania anodami wyświetlacza wykorzystywane są trzy popularne tranzystory T1-T3 (BC857). Ich prądy baz ograniczane są przez rezystory R1-R3 (3k3). Zaświecanie cyfr na kolejnych wyświetlaczach odbywa się poprzez cykliczne podawanie stanu niskiego na bazę jednego z tranzystorów T1-T3. W tej same chwili na porcie B mikrokontrolera powinna pojawić się zakodowana wartość odzwierciedlająca wyświetlany znak. Ważnym komponentem jest tutaj złącze GP1, które stanowi jednocześnie miejsce podłączenia czujników oraz wyjście sterowania (w przypadku budowy termostatu). Nie trzeba tutaj montować złącza goldpin, jak w projekcie modelowym, wystarczy wlutować przewody bezpośrednio w płytkę. W programie termometru stan niski na wyjściu sterowania pojawia się gdy temperatura jest ujemna. Wystarczy dołączyć diodę LED z szeregowym rezystorem 470R między to wyjście a +5V aby mieć sygnalizację znaku "-".

Budowa:

Widok płytki drukowanej od strony druku (od spodu) dostępny jest tutaj. Jej odbicie lustrzane można znaleźć tutaj. Pomocą w montażu płytki od strony druku (od spodu) będzie rysunek dostępny tutaj. Pomocą w konstrukcji płytki od strony elementów (od góry) będzie z pewnością schemat montażowy dostępny tutaj. Płytka została zaprojektowana jako jednostronna, a prawie wszystkie elementy są typu SMD. Wyjątek stanowią tu wyświetlacz, przyciski i złącza. Montaż nie jest skomplikowany ale wymaga niewielkiej wprawy w lutowaniu SMD.

Na samym początku dobrze jest przylutować właśnie te elementy, ponieważ brak wystających części z drugiej strony ułatwi montaż. Należy zwrócić uwagę że obwód masy przechodzi w jednym miejscu przez zworkę jaką tworzy przycisk (przycisk ma 4 wyprowadzenia parami zwarte). Gdyby zaszła konieczność rezygnacji z przycisków to zamiast S1 należy wlutować zworkę po stronie masy (kolor czerwony). Wadą małej płytki jest brak wyprowadzonego złącza programującego procesora, więc gdyby zaszła konieczność zmiany programu będzie trzeba przylutować kabelek programujący do pinów mikrokontrolera. W roli złącza zasilania podobnie jak w przypadku GP1 dobrze sprawdzają się kabelki przylutowane bezpośrednio do płytki. Opis pinów złącza GP1 przedstawiony jest na rysunku 2
Rysunek 2: Opis Złącza
Wyprowadzenia 1 i 2 tego złącza to odpowiednio: zasilanie i masa. Wyjście sterowania (OUT) jest tutaj dostępne na pinie 3. Czujniki należy podłączyć trój-przewodowo wykorzystując wyprowadzone zasilanie, masę i linie sygnałowe 5 i 6. Linia danych czujnika pierwszego ma zostać podłączona do pinu 5, a z czujnika drugiego do pinu 6 złącza GP1. Układ termometru zasilany jest napięciem z przedziału 7-12V dzięki obecności stabilizatora 78L05. Nic nie stoi na przeszkodzie aby pominąć stabilizator a napięcie zasilania 5V podać bezpośrednio na termometr.

Programowanie:

Program sterujący pracą termometru został napisany w dobrze znanym programie BASCOM AVR . Zajmuje on około 70% dostępnej pamięci mikrokontrolera i może być z powodzeniem kompilowany w wersji demo BASCOM’a. Działanie programu nie jest skomplikowane i w skrócie wygląda to następująco: cały czas procesor kręci się w nieskończonej pętli Do Loop, czekając na ustawienie jednej z flag taktujących w przerwaniu. Za odpowiednie taktowanie odpowiada Timer0. Co około 4ms wywoływana jest procedura multipleksowania wyświetlacza, z której w odpowiednim momencie następuje skok do odczytu temperatury.
Procedura obsługi przerwania Timera0 widoczna jest poniżej:
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return
Na początku do licznika timera ładowana jest wartość 131, daje to przerwanie po odliczeniu 125 impulsów (256-131). Timer pracuje z dzielnikiem sprzętowym przez 256 co przy częstotliwości taktowania 8MHz daje przerwanie co 4ms. Bezpośrednio po wystąpieniu przerwania ustawiana jest flaga F4ms. Zmienne Dziel(1) i Dziel(2) stanowią dzielnik częstotliwości. Pierwsza odpowiada za podział przez 25 i po przepełnieniu licznika ustawiana jest flaga F100ms (następuje to co 100ms). Druga zmienna jest licznikiem do 10 i zapewnia ustawianie flagi F1s co 1s.

Pętla główna widoczna jest poniżej:
Do

If F4ms = 1 Then
  Reset F4ms                                               'co 4ms
  Wysw = T
  Gosub Wyswietl_zmierz
End If

If F100ms = 1 Then
  Reset F100ms                                             'co 100ms
  If Pind.2 = 0 Then Kanal = 1
  If Pina.0 = 0 Then Kanal = 0
End If

Loop
End
Działanie jest bardzo proste i zależne tylko od flag: F4ms i F100ms. Przez większość czasu procesor kręci się w nieskończonej pętli Do Loop czekając na ustawienie jednej z flag. Co 4 ms wywoływana jest procedura obsługująca wyświetlacz i pomiar temperatury, natomiast co 100 ms odczytywane są stany klawiszy. W podstawowej wersji programu wystarczy prosta obsługa klawiatury poprzez bezpośredni odczyt stanu pinów wejściowych. Naciśnięcie S1 powoduje przejście do odczytu drugiego czujnika, natomiast naciśnięcie S2 przechodzi do czytania czujnika pierwszego.

Procedura obsługi wyświetlacza i pomiaru temperatury widoczna jest poniżej:
Wyswietl_zmierz:
  Incr Mux
  If Mux = 5 Then Mux = 0

  Portd.3 = Not Minus

  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
  If W(3) = 40 Then W(3) = 255          'wygaszenie zera wiodącego

  Select Case Mux
    Case 0:
      Portb = W(3)
      Reset Portd.6
    Case 1:
     Set Portd.6
     Portb = W(2) And &B11011111
     Reset Portd.5
    Case 2:
     Set Portd.5
     Portb = W(1)
     Reset Portd.4
    Case 3:
     Set Portd.4
     Portb = 255
     Gosub Temp
   'Case 4:  
  End Select
Return

Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
Działanie składa się z 5 kroków zależnych od stanu zmiennej pomocniczej Mux. Przyjmuje ona wartości od 0 do 4 i zmienia się cyklicznie z kolejnym wywołaniem procedury. Na wyjście sterowania (Portd.3) przepisywana jest zanegowana wartość zmiennej Minus. Odpowiada ona za wyświetlanie ujemnych temperatur i tym samym na porcie d.3 mikrokontrolera pojawia się stan niski gdy mierzona temperatura jest ujemna. W dalszej kolejności dzięki pętli for, zmienna Wysw, zawierająca wartość do wyświetlenia, dzielona jest na trzy pojedyncze cyfry. Następnie są one zamieniane na kody wyświetlacza LED za pomocą polecenia Lookup (z wykorzystaniem tabeli przeliczeniowej). Po wyjściu z pętli for uzyskuje się tablicę W(n) z zakodowanymi wartościami, gdzie n=1...3 indeksuje kolejne znaki wyświetlacza.

Dalsza część procedury zależy od zmiennej Mux. Dla wartości 0 do 2 zaświecane są kolejne cyfry poprzez wyłączenie poprzedniej anody, wystawienie na Portb wartości kolejnego znaku i włączenie odpowiadającej mu anody. Wyjątkiem jest tutaj znak W(2) gdzie dodatkowa operacja (And &B11011111) zapewnia dodanie kropki dziesiętnej po drugim znaku. Dla wartości Mux=3 wywoływana jest procedura pomiaru temperatury, a stan Mux=4 jest fazą oczekiwania na spokojne zakończenie pomiaru temperatury.

Procedura pomiaru temperatury widoczna jest poniżej:
Temp:
 If F1s = 1 Then
   Reset F1s
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T = 1wread(2 , Pind , Kanal):
   Minus = T.15
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
  End If
Return
Procedura ta wywoływana jest co około 20ms, jednak wykonywanie pomiaru odbywa się co 1s dzięki sprawdzaniu stanu flagi F1s. Występuje tutaj typowa obsługa magistrali 1-Wire dla przypadku obecności tylko jednego układu na magistrali. Wszystkie rozkazy 1-Wire wywoływane są z parametrem Kanal, który odpowiada za to z której magistrali temperatura ma być odczytana (pind.0 czy pind.1). Po wykonaniu resetu następuje wysłanie rozkazu pominięcia sprawdzania ROM oraz wysłanie rozkazu odczytu rejestru DS18B20. Następnie odczytywane są dwa bajty temperatury do zmiennej T (integer), określany jest znak temperatury i wykonywane są proste przeliczenia. W efekcie zmienna T przyjmuje postać temperatury w stopniach pomnożonej przez 10 (np. 13 to 1.3 stopnia). Na samym końcu wysyłany jest rozkaz konwersji temperatury aby w kolejnym odczycie uzyskać aktualną jej wartość.

Układ da się przerobić na termostat niewielkim nakładem pracy. Rezygnujemy wtedy z dwukanałowego pomiaru temperatury oraz ujemnych temperatur na koszt sterowania wyjściem. Do wyjścia sterowania (Portd.3) można dołączyć optotriaka i triaka sterującego dowolnym odbiornikiem prądu przemiennego lub można dołączyć tranzystor MOSFET sterujący odbiornikiem prądu stałego. W pętli głównej trzeba będzie wprowadzić modyfikacje widoczne poniżej:
If F4ms = 1 Then
  Reset F4ms
  If Ust = 0 Then Wysw = T Else Wysw = Tu
  Gosub Wyswietl_zmierz
End If

If F100ms = 1 Then
  Reset F100ms
  If Pind.2 = 0 Then
    Incr Tu
    Autoret = 20
  End If
  If Pina.0 = 0 Then
    Decr Tu
    Autoret = 20
  End If

  If Autoret > 0 Then
    Ust = 1
    Decr Autoret
  Else
    Ust = 0
  End If

  H = Tu + 10
  L =  Tu - 10

  If T > H Then Set Portd.3
  If T < L Then Reset Portd.3
End If
Taki kod wymaga zadeklarowania zmiennych Tu, H oraz L jako Integer oraz Ust jako Bit i Autoret jako Byte, na początku programu. Dodatkowo zmienna Tu powinna mieć wartość początkową, gdyż stanowi wartość temperatury ustawianej. W procedurze wyświetlania i mierzenia należy usunąć linijkę odpowiedzialna za sygnalizację ujemnych temperatur, gdyż portd.3 służy teraz jako wyjście sterowania. Przedstawione rozwiązanie nie jest idealne, nie ma żadnego ograniczenia na ustawiane wartości ani nie potrafi zapisywać ustawień do pamięci EEPROM ale w wielu sytuacjach znakomicie się sprawdzi. Może działać z powodzeniem jako termostat do trawiarki po ustawieniu domyślnej wartości Tu na 40 stopni. Fusebity mikrokontrolera powinny być ustawione na pracę z wewnętrznym oscylatorem RC o częstotliwości 8MHz, co w praktyce sprowadzi się do wyłączenia jedynie dzielnika sprzętowego (Bit CKDIV). Ustawienia fusebitów znajdują się poniżej:

Zdjęcia Projektu:

Wykaz Elementów:

Elementy Termometru:

Załączniki:

Projekt Płytki:
AB AB AB Płytka (strona druku,termotransfer) 10.7 kB
AB AB AB Płytka (strona druku,odbicie lustrzane) 10.7 kB
AB AB AB Płytka (strona druku, kilka płytek na stronie, termotransfer) 157.0 kB
AB AB AB Montowanie (strona elementów) 8.7 kB
AB AB AB Montowanie (strona druku) 13.7 kB
AB AB AB Warstwa Opisowa (strona elementów) 53.3 kB
AB AB AB Warstwa Opisowa (strona druku) 100.5 kB
Dokumentacja:
AB AB AB Schemat Ideowy 117.4 kB
Programowanie:
AB AB AB Termometr Kod Źródłowy (BASCOM-AVR) 3.1 kB
AB AB AB Termostat Kod Źródłowy (BASCOM-AVR) 3.4 kB
AB AB AB Termometr Program wynikowy (BIN BASCOM-AVR) 1.4 kB
AB AB AB Termostat Program wynikowy (BIN BASCOM-AVR) 1.6 kB
AB AB AB Termostat Program wynikowy (HEX) 4.6 kB
AB AB AB Termometr Program wynikowy (HEX) 4.1 kB
AB AB AB Ustawienia Fusebitów (burn-o-mat) 12.5 kB

Pytania i Komentarze:

comments powered by Disqus


Marzec 23, 2017
Zegar Nixie z termoemtrem został ukończony
Więcej …
Marzec 23, 2017
Zegar Nixie z termoemtrem, prace trwają

Więcej nowinek …

LISPOL
Polecane Strony