Termometr Domowy

Urządzenie jest prostym termometrem zbudowanym w oparciu o czujnik DS18S20 i sterujący nim mikrokontroler AT89C2051. Układ przystosowany jest do wskazywania temperatury na zewnątrz, obsługuje ujemne wartości. Umożliwia wyłączenie wskazań na wyświetlaczu (w celu oszczędności energii) w dwóch trybach, nie przerywając pomiaru temperatury. Za pomocą zworki dokonujemy wyboru trybu wyświetlania (czasowy lub ręczne wł/wył w którym każde kolejne wciśnięcie przcisku cyklicznie włącza i wyłącza pokazywanie temperatury). Dzięki podłączeniu wyświetlacza "do góry nogami" możliwe jest wyświetlenie znaku stopnia Celsjusza wykorzystując kropkę u dołu cyfry.

Działanie:
Schemat ideowy termometru przedstawia poniższy rysunek:

Sercem układu jest mikrokontroler U2 (AT89C2051) wraz z rezonatorem kwarcowym X1 (12MHz) i kondensatorami C4 (33pF) i C5 (33pF). W obwodzie resetu procesora pracuje kondensator C3 (4,7uF), zapewnia on poprawną pracę mikrokontrolera po włączeniu zasilania. Przycisk S1 i zworka GP sterują funkcjami termometru. Napięcia dla całego obwodu dostarcza zasilacz zbudowany na stabilizatorze U1 (7805) oraz elementach C1 (1000uF) i C2 (47uF). Do złącza zas podłączamy transformator zasilający. Rezystory R9 - R16 (510R) ograniczają prąd wyświetlaczy led. Anodami wyświetlaczy sterują tranzystory T1 - T4 (BC557) wraz z rezystorami R1 - R8 (3,3k).

Budowa:
Termometr można zbudować w oparciu o płytkę drukowaną dostępną tutaj. Rysunek w odbiciu lustrzanym dostępny jest tutaj. Montaż należy rozpocząć od wlutowania dwóch zworek. Kolejność pozostałych elementów jest dowolna ale dobrze jest lutować elementy w kolejności od najmniejszych do największych. Pod wyświetlacz i procesor dobrze jest zastosować podstawki. Pod mikrokontroler jest ona bezwzględnie konieczna. Wyświetlacz jest zamontowany "do góry nogami" ze względu na łatwe wyświetlenie znaku stopnia Celsjusza. Czujnik DS18S20 należy zamontować na kawałku przewodu. Pomocą w konstrukcji może okazać się schemat montażowy dostępny tutaj.

Wykaz Elementów:
1x Złącze ARK2
2x Listwa goldpin 1x3
1x uSwitch

8x 510R
8x 3,3k

2x 33pF
1x 4,7uF Elektrolit
1x 47uF Elektrolit
1x 1000uF Elektrolit

1x Rezonator Kwarcowy 12MHz
1x Mostek Prostowniczy 1A
1x 7805
1x AT89C2051 + Podstawka
4x BC557B
1x Wyświetlacz poczwórny 7 segmentowy
1x DS18S20

Programowanie:
Mikrokontroler do termometru został zaprogramowany w wersji demo programu BASCOM 8051 firmy MCS Electronics (http://www.mcselec.com/). Program przedstawiony jest poniżej:

Config Timer0 = Timer , Gate = Internal , Mode = 2            'okres Timera0 250*12*Tosc=250us
Load Timer0 , 250
On Timer0 Przerwanie
Enable Interrupts
Enable Timer0
Start Timer0

P1 = 255
P3 = 255
Config 1wire = P3.5
'*******************************************************************************
                                  'Zmienne
'*******************************************************************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Byte , Wysw1 As Byte , Wysw10 As Byte
Dim Tempa As Byte
Dim Mux As Byte
Dim Autooff As Word
Dim Przycisk As Byte

Dim Zezw_przyc As Bit , Zezw_wysw As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Pokaz As Bit
Dim Przyc As Bit
'*******************************************************************************
                                  'wartosci
'*******************************************************************************
Reset Pomiar_odczyt
Set Pokaz
Autooff = 1500
'*******************************************************************************
                                  'Petla glowna
'*******************************************************************************
Do

If Zezw_wysw = 1 Then                                         'wyswietlanie
  Reset Zezw_wysw
  '*****************************************      'co 4ms
  If P3.4 = 0 Then
    Incr Przycisk
    If Przycisk = 200 Then
      Przycisk = 0
      Set Przyc
    End If
  Else
    Przycisk = 180
    Reset Przyc
  End If

  If P3.7 = 0 Then

   If Przyc = 1 Then
    Reset Przyc
    Pokaz = Not Pokaz
   End If

  Else

   If Przyc = 1 Then
    Reset Przyc
    Set Pokaz
    Autooff = 1500
   End If

   If Autooff > 0 Then
    Decr Autooff
   Else
    Reset Pokaz
   End If

  End If

  If Pokaz = 1 Then
    Wysw = Tempa
    Gosub Przelicz
    Gosub Wyswietl
  Else
    P1 = 255
  End If

  '*****************************************
End If

Loop
End
'*******************************************************************************
                                  'Przerwanie Timera
'*******************************************************************************
Przerwanie:                                                   'co 250us
 Incr Co4ms
 If Co4ms = 16 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     Set Zezw_przyc
     Incr Co1s
     If Co1s = 10 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt

       Disable Interrupts
       1wreset

       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then

          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
                                            
          If Msb = 0 Then
            Reset Minus
            Tempa = Lsb / 2
          Else
            Set Minus
            Lsb = Not Lsb
            Tempa = Lsb / 2
            Tempa = Tempa + 1
          End If

        Else
          Tempa = 255                                         'Er wyswietli wyswietlacz potem
        End If
       End If

       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
Return
'*******************************************************************************
Przelicz:
 If Wysw < 100 Then
   Wysw1 = Wysw Mod 10
   Wysw1 = Lookup(wysw1 , Tabela)
   If Wysw > 9 Then
     Wysw10 = Wysw / 10
     Wysw10 = Lookup(wysw10 , Tabela)
   Else
     Wysw10 = 255                                             ' znika 0 na pierwszym miejscu
   End If
 Else
   Wysw1 = 175                                                'r
   Wysw10 = 134                                               'E
 End If

Return
'*******************************************************************************
Wyswietl:
  Incr Mux
  If Mux = 4 Then Mux = 0

  Select Case Mux
    Case 0:
     Set P3.0

     If Minus = 1 Then
       If Wysw10 = 255 Then
        P1 = 255
       Else
        P1 = 191
       End If
     Else
       P1 = 255
     End If

     Reset P3.3
    Case 1:
     Set P3.3

     If Minus = 1 Then
       If Wysw10 = 255 Then
        P1 = 191
       Else
        P1 = Wysw10
       End If
     Else
      P1 = Wysw10
     End If

     Reset P3.2
    Case 2:
     Set P3.2

     P1 = Wysw1

     Reset P3.1
    Case 3:
     Set P3.1

     P1 = 70

     Reset P3.0
  End Select

Return
'*******************************************************************************
                           'Tabela do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
'znak:    0     1     2     3     4     5     6     7     8     9
'*******************************************************************************

Zdjęcia Projektu:

ZałącznikRozmiar
Schemat82.26 KB
Płytka13.95 KB
Płytka (odbicie lustrzane)13.94 KB
Płytka (3 na stronie)37.22 KB
Montowanie19.15 KB
Kod źródłowy5.69 KB
Program po kompilacji (BIN)931 bajtów
Program po kompilacji (HEX)2.61 KB

wyswietlacz

Witam,
Czy można dowiedzieć sie jaki dokładny model tego wyświetlacza?

wyswietlacz

portret użytkownika mirley

Witam
Zastosowany wyświetlacz to prawdopodobnie TOF-5462 jednak to nie mówi za wiele :). Opis można znaleźć na stronie AVT, link dostępny tutaj. Wyświetlacz ten można kupić również na allegro ale nie zawsze jest w ofercie.

A może by tak zastosować

A może by tak zastosować LCD1601 (termometr pobierałby mniej prądu!!!) , no i programik byłby krótszy i łatwiejszy, chyba że założenia były takie by pomiar byłby dobrze widoczny z daleka i w nocy wtedy rozumiem,pozdrawiam!!!

Termometr

portret użytkownika mirley

Witam
Zastosowałem taki wyświetlacz ze względu na lepszą czytelność, pobór prądu nie był tak istotny a poza tym wyświetlacz jest tylko włączany w momencie odczytu. Układ ten jest dość stary i program do niego nie jest napisany optymalnie więc dużo zajmuje
Pozdrawiam

pytanie

czy można dać czujnik DS18B20 bo u mnie w sklepie innego nie ma

Można dać ale wymaga to

portret użytkownika mirley

Można dać ale wymaga to drobnej przerobki poniższego fragmentu programu

           Lsb = 1wread():
          Msb = 1wread():
                                            
          If Msb = 0 Then
            Reset Minus
            Tempa = Lsb / 2
          Else
            Set Minus
            Lsb = Not Lsb
            Tempa = Lsb / 2
            Tempa = Tempa + 1
          End If

na coś w stylu:

          Lsb = 1wread():
          Msb = 1wread():
          Minus = Msb.7

          Tempa = Msb * 256
          Tempa = Tempa + Lsb


          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If

          Tempa = Tempa * 10                                  'temperatura *10
          Tempa = Tempa / 16

Więcej informacji w projekcie : Termometr Uniwersalny

mam pytanie jakiego programu

mam pytanie jakiego programu do tworzenia płytek używasz

Płytki rysuję w programie

portret użytkownika mirley

Płytki rysuję w programie Protel 99 SE trial. Jest to bardzo popularny program wśród amatorskich użytkowników. Można go pobrać tutaj

pomiar tem. sredniej

Czy da sie przerobic układ by dodatkowo pokazywał temperature średnia dobową i trend dobowy(dodatni czy ujemny) ???
pozdrawiam

Da się.

Da się.

pomiar sredniej dobowej

czy możesz cos więcej napisać jak to zrobić pozdrawiam

Z ilu pomiarów chcesz

Z ilu pomiarów chcesz ustalić średnią?
O co chcodzi CI z tym trendem dobowym?

pomiar średni temp.

Co do ilości pomiarów temperatury: średnia obliczona co 15 min za okres ostatnich 24h. Wyświtlanie wartości średniej, po wciśnięciu przyciku.
Trend ma wskazywać czy ostatnia wartość wzrosła czy zmalała, w porównaniu do poprzedniej.

Średnia

portret użytkownika mirley

Wiatm

Dziś wieczorem lub jutro zajmę się tym problemem. Nie jest on tak bardzo skomplikowany i sproboje zmieścić się w ramie mikrokontrolera 2051 lub 4051 :). Moze się uda a jak nie to pewnie w wolnej chwili powstanie podobny projekt na ATMEGA8

Średnia

portret użytkownika mirley

Niestety nie da się zrealizować średniej dobowej ze względu na dużą ilość pamięci ram jaka jest do tego potrzebna. Można natomiast zrobić średnią temperaturę liczoną co 15min z średniej poprzedniej i aktualnej temperatury a także trend w stosunku do wartości z przed 15min. Jeżeli kolega jest zainteresowany takim rozwiązaniem to proszę napisać. Jeśli nie to będzie trzeba zrobic taki sam termometr na ATMEGA8 i wtedy ramu powinno starczyć

srednia temp

średnia musi byc dobowa i trend też jeśli możesz to pomoż

Srednia

portret użytkownika mirley

W takim razie wymagane jest zaprojektowanie nowego urządzenia. Zeby policzyć średnią dobową z pomiarów co 15min to potrzebujemy pamiętać 4x24 ostatnie temperatury, wtedy jeśli klikniesz na srednia o godzinie np 8:15 rano średnia będzie liczona z pomiarów 24 godziny wstecz aż do 8:15 dnia wcześniejszego. Trend zostanie policzony jako roźnica między pomiarem o 8:15 a 8:00.

Do całości zastosować bedzie trzeba ATMEGA8 tak jak pisałem wcześniej, wyświetlacz LED 4 znaki i przyciski. Zaprojektuje coś takiego jak znajde trochę czasu bo mam obecnie pracę inżynierską na głowie i czasu trochę brakuje.

Napisz mi na maila do czego dokładnie jest to potrzebne?, jakie zakresy temperatur ma obsługiwać? i czy ma to działać tak jak napisałem wcześniej? Nie pisz więcej w odpowiedziach pod tym artykułem bo sprawa dotyczy już innego urządzenia :)

pomiar tem. sredniej

ok jak moge zobaczyc Twoj adres mail

Kontakt

portret użytkownika mirley

Skorzystaj z formularza kontaktowego, przycisk "Kontakt" na górze strony :)

Średnia

A nie łatwiej jest tak: co 15 minut dodawać do zmiennej temperaturę a w drugą zmienną incrementować co dodanie, wtedy w jednej zmiennej mamy sumę temperatur a w drugiej ilość, po naciśnięciu przycisku zostaje matematyka i wyświetlanie. Word-spokojnie wystarczy jeszcze zapas zostanie (można zwiększyć częstotliwość).
W przpadku gdy wyliczamy średnią np z dwóch temp i zapisujemy w pamięci, następnie (średnia + temp3)/2 to już nie to samo co (temp1+temp2+temp3)/3 dlatego myślę,że pierwszy sposób całkiem dobry. Jak łatwo obliczyć pomiarów potrzeba 96, więc kasowanie co 96 oznacza że doba się skończyła, jeszcze tylko pozostaje wyznaczenie tej doby. Myślę żeby to było tak: po włączeniu termometru trzeba ustawić ile już minęło pomiarów (tzn. jeśli uruchamiam termometer 8.00 to od 0.00 minęło już 32), ustawiając w programie obsługę co 15min mamy dobę z grubsza załatwioną(nie maiło być super dokładnośći do sekund). I co najważniejsze myślę,że w 2051 spokojnie się zmieści to wszystko. Nawet dałoby radę co minutę zczytywać.
Może nie dokładnie to wszystko opisałem. Postaram się coś takiego wykonać na powyższym programie.
Pozdrawiam

Średnia cd

portret użytkownika mirley

Faktycznie masz rację, nie wpadłem na taki prosty pomysł żeby zmieniać dynamicznie dzielnik i chciałem dzielic zawsze przez 96 co znacznie zwiększa wymagany ram. Myśle że nie trzeba implementować godzin a tylko odliczać 96 odcinkow po 15 minut. Wtedy jak włączy sie układ o 8:00 to srednia będzie liczona aż do następnej 8:00.

Odnośnie trendu temperatury to i tak będzie trzeba pamietać przynajmniej dwa wyniki kolejne żeby to policzyć

srednia

w sumie nie ma większego problemu zrobić by przy starcie ustawić ilość czy to pozostałych zliczeń do końca doby czy odwrotnie od początku doby.
Zmniejsza to bardzo zapotrzebowanie na ram i ze zliczaniem co minutę 60x24 =1440 x 100*c=14400 -to już niezła dokłądność, myślę u siebie to zastosować.
Co do trendu to też nie potrzeba w ostateczności nic zapamiętywać, mianowicie porównywać średnią do temp aktualnej(taki ala trend).
Jakby nie zrobił to i tak mniej pamięci potrzeba.

srednia temp

Możecie napisac cos wiecej na ten temat :średniej i trendu. Muszę do połowy grudnia zrobic ten projekt w asemblerze i zbudować działajacy uklad. Kazda podpowiedz jest dla mnie bezcenna. Czy teraz układ przdstawiony na schemacie da rade zrealizować pomiar sredniej i trend???

Myślę,że spokojnie da

Myślę,że spokojnie da radę to zrobić na powyższym. A jak w asm to bez obaw (kod optymalniejszy i pełna władza nad uC i rejestrami). Jak znajdę trochę czasu to postaram się napisać program na moją płytkę, bedziesz musiał pozmieniać, przystosować program do powyższej płytki

srednia temp

to super Wielkie dzieki

srednia temp

Czy możesz napisać wiecej o sredniej temp. Dokladnie jak bedzie to sie zliczac bo jak bedzie caly czas dodawalo jeden pomiar to z czasem sie przepelni Napisz dokładnie jak to ma sie odbywać

Srednia

portret użytkownika mirley

zgodnie z tym co kolega napisał, należy wykonać następujące operacje co 15min:

incr Licznik
if licznik = 97 then 
  licznik = 1
  X = 0
end if

X = X + Temperatura_aktualna
T_sr = X / licznik

Taka jest implementacja tego co było powiedziane o średniej ale pamiętaj jeżeli włączysz urządzenie o godzinie 8:00 rano i klikniesz oblicz średnią ok 8:30 to zostanie ona policzona tylko z dwoch temperatur. Jesli klikniesz srednia o godzinie 7:45 to zostanie ona policzona z 96 pomiarow a o 8:00 srednia bedzie rowna tylko jednemu pomiarowi bo licznik sie ustawi na 1

Powered by Drupal - Design by artinet