Termometr Domowy


9
Ocena: None Średnia: 9 (3 głosujących)

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łącznikWielkość
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



Portret użytkownika sphinxB

wyswietlacz

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

Portret użytkownika mirley

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.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

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!!!

Portret użytkownika mirley

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

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

pytanie

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

Portret użytkownika mirley

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 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

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika piotr 171

mam pytanie jakiego programu

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

Portret użytkownika mirley

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

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika slawek

pomiar tem. sredniej

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

Portret użytkownika gosc

Da się.

Da się.

Portret użytkownika slawek

pomiar sredniej dobowej

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

Portret użytkownika gosc

Z ilu pomiarów chcesz

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

Portret użytkownika slawek

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.

Portret użytkownika mirley

Ś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

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mirley

Ś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ć

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika slawek

srednia temp

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

Portret użytkownika mirley

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 :)

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika slawek

pomiar tem. sredniej

ok jak moge zobaczyc Twoj adres mail

Portret użytkownika mirley

Kontakt

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

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc PK

Ś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

Portret użytkownika mirley

Ś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ć

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc PK

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.

Portret użytkownika slawek

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???

Portret użytkownika gosc PK

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

Portret użytkownika slawek

srednia temp

to super Wielkie dzieki

Portret użytkownika slawek

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ć

Portret użytkownika mirley

Srednia

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

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Jakie temperatury mierzy ten

Jakie temperatury mierzy ten termometr?

Portret użytkownika mirley

Re: Termometr

Z tego co pamietam to termometr mierzy od -50 do +99 stopni w tej wersji oprogramowania. Ograniczenia czujnika to od -50 do około +120 stopni

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Robert Bar

Proszę o pomoc

Witam

Kupiłem czujniki 18B20 .Chciałem zrobić przeróbkę ale znów napotkałem przeszkodę.Związku z tym mam prośbę o bardziej precyzyjną podpowiedź przy zmianie cząstki kodu ponieważ stosując się do powyższej instrukcji coś mi nie wychodzi ,wyświetla mi er.C .

Z góry dziękuje

Robert

Portret użytkownika mirley

Re: Wymiana Czujnika

Zamien fragment:

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

na:

          Minus = Msb.7
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa / 16

Powinno działać. W razie problemów pisz co się dzieje

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Robert Bar

TERMOMETR ZMIANA

Obecnie wyświetla 5 *C I NIE REAGUJ NA ZMIANY
Może to ja popełniam gdzieś błąd przy przyklejaniu kodu

Portret użytkownika mirley

Re: Termometr

Obecnie nie dam rady się tym bardziej zająć, to co napisałem to było tak na sucho, bez kompilacji. Spróbój dopasować program od Termometru Uniwersalnego do tego projektu. Przeanalizuj dwa programy a sam do tego dojdziesz. Jak znajdę trochę czasu w Sobotę to jakoś to sprawdzę czemu nie działa

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Kamil

Jest gdzieś na płytce złącze

Jest gdzieś na płytce złącze programowania??

-

Są ludzie i parapety, ale żeby klamką się urodzić to jest sztuka.

Portret użytkownika mirley

Re: Termometr

Nie ma na płytce złącza programującego bo ten procesor programuje się równolegle wkładając do specjalnego programatora. Popatrz na "termometr uniwersalny" tam jest wersja na ATTiny2313 który możesz zaprogramować szeregowo :)(za pomocą kabelka albo programatora ISP)

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Kamil

A mogę użyć tego samego

A mogę użyć tego samego programu, dla ATtiny, co jest w "termometrze uniwersalnym" i wrzucic go do ATtiny w tym projekcie???

-

Są ludzie i parapety, ale żeby klamką się urodzić to jest sztuka.

Portret użytkownika mirley

Re: Termometr

Raczej tak, myślę że nie powinno być problemów. Tylko znak stopnia celsjusza nie będzie sie palił . A zworka GP nie będzie teraz zworką a wyjściem diody "-"

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jakimov

ds18b20

Witam serdecznie wszystkich,

Mam problem z tym projektem. Termometr wskazuje niepoprawną temperaturę.
Obecnie wskazania temperatury pokojowej zaczynają się od kilku, kilkunastu stopni (za każdym uruchomieniem układu właściwie inaczej się ustawia) potem temperatura powoli idze w górę o kilka stopni.

Problem na pewno leży po stronie programu i procesora, poniewaz próbowałem po złożeniu
również zaprogramować procka z poprzedniego projektu Mirleya (chodzi o Termometr Uniwersalny) -
wskazuje temperaturę poprawnie. Mam czujnik DS18B20.

Próbowałem wielokrotnie z różnymi zmianami programować procesor 4051 i 2051,
bez efektów poprawnego działania. Ja już nie mam sił do niego, proszę o pomoc.

Niżej podaję obecny listing programu:

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 Temp As Single
Dim Tempa As Integer
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():
          Minus = Msb.7
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
          If Msb.7 = 1 Then
          Tempa = Not Tempa
          Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                  'temperatura *10
          Tempa = Tempa / 16
          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
'*******************************************************************************

Portret użytkownika mirley

Re: Program

Co dokładnie pozmieniałeś w programie?, Zmodyfikuj program dla Termometru uniwersalnego i dostosuj go do tego schematu i wyświetlacza, tak będzie prościej

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jakimov

Programu ciąg dalszy

Mirley, bardzo proszę jeszcze raz o pomoc.

Przerobiłem kod, wszystko chodzi oprócz jednej rzeczy. W wyświetlaniu brakuje dziesiątych części temperatury. Jak to jest realizowane poprawnie gdzie indziej nie mogę dojść :(.
Wiem, że tak mogłoby już zostać, ale mam wyświetlacz 4 segmentowy, tak głupio jakoś pozostawić jedną pozycję pustą. Pozatym jeśli cyfrowy, to powinien być bardziej dokładny, a nie jest w tym wypadku (dokładność co do stopnia).

Poniżej listing dotychczasowego programu:

'****************************
           'Konfiguracja
'****************************
$crystal = 12000000                                           '12MHz
$regfile = "89C4051.DAT"
 
Config 1wire = P3.5
 
Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Przerwanie0
Load Timer0 , 250
Enable Timer0
Start Timer0
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte , Wysw1000 As Byte
Dim Tempa As Word
Dim Mux As Byte
Dim Autooff As Word
Dim Zezw_wysw As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
Dim Przycisk As Byte
Dim Pokaz As Bit
Dim Przyc As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
Wysw1000 = 191
'*******************************************************************************
                                  'wartosci
'*******************************************************************************
Reset Pomiar_odczyt
Set Pokaz
Autooff = 1500
'****************************
      'Petla glowna
'****************************
'*******************************************************************************
                                  '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 timer0
'****************************
Przerwanie0:
Incr Co4ms
 If Co4ms = 16 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     'ew flaga obslugi przyciskow
     Incr Co1s
     If Co1s = 7 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():
 
          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
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                       'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 10000 Then
   Wysw1 = Wysw Mod 10
 
   Wysw = Wysw / 10
   Wysw10 = Wysw Mod 10
 
   Wysw = Wysw / 10
   Wysw100 = Wysw Mod 10
 
   Wysw = Wysw / 10
   Wysw1000 = Wysw Mod 10
 
 
   If Wysw100 = 0 Then Wysw100 = 10                           'wygaszenie zera wiodcego
 
   Wysw1 = Lookup(wysw1 , Tabela2)
   Wysw10 = Lookup(wysw10 , Tabela)
   Wysw100 = Lookup(wysw100 , Tabela)
   Wysw1000 = Lookup(wysw1000 , Tabela)
 
 Else
   Wysw1 = 175                                                'r
   Wysw10 = 175                                               'r
   Wysw100 = 134                                              'E
 End If
 
Return
 
Wyswietl:
  Incr Mux
  If Mux = 3 Then Mux = 0
  P3.7 = Not Minus
 
  Select Case Mux
    Case 0:
     Set P3.0
      P1 = Wysw100
     Reset P3.2
 
    Case 1:
     Set P3.2
      P1 = Wysw10
     Reset P3.1
 
    Case 2:
     Set P3.1
'     P1 = Wysw1
     P1 = 70
     Reset P3.0
 
    Case 3:
     Set P3.3
     P1 = Wysw1000
     Reset P3.3
 
  End Select
Return
 
                         'Tabele do wyswietlania na wyswietlaczu
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty

Portret użytkownika mirley

Re: Termometr

Zmień ten fragment:

Wyswietl:
  Incr Mux
  If Mux = 3 Then Mux = 0
  P3.7 = Not Minus
 
  Select Case Mux
    Case 0:
     Set P3.3
      P1 = Wysw1000
     Reset P3.0
 
    Case 1:
     Set P3.0
      P1 = Wysw100
     Reset P3.1
 
    Case 2:
     Set P3.1
     P1 = Wysw10
     P1 = 70
     Reset P3.2
 
    Case 3:
     Set P3.2
     P1 = Wysw1
     Reset P3.3
 
  End Select
Return

No i jeszcze tutaj:

   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
   Wysw1000 = Lookup(wysw1000 , Tabela)

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Kliciok

Termometr Domowy

Witam bardzo proszę o pomoc, potrzebuje ten kod ale w pliku .bin lub .hex i pod czujnik DS18b20 bo ja nie potrafie tego przerobić z txt z góry dziękuje i pozdrawiam Artek.

Portret użytkownika jakimov

Termometr Domowy

Ponieważ nie można dodać załącznika, napisz do mnie na priv, prześlę.

jakimov7@o2.pl

Portret użytkownika mirley

Re: Termometr

Polecam wykonanie projektu termometr uniwersalny.... on ma czujnik Ds18B20.
.....

proszę wysłac do mnie ten kod źródłowy... umieszczę go w załączniku aby inni też mogli skorzysać

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika klucha93

Conajmniej dwa wyświetlacze?

Czy dało by się tak zrobić (nie mówię akurat o tym projekcie) Zeby były conajmniej dwa wyświetlacze i wskazywały temperaturę na zewnątrz i wewnątrz pomieszczenia? Np.Wyświetlacz LED na RS-232. Chodzi mi tylko o termometr.

Portret użytkownika mirley

Re: Termometr

Na wyświetlaczu na Rs232 będzie to najprostsze ale potrzebny jest układ który zmierzy temperaturę i wyśle rs232 do wyświetlacza... mam takie coś w planach ale nie wiem kiedy realizacja bo z czasem krucho

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika esc

Przeróbka projektu

Witaj, myślałeś może żeby przerobić projekt na Atmege i pomiar w domu i na zewnątrz, nie ukrywam że bardzo by mi się coś takiego przydało szukałem w necie ale jakoś nic mi sie nie rzuciło w oczy.
Pozdrawiam

Portret użytkownika klucha93

Mam takie pytanko trochę

Mam takie pytanko trochę odbiegające od tego tematu. Możesz mi powiedzieć w jakim programie robisz wszystkie schematy i ścieżki, które przenosisz na płytkę? W Eaglu?

Portret użytkownika mirley

Re: Termometr

Przerabiać projektu nie mam czasu bo za dużo mam teraz innej roboty... trzeba by zrobić całkowicie nowy projekt

Odnośnie robienia płytek i schematów to trialówka protela 99SE powinna być gdzieś dostępna w internecie

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jakimov

Temperatura ujemna

Otóż mam prośbę, ktorą nie bardzo wiem jak ugryźć. Chciałbym, aby pokazywał się na wyświetlaczu znak minusa przy temperaturach ujemnych. Mirley czy mógłbym prosić o pomoc?.
Poniżej wklejam listing przerobionego termometru dla DS18B20. Działa wszystko, tylko nie pokazuje dziesiątek. Jest dzięki temu miejsce na brakujący, wspomniany wcześniej znak.

'****************************
           'Konfiguracja
'****************************
$crystal = 12000000                                           '12MHz
$regfile = "89C4051.DAT"
 
Config 1wire = P3.5
 
Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Przerwanie0
Load Timer0 , 250
Enable Timer0
Start Timer0
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte , Wysw1000 As Byte
Dim Tempa As Word
Dim Mux As Byte
Dim Autooff As Word
Dim Zezw_wysw As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
Dim Przycisk As Byte
Dim Pokaz As Bit
Dim Przyc As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
Wysw1000 = 191
'*******************************************************************************
                                  'wartosci
'*******************************************************************************
Reset Pomiar_odczyt
Set Pokaz
Autooff = 1500
'****************************
      'Petla glowna
'****************************
'*******************************************************************************
                                  '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 timer0
'****************************
Przerwanie0:
Incr Co4ms
 If Co4ms = 16 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     'ew flaga obslugi przyciskow
     Incr Co1s
     If Co1s = 7 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():
 
          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
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                       'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 10000 Then
   Wysw1 = Wysw Mod 10
 
   Wysw = Wysw / 10
   Wysw10 = Wysw Mod 10
 
   Wysw = Wysw / 10
   Wysw100 = Wysw Mod 10
 
   Wysw = Wysw / 10
   Wysw1000 = Wysw Mod 10
 
 
   If Wysw100 = 0 Then Wysw100 = 10                           'wygaszenie zera wiodcego
 
   Wysw1 = Lookup(wysw1 , Tabela2)
   Wysw10 = Lookup(wysw10 , Tabela)
   Wysw100 = Lookup(wysw100 , Tabela)
   Wysw1000 = Lookup(wysw1000 , Tabela)
 
 Else
   Wysw1 = 175                                                'r
   Wysw10 = 175                                               'r
   Wysw100 = 134                                              'E
 End If
 
Return
 
Wyswietl:
  Incr Mux
  If Mux = 3 Then Mux = 0
  P3.7 = Not Minus
 
  Select Case Mux
    Case 0:
     Set P3.0
      P1 = Wysw100
     Reset P3.2
 
    Case 1:
     Set P3.2
      P1 = Wysw10
     Reset P3.1
 
    Case 2:
     Set P3.1
'     P1 = Wysw1
     P1 = 70
     Reset P3.0
 
    Case 3:
     Set P3.3
     P1 = Wysw1000
     Reset P3.3
 
  End Select
Return
 
                         'Tabele do wyswietlania na wyswietlaczu
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty

Jeśli chodzi o problem poruszony wcześniej przez Klucha93, to wystaczy zrobić np. dwa takie termometry zasilane z jednego źródła zasilania i już mamy temperaturę z dwóch miejsc.