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łącznik | Rozmiar |
|---|---|
| Schemat | 82.26 KB |
| Płytka | 13.95 KB |
| Płytka (odbicie lustrzane) | 13.94 KB |
| Płytka (3 na stronie) | 37.22 KB |
| Montowanie | 19.15 KB |
| Kod źródłowy | 5.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
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
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
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 Ifna 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 / 16Wię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
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
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
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
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
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
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
zgodnie z tym co kolega napisał, należy wykonać następujące operacje co 15min:
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