Regulamin | Punkty | Dodaj... | Ostatnie | Szukaj | Rejestracja | Zaloguj


4x DS18b20 +LCD = Termometr


Napisz nowy temat  Odpowiedz do tematu      Strona Główna -> Forum elektroda -> DIY Konstrukcje -> 4x DS18b20 +LCD = Termometr
Angielska wersja
Autor Wiadomość
Marek_RADOM
Poziom 17
Poziom 17

Dołączył: 07 Lip 2004
Posty: 380
Miasto: Radom

Post 23 Mar 2008 13:10   

Re: 4x DS18b20 +LCD = Termometr


peleton123 napisał:
Zmontowałem układ by duch wg schematu. tylko na LCD 4x16. Niestety wyświetla mi tylko prostokąty w 1 i 3 linijce. Pewnie trzeba zmienić w programie config lcdpin ale ja nie mam pojęcia jak. Ma ktoś ten układ na takim wyświetlaczy 4x16??

Mój wyświetlacz to http://www.artronic.pl/o_produkcie.php?id=629?

Proszę o pomoc


Witam Przerobiłem kod dla wyświetlacza 4x16 w symulacji wszystko wygląda OK. Co do wyświetlanych samych kwadratów to wydaje mi się że gdzieś ktoś w tym temacie pisał, że przy 4 liniowych dodatkowo trzeba któryś pin podłączyć i w programie to dodać, ale nie jestem pewien, bo nigdy nie używałem wyświetlacza 4 liniowego.

Kod:

'Termometr 4 punktowy DS18b20 by Duch na podstawie materiałów znalezionych w sieci
'Kontakt duszkowski(małpa)o2.pl


$regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
$crystal = 1000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
'Deklaracja portów od wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

Config Lcd = 16 * 4                                         'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x20, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)

'*************************************WAŻNE**********************************************
'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
Config 1wire = Portd.5                                      'deklaracja portu na którym będą podpięte DS18b20

Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
Dim I3 As Integer
Dim I4 As Integer

Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Dsid3(8) As Byte
Dim Dsid4(8) As Byte
Dim B As Byte                                               'deklaracja zmiennej do odczytu kodów ID
Dim W As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników

Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza

Cursor Off                                                  'Wyłącza kursor
Cls                                                         'Funkcja CLS czyści ekran
Lcd "   Termometr    " ;                                    'ekran startowy (pojawia się tylko podczas włączania urządzenia)
Thirdline
Lcd "  by Duch 2007  "
Wait 5
Cls
W = 1wirecount()
Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Waitms 500
Lowerline
Lcd W
Wait 3
                                                            'Znajdź pierwszy czujnik podpięty do portu
Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
Dsid3(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
Dsid4(1) = 1wsearchnext()

'*******************Odczyt numerów ID czujników temperatury*********************

If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 3 , 1
 Lcd "Czujnik 1 ID OK"
 Wait 1
 Locate 3 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
End If
Wait 2

If Dsid2(8) = Crc8(dsid2(1) , 7) Then
 Locate 4 , 1
 Lcd "Czujnik 2 ID OK"
 Wait 1
 Locate 4 , 1
 For B = 1 To 8
 Lcd Hex(dsid2(b))
 Next
End If
Wait 2

Cls
Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Lowerline
Lcd W

If Dsid3(8) = Crc8(dsid3(1) , 7) Then
 Locate 3 , 1
 Lcd "Czujnik 3 ID OK"
 Wait 1
 Locate 3 , 1
 For B = 1 To 8
 Lcd Hex(dsid3(b))
 Next
End If
Wait 2

If Dsid4(8) = Crc8(dsid4(1) , 7) Then
 Locate 4 , 1
 Lcd "Czujnik 4 ID OK"
 Wait 1
 Locate 4 , 1
 For B = 1 To 8
 Lcd Hex(dsid4(b))
 Next
End If
Wait 2
Cls

'*******************koniec odczytu ID czujników temperatury*********************

Do
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
   1wwrite &HBE
   I1 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
   1wwrite &HBE
   I2 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid3(1)                                        'wysylam adres trzeciego czujnika
   1wwrite &HBE
   I3 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid4(1)                                        'wysylam adres czwartego czujnika
   1wwrite &HBE
   I4 = 1wread(2)
'--------konwersja temp dla wszystkich dsow
   1wreset
   1wwrite &HCC
   1wwrite &H44
Wait 1

'****Jeśli pracujesz z wyświetlaczem innym niż 2x20 to tutaj trzeba wprowadzić zmiany w LOCATE********

   I1 = I1 * 10
   I1 = I1 / 16
   'If I1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 1                                             'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
   Lcd "Czujnik 1" ; Ss ; Chr(0) ;

   I2 = I2 * 10
   I2 = I2 / 16
   'If I2 > 0 Then Cls
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 2 , 1
   Lcd "Czujnik 2" ; Ss ; Chr(0) ;

   I3 = I3 * 10
   I3 = I3 / 16
   'If I3 > 0 Then Cls
   Ss = Str(i3)
   Ss = Format(ss , " 0.0")
   Locate 3 , 1
   Lcd "Czujnik 3" ; Ss ; Chr(0) ;

   I4 = I4 * 10
   I4 = I4 / 16
   'If I4 > 0 Then Cls
   Ss = Str(i4)
   Ss = Format(ss , " 0.0")
   Locate 4 , 1
   Lcd "Czujnik 4" ; Ss ; Chr(0) ;

Loop

'Koniec programu
'Pozdrawiam Duch

Powrót do góry
   
peleton123
Poziom 10
Poziom 10

Dołączył: 22 Mar 2008
Posty: 51
Miasto: Mińsk Maz.

Post 24 Mar 2008 15:52   

Re: 4x DS18b20 +LCD = Termometr


Mam swój program bardzo podobny i też właśnie na symulatorze dobrze pokazuje.

A mógłby ktoś powiedzieć jaki dodatkowy pin trzeba podłączyć??

.:EDIT:.

Już wszystko ładnie działa. Pokazuje wszystkie 4 linie

Zmodyfikowałem program DUCHa. Został on przerobiony do LCD 4 liniowego oraz dodana obsługa temp. ujemnych

4x DS18b20 +LCD = Termometr4x DS18b20 +LCD = Termometr4x DS18b20 +LCD = Termometr4x DS18b20 +LCD = Termometr4x DS18b20 +LCD = Termometr4x DS18b20 +LCD = Termometr
4x DS18b20 +LCD = Termometr4x DS18b20 +LCD = Termometr4x DS18b20 +LCD = Termometr4x DS18b20 +LCD = Termometr4x DS18b20 +LCD = Termometr


Jak widac poniżej również z temp. ujemnymi dobrze sobie radzi.
4x DS18b20 +LCD = Termometr4x DS18b20 +LCD = Termometr

W załączniku plik z programem napisany pod BASCOMa pasuje do wyświetlaczy 4x16 i 4x20 oraz schemat ideowo montażowy.




termometr.rar
 Opis:
 n/a

Download
 :  termometr.rar
 Zawartość:  schemat.JPG , 4x DS18b20, LCD.bas
Zobacz całość...
 Rozmiar:  29.05 KB
 Punkty:  1 = 0.00 za transfer + 1 dla użytkownika (ustawiono ręcznie)

Powrót do góry
   
zgf1
Poziom 15
Poziom 15

Dołączył: 09 Lis 2004
Posty: 205
Miasto: Zywiec

Post 26 Mar 2008 12:34   

Re: 4x DS18b20 +LCD = Termometr


hmm a jak zrobic to programowo aby kazdy DS byl podpiety do innego portu?

Tu wszystkie sa podpiete pod jedno wejscie, co nie jest idealne, przy awarii kabla bacz czujnika wskazania temp sa dublowane. Przyklad podlacz tylko jeden czujnik i uzyskasz temp 4x ta sama...
Powrót do góry
   
Google
AdSense
Google Adsense


Post 26 Mar 2008 12:34   





Powrót do góry
   
grzegorz.d3
Poziom 9
Poziom 9

Dołączył: 05 Sty 2007
Posty: 36

Post 26 Mar 2008 21:05   

Re: 4x DS18b20 +LCD = Termometr


Witam a moze ktoś by dołożył do tego termometra woltomierz w zakresie od5-15.
I udostępnił wsad i schemat.
Pozdrawiam.
:D
Powrót do góry
   
zgf1
Poziom 15
Poziom 15

Dołączył: 09 Lis 2004
Posty: 205
Miasto: Zywiec

Post 27 Mar 2008 00:26   

Re: 4x DS18b20 +LCD = Termometr


Mam taki uklad zrobiony, w sumie kod moge przerobic... jakiej dokladnosci w pelnym zakresie oczekujesz?
Nie licz, ze to bedzie tak dokladne jak miernik...
Powrót do góry
   
grzegorz.d3
Poziom 9
Poziom 9

Dołączył: 05 Sty 2007
Posty: 36

Post 27 Mar 2008 00:40   

Re: 4x DS18b20 +LCD = Termometr


No nie wiem jak najlepszej , w granicach od 5-15V
Powrót do góry
   
zgf1
Poziom 15
Poziom 15

Dołączył: 09 Lis 2004
Posty: 205
Miasto: Zywiec

Post 27 Mar 2008 00:50   

Re: 4x DS18b20 +LCD = Termometr


problem w tym, ze jak wyskaluje sie przy +5V, ze wskazuje niemal jak miernik, to przy +12 moze roznic sie o okolo 0.1V ;)
Powrót do góry
   
grzegorz.d3
Poziom 9
Poziom 9

Dołączył: 05 Sty 2007
Posty: 36

Post 27 Mar 2008 00:59   

Re: 4x DS18b20 +LCD = Termometr


Ok
Podasz schemat i wsad do procka.
Powrót do góry
   
Google
AdSense
Google Adsense


Post 27 Mar 2008 00:59   





Powrót do góry
   
gregbo
Poziom 6
Poziom 6

Dołączył: 23 Kwi 2006
Posty: 16

Post 27 Mar 2008 16:04   

Re: 4x DS18b20 +LCD = Termometr


AccessDenied napisał:
Witam, to i ja dodam sowje trzy grosze odnośnie formatowania wyświetlania temperatury ujemnej. Metoda sprawdzona w zakresie -40 do +99, brak przesunięć cyferek, wersja dla wyświetlacza 2x16 i 4 ds18b20 (2 wewnętrzne i 2 zewnętrzne)
[


a ja mam do Ciebie Robercie pytanie jak ustawiłeś u siebie fuse bity?? bo dla mnie to czarna magia i żadna książka nie pomaga... schemat mam dokładnie taki jak na pierwszej stronie. programuje w avrdude.
Powrót do góry
   
peleton123
Poziom 10
Poziom 10

Dołączył: 22 Mar 2008
Posty: 51
Miasto: Mińsk Maz.

Post 27 Mar 2008 19:54   

Re: 4x DS18b20 +LCD = Termometr


Zacytuje uzytkownika tego forum z innego tematu.
ariel440 napisał:
Witam.
Dla wszystkich którzy być może kiedyś będą mieli podobne zmagania z avrdude napiszę jak powinno to wyglądać :

dla ustawienia atmega8 do pracy na wewn. 1MHz :
avrdude -p m8 -c usbasp -U flash:w:PROGRAM.HEX:i -U hfuse:w:0xD9:m -U lfuse:w:0xe1:m

dla ustawienia atmega8 do pracy na wewn. 2MHz :
avrdude -p m8 -c usbasp -U flash:w:PROGRAM.HEX:i -U hfuse:w:0xD9:m -U lfuse:w:0xe2:m

dla ustawienia atmega8 do pracy na wewn. 4MHz :
avrdude -p m8 -c usbasp -U flash:w:PROGRAM.HEX:i -U hfuse:w:0xD9:m -U lfuse:w:0xe3:m

dla ustawienia atmega8 do pracy na wewn. 8MHz :
avrdude -p m8 -c usbasp -U flash:w:PROGRAM.HEX:i -U hfuse:w:0xD9:m -U lfuse:w:0xe4:m

dla ustawienia atmega8 do pracy na zewn. 8MHz :
avrdude -p m8 -c usbasp -U flash:w:PROGRAM.HEX:i -U hfuse:w:0xD9:m -U lfuse:w:0xee:m

Pozdrawiam.


Także dla tego układu by DUCH jest to wew 1MHz.
Ja się tym posłużyłem hfuse 0xD9 lfuse 0xe1 i mi działa
Powrót do góry
   
gregbo
Poziom 6
Poziom 6

Dołączył: 23 Kwi 2006
Posty: 16

Post 28 Mar 2008 00:55   

Re: 4x DS18b20 +LCD = Termometr


dziękuję Ci bardzo!!!! jutro ustawię wszystkie bity i napiszę czy działa.
Powrót do góry
   
gregbo
Poziom 6
Poziom 6

Dołączył: 23 Kwi 2006
Posty: 16

Post 28 Mar 2008 11:15   

Re: 4x DS18b20 +LCD = Termometr


wszystko działa idealnie dzięki wielkie!!!! a jak ustawi fuse bity na zegar zewnętrzny 12mhz tak jak do programatora usbasp??
Powrót do góry
   
jacekhe
Poziom 15
Poziom 15

Dołączył: 06 Maj 2007
Posty: 240
Miasto: Janów Lubelski

Post 28 Mar 2008 11:25   

Re: 4x DS18b20 +LCD = Termometr


Jak przerobić program Duch__-a żeby mi pokazywał np czy ujemna temp, ze strzałkami czy rośnie czy maleje na wyświetlacz 2*16 znaki?
Powrót do góry
   
peleton123
Poziom 10
Poziom 10

Dołączył: 22 Mar 2008
Posty: 51
Miasto: Mińsk Maz.

Post 28 Mar 2008 14:05   

Re: 4x DS18b20 +LCD = Termometr


Dajesz dodatkowe zmienne typu integer np I11. I dajesz sprawdzenie przez if czy jest większa a po sprawdzeniu przepisujesz z I1 wartość do I11. i w IF powinieneś wypisywać temp z jakimś tam znakiem Deflcdchar(strzałki narysowanej)
Powrót do góry
   
jacekhe
Poziom 15
Poziom 15

Dołączył: 06 Maj 2007
Posty: 240
Miasto: Janów Lubelski

Post 28 Mar 2008 15:25   

Re: 4x DS18b20 +LCD = Termometr


Acha, nie bardzo rozumiem o co chodzi :cry: jak mam kod tak zrobiony

Kod:
'Termometr 4 punktowy DS18b20

$regfile = "m8def.DAT"                                     
$crystal = 1000000                                         
'Deklaracja portów od wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

Config Lcd = 16 * 2                                       

'*************************************WAŻNE**********************************************

Config 1wire = Portd.5                                     

Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
Dim I3 As Integer
Dim I4 As Integer

Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Dsid3(8) As Byte
Dim Dsid4(8) As Byte
Dim B As Byte                                             
Dim W As Byte                                               

Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             

Cursor Off                                                 
Cls                                                         
Lcd "Lada Samara 1.3s" ;                               
Lowerline
Lcd "        2008        "
Wait 5
Cls
W = 1wirecount()
Lcd "Ilosc czujnikow:"                                     
Waitms 500
Lcd W
Wait 3
Cls                                                       
Dsid1(1) = 1wsearchfirst()                                 
Dsid2(1) = 1wsearchnext()                                   
Dsid3(1) = 1wsearchnext()                                   
Dsid4(1) = 1wsearchnext()

'*******************Odczyt numerów ID czujników temperatury*********************

If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       
 Locate 1 , 1
 Lcd "CRC OK Czujnik 1 ID"
 Wait 1
 Locate 1 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
End If
Wait 2

If Dsid2(8) = Crc8(dsid2(1) , 7) Then
 Locate 2 , 1
 Lcd "CRC OK Czujnik 2 ID"
 Wait 1
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(dsid2(b))
 Next
End If
Wait 2

If Dsid3(8) = Crc8(dsid3(1) , 7) Then
 Locate 1 , 1
 Lcd "CRC OK Czujnik 3 ID"
 Wait 1
 Locate 1 , 1
 For B = 1 To 8
 Lcd Hex(dsid3(b))
 Next
End If
Wait 2

If Dsid4(8) = Crc8(dsid4(1) , 7) Then
 Locate 2 , 1
 Lcd "CRC OK Czujnik 4 ID"
 Wait 1
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(dsid4(b))
 Next
End If
Wait 2
Cls

'*******************koniec odczytu ID czujników temperatury*********************

Do
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)                                       
   1wwrite &HBE
   I1 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)                                       
   1wwrite &HBE
   I2 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid3(1)                                       
   1wwrite &HBE
   I3 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid4(1)                                       
   1wwrite &HBE
   I4 = 1wread(2)
'--------konwersja temp dla wszystkich dsow
   1wreset
   1wwrite &HCC
   1wwrite &H44
Wait 1



   I1 = I1 * 10
   I1 = I1 / 16
   'If I1 > 0 Then Cls                                       
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 1                                             
   Lcd "Wew" ; Ss ; Chr(0) ;

   I2 = I2 * 10
   I2 = I2 / 16
   'If I2 > 0 Then Cls
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 2 , 1
   Lcd "Zew" ; Ss ; Chr(0) ;

   I3 = I3 * 10
   I3 = I3 / 16
   'If I3 > 0 Then Cls
   Ss = Str(i3)
   Ss = Format(ss , " 0.0")
   Locate 1 , 11
   Lcd "Chlo" ; Ss ; Chr(0) ;

   I4 = I4 * 10
   I4 = I4 / 16
   'If I4 > 0 Then Cls
   Ss = Str(i4)
   Ss = Format(ss , " 0.0")
   Locate 2 , 11
   Lcd "Gaz" ; Ss ; Chr(0) ;

Loop


Jak możesz, bardzo bym był wdzięczny za poprawianie mojego kodu. Bardzo proszę. Dziękuję.
Powrót do góry
   
Marek_RADOM
Poziom 17
Poziom 17

Dołączył: 07 Lip 2004
Posty: 380
Miasto: Radom

Post 28 Mar 2008 17:58   

Re: 4x DS18b20 +LCD = Termometr


Witam ponownie, jakiś czas temu przerobiłem sobie ten projekt i zrobiłem Zegar z budzikiem z termometrem 2xDS18b20 i dziś dopiero przetestowałem na długim kablu i zaczęły się problemy.

Podłączyłem jeden czujnik pod kabel puszczony pod ziemią, który ma być do domofonu w przyszłości. Ten kabel jest miedziany jak skrętka, ale przewody chyba nie są skręcone. Długość to ok. 30 metrów. Wyświetla mi cały czas 85°C, dodam że ID odczytuje poprawnie. Jak temu zaradzić ?

Aha czujnik podłączony 2 przewodami tak jak jest w projekcie i podciągnięte do + przez 4,7kΩ.
Powrót do góry
   
asembler
Poziom 21
Poziom 21

Dołączył: 16 Wrz 2007
Posty: 1140

Post 29 Mar 2008 16:14   

Re: 4x DS18b20 +LCD = Termometr


Daj szeregowo opornik około 47 Ohm na kazdy czujnik osobno
Powrót do góry
   
Marek_RADOM
Poziom 17
Poziom 17

Dołączył: 07 Lip 2004
Posty: 380
Miasto: Radom

Post 29 Mar 2008 16:44   

Re: 4x DS18b20 +LCD = Termometr


Kurde właśnie odkopałem kabel i odłączyłem czujnik. Podłączyłem go jednak skrętką sieciową w domu na poddaszu wyjąłem na zewnątrz, w tym momencie nie korzystam z sieci ale nawet jak będę korzystał to w niczym nie będzie przeszkadzać to, że 1Wire leci jedną parą przewodów. Wszystko działa ok na długości ok 20 metrów. w przyszłości wypróbuje ten pomysł z opornikiem 47Ω.
Powrót do góry
   
peleton123
Poziom 10
Poziom 10

Dołączył: 22 Mar 2008
Posty: 51
Miasto: Mińsk Maz.

Post 30 Mar 2008 18:29   

Re: 4x DS18b20 +LCD = Termometr


jacekhe napisał:
Acha, nie bardzo rozumiem o co chodzi :cry: jak mam kod tak zrobiony
Jak możesz, bardzo bym był wdzięczny za poprawianie mojego kodu. Bardzo proszę. Dziękuję.


Znalazłem chwile czasu i przerobiłem kod, ale zmieniłem na wyświetlacz 2x20znaków bo 16 znaków to za mało by móc wyświetlać minus(temp. ujemna) i jeszcze strzałki.
Jeszcze musiałem wyrzucić kod początkowy, pokazywanie ekranu startowego czyli powitanie oraz liczbę i adresy czujników, ponieważ wersja demo BASCOMa ma max 4kb kodu wyjściowego. Bo zapewne masz wersje DEMO, ale w załączniku dałem skompilowany kod wraz z ekranem powitalnym, sprawdzaniem czujników, itp. bo ja mam pełnego bascoma.

Kod kompiluje sie i działa 100% sprawdzałem na swoim układzie. Poniżej kod skrócony do 4kB
Kod:
'Termometr 4 punktowy DS18b20
$regfile = "m8def.DAT"
$crystal = 1000000
'Deklaracja portów od wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

Config Lcd = 20 * 2

'*************************************WAŻNE**********************************************
Config 1wire = Portd.5

Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
Dim I3 As Integer
Dim I4 As Integer
Dim I11 As Integer                                          ' przechowuje poprzednią wartoś temp
Dim I22 As Integer                                          ' przechowuje poprzednią wartoś temp
Dim I33 As Integer                                          ' przechowuje poprzednią wartoś temp
Dim I44 As Integer                                          ' przechowuje poprzednią wartoś temp

Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Dsid3(8) As Byte
Dim Dsid4(8) As Byte
Dim B As Byte
Dim W As Byte

Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             ' znak stopni
Deflcdchar 1 , 4 , 14 , 21 , 4 , 4 , 4 , 4 , 32             ' strzałka góra
Deflcdchar 2 , 32 , 4 , 4 , 4 , 4 , 21 , 14 , 4             ' strzałka dół

Cursor Off
I11 = 0
I22 = 0
I33 = 0
I44 = 0

Cls
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
Dsid3(1) = 1wsearchnext()
Dsid4(1) = 1wsearchnext()



'*******************koniec odczytu ID czujników temperatury*********************

Do
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)
   1wwrite &HBE
   I1 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)
   1wwrite &HBE
   I2 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid3(1)
   1wwrite &HBE
   I3 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid4(1)
   1wwrite &HBE
   I4 = 1wread(2)
'--------konwersja temp dla wszystkich dsow
   1wreset
   1wwrite &HCC
   1wwrite &H44
Waitms 500


   I1 = I1 * 10
   I1 = I1 / 16
   If I1 >= I11 Then
   I11 = I1
   If I1 > 0 Then
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 1
   Lcd "Wew" ; Chr(1) ; " " ; Ss ; Chr(0) ;
   Else
   Ss = Str(i1)
   Ss = Format(ss , "0.0")
   Locate 1 , 1
   Lcd "Wew" ; Chr(1) ; " " ; Ss ; Chr(0) ;
   End If
   Else
   I11 = I1
   If I1 > 0 Then
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 1
   Lcd "Wew" ; Chr(2) ; " " ; Ss ; Chr(0) ;
   Else
   Ss = Str(i1)
   Ss = Format(ss , "0.0")
   Locate 1 , 1
   Lcd "Wew" ; Chr(2) ; " " ; Ss ; Chr(0) ;
   End If
   End If


   I2 = I2 * 10
   I2 = I2 / 16
   If I2 >= I22 Then
   I22 = I2
   If I2 > 0 Then
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 2 , 1
   Lcd "Zew" ; Chr(1) ; " " ; Ss ; Chr(0) ;
   Else
   Ss = Str(i2)
   Ss = Format(ss , "0.0")
   Locate 2 , 1
   Lcd "Zew" ; Chr(1) ; " " ; Ss ; Chr(0) ;
   End If
   Else
   I22 = I2
   If I1 > 0 Then
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 2 , 1
   Lcd "Zew" ; Chr(2) ; " " ; Ss ; Chr(0) ;
   Else
   Ss = Str(i2)
   Ss = Format(ss , "0.0")
   Locate 2 , 1
   Lcd "Zew" ; Chr(2) ; " " ; Ss ; Chr(0) ;
   End If
   End If


   I3 = I3 * 10
   I3 = I3 / 16
   If I3 >= I33 Then
   I33 = I3
   If I3 > 0 Then
   Ss = Str(i3)
   Ss = Format(ss , " 0.0")
   Locate 1 , 11
   Lcd "Chl" ; Chr(1) ; " " ; Ss ; Chr(0) ;
   Else
   Ss = Str(i3)
   Ss = Format(ss , "0.0")
   Locate 1 , 11
   Lcd "Chl" ; Chr(1) ; " " ; Ss ; Chr(0) ;
   End If
   Else
   I33 = I3
   If I1 > 0 Then
   Ss = Str(i3)
   Ss = Format(ss , " 0.0")
   Locate 1 , 11
   Lcd "Chl" ; Chr(2) ; " " ; Ss ; Chr(0) ;
   Else
   Ss = Str(i3)
   Ss = Format(ss , "0.0")
   Locate 1 , 11
   Lcd "Chl" ; Chr(2) ; " " ; Ss ; Chr(0) ;
   End If
   End If


   I4 = I4 * 10
   I4 = I4 / 16
   If I4 >= I44 Then
   I44 = I4
   If I1 > 0 Then
   Ss = Str(i4)
   Ss = Format(ss , " 0.0")
   Locate 2 , 11
   Lcd "Gaz" ; Chr(1) ; " " ; Ss ; Chr(0) ;
   Else
   Ss = Str(i4)
   Ss = Format(ss , "0.0")
   Locate 2 , 11
   Lcd "Gaz" ; Chr(1) ; " " ; Ss ; Chr(0) ;
   End If
   Else
   I44 = I4
   If I4 > 0 Then
   Ss = Str(i4)
   Ss = Format(ss , " 0.0")
   Locate 2 , 11
   Lcd "Gaz" ; Chr(2) ; " " ; Ss ; Chr(0) ;
   Else
   Ss = Str(i4)
   Ss = Format(ss , "0.0")
   Locate 2 , 11
   Lcd "Gaz" ; Chr(2) ; " " ; Ss ; Chr(0) ;
   End If
   End If

Loop


Mam nadzieje że pomogłem i przyda się ten kod



strzalki.rar
 Opis:
 n/a

Download
 :  strzalki.rar
 Zawartość:  11.bas , 11.BM , 11.BIN , 11.DBG , 11.HEX , 11.OBJ , 11.RPT
Zobacz całość...
 Rozmiar:  19.65 KB
 Punkty:  1 = 0.00 za transfer + 1 dla użytkownika (ustawiono ręcznie)

Powrót do góry
   
jacekhe
Poziom 15
Poziom 15

Dołączył: 06 Maj 2007
Posty: 240
Miasto: Janów Lubelski

Post 31 Mar 2008 12:06   

Re: 4x DS18b20 +LCD = Termometr


O wielkie dzięki za pomoc, dziękuję.
Powrót do góry
   
comer3
Poziom 19
Poziom 19

Dołączył: 06 Sie 2006
Posty: 645
Miasto: Rzeszów/Szalowa

Post 13 Kwi 2008 09:30   

Re: 4x DS18b20 +LCD = Termometr


Zgodnie z Helpem Bascoma W powinno być zadeklarowane jako Word lub Integer, a w każdym powyższym kodzie widzę że jest jako Byte...
Przy deklaracji jako Byte ten kawałek kodu:
Kod:

(...)
Cls
W = 1wirecount()
Lcd "Ilosc czujnikow:"                                     
Waitms 500
Lcd W
Wait 2
Cls       
(...)


nie ma sensu, gdyż na wyświetlaczu nie pokazuje się ilość podpiętych czujników...
Przy deklaracjach zmiennych wystarczy zmienić na:

Kod:
Dim W As Word


i wszytko jest OK.. ;)
Powrót do góry
   
peleton123
Poziom 10
Poziom 10

Dołączył: 22 Mar 2008
Posty: 51
Miasto: Mińsk Maz.

Post 13 Kwi 2008 09:53   

Re: 4x DS18b20 +LCD = Termometr


comer3 napisał:
Przy deklaracji jako Byte nie ma sensu, gdyż na wyświetlaczu nie pokazuje się ilość podpiętych czujników...

Nie rozumiem sugestii przecież nawet przy Byte, mikrokontroler dobrze rozpoznaje liczbę czujników, ja mam z Byte i ładnie odczytuje po starcie
Powrót do góry
   
comer3
Poziom 19
Poziom 19

Dołączył: 06 Sie 2006
Posty: 645
Miasto: Rzeszów/Szalowa

Post 13 Kwi 2008 10:04   

Re: 4x DS18b20 +LCD = Termometr


Tak - ale nie wiem czy zauważyłeś, że na wyświetlaczu nie jest wyświetlana liczba czujników.. A przy napisaniu:

Kod:

Lcd "Ilosc czujnikow:"                                     
Waitms 500
Lcd W


chyba chodzi właśnie o to, aby wyświetlić liczbę dostępnych czujników.... ;)
Przy deklaracji Byte na wyświetlaczu pokaże się:
Kod:

Ilosc czujnikow:


Program odczeka 0,5 sek i wyświetli ID poszczególnych czujników..

Przy deklaracji W jako Word na wyświetlaczu otrzymamy:
Kod:

Ilosc czujnikow:
4


I program siebie dalej już normalnie leci... :)

Może to i drobny szczegół, ale skoro go już zauważyłem to piszę.. ;)
Powrót do góry
   
peleton123
Poziom 10
Poziom 10

Dołączył: 22 Mar 2008
Posty: 51
Miasto: Mińsk Maz.

Post 13 Kwi 2008 10:34   

Re: 4x DS18b20 +LCD = Termometr


Ale u mnie przy Byte wyświetla
Ilość czujników:
4 czy 2 zależnie ile mam podpięte a dopiero potem ich adresy. Wiec dziwne że u Ciebie nie wyświetla liczby czujników:/

EDIT
Może najpierw sprawdź w praktyce że przy Byte również działa, a nie opierasz sie tylko na teorii HELPa
Powrót do góry
   
comer3
Poziom 19
Poziom 19

Dołączył: 06 Sie 2006
Posty: 645
Miasto: Rzeszów/Szalowa

Post 13 Kwi 2008 10:55   

Re: 4x DS18b20 +LCD = Termometr


Sprawdziłem... i przy Byte mi nie działa... Gdyby działało to bym nie pisał ..:)

P.S. Ja mam podłączone DS'y na 3 przewodach.. Może dlatego mi z Byte nie działa ... ;)
Powrót do góry
   
jacekhe
Poziom 15
Poziom 15

Dołączył: 06 Maj 2007
Posty: 240
Miasto: Janów Lubelski

Post 21 Kwi 2008 19:02   

Re: 4x DS18b20 +LCD = Termometr


A ja ma pytanko jak do tego termometru, dorobić taki bajer aby przypominał o włączeniu świateł. Wiecie o co chodzi??, jak wyłączę światła to pokazuje ze ma wyłączone, jak mam włączone to pokazuje normalnie temperaturkę. Wie ktoś jak to wykonać??
Powrót do góry
   
Duch__
Poziom 22
Poziom 22

Dołączył: 12 Gru 2004
Posty: 1614
Miasto: Opole

Post 24 Kwi 2008 09:43   

Re: 4x DS18b20 +LCD = Termometr


peleton123 napisał:

Znalazłem chwile czasu i przerobiłem kod...


Wykorzystałem twój kod do aktualizacji mojego termometru :D
Poprzestawiałem tylko miejsca wyświetlania strzałek względem temperatury.

PS. Warto by pomyśleć o sposobie wyświetlania strzałek jeśli temperatura się utrzymuje niezmiennie przez dłuższą chwilę.

4x DS18b20 +LCD = Termometr


Kod:

'Termometr 4 punktowy DS18b20 by Duch na podstawie materiałów znalezionych w sieci
'Kontakt duszkowski(małpa)o2.pl


$regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
$crystal = 1000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
'Deklaracja portów od wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

Config Lcd = 20 * 2                                         'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x20, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)

'*************************************WAŻNE**********************************************
'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
Config 1wire = Portd.5                                      'deklaracja portu na którym będą podpięte DS18b20

Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
Dim I3 As Integer
Dim I4 As Integer
Dim I11 As Integer                                          ' przechowuje poprzednią wartoś temp
Dim I22 As Integer                                          ' przechowuje poprzednią wartoś temp
Dim I33 As Integer                                          ' przechowuje poprzednią wartoś temp
Dim I44 As Integer                                          ' przechowuje poprzednią wartoś temp

Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Dsid3(8) As Byte
Dim Dsid4(8) As Byte
Dim B As Byte                                               'deklaracja zmiennej do odczytu kodów ID
Dim W As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników

Deflcdchar 0 , 8 , 20 , 8 , 32 , 32 , 32 , 32 , 32          'znak stopnia Celsjusza
Deflcdchar 1 , 32 , 4 , 14 , 21 , 4 , 4 , 4 , 32            ' strzałka góra
Deflcdchar 2 , 32 , 4 , 4 , 4 , 21 , 14 , 4 , 32            ' strzałka dół


Cursor Off                                                  'Wyłącza kursor
Cls                                                         'Funkcja CLS czyści ekran
Lcd "     Termometr      " ;                                'ekran startowy (pojawia się tylko podczas włączania urządzenia)
Lowerline
Lcd " by Duch 9.09.2007  "
Wait 5
Cls
Lcd "  Upgrade 24.04.08  " ;
Wait 3                                'ekran startowy (pojawia się tylko podczas włączania urządzenia)
Cls

W = 1wirecount()
Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Waitms 500
Lcd W
Wait 3
Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
Dsid3(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
Dsid4(1) = 1wsearchnext()

'*******************Odczyt numerów ID czujników temperatury*********************

If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 1 , 1
 Lcd "CRC OK Czujnik 1 ID"
 Wait 1
 Locate 1 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
End If
Wait 2

If Dsid2(8) = Crc8(dsid2(1) , 7) Then
 Locate 2 , 1
 Lcd "CRC OK Czujnik 2 ID"
 Wait 1
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(dsid2(b))
 Next
End If
Wait 2

If Dsid3(8) = Crc8(dsid3(1) , 7) Then
 Locate 1 , 1
 Lcd "CRC OK Czujnik 3 ID"
 Wait 1
 Locate 1 , 1
 For B = 1 To 8
 Lcd Hex(dsid3(b))
 Next
End If
Wait 2

If Dsid4(8) = Crc8(dsid4(1) , 7) Then
 Locate 2 , 1
 Lcd "CRC OK Czujnik 4 ID"
 Wait 1
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(dsid4(b))
 Next
End If
Wait 2
Cls

'*******************koniec odczytu ID czujników temperatury*********************

Do
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
   1wwrite &HBE
   I1 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
   1wwrite &HBE
   I2 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid3(1)                                        'wysylam adres trzeciego czujnika
   1wwrite &HBE
   I3 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid4(1)                                        'wysylam adres czwartego czujnika
   1wwrite &HBE
   I4 = 1wread(2)
'--------konwersja temp dla wszystkich dsow
   1wreset
   1wwrite &HCC
   1wwrite &H44
Wait 1

'****Jeśli pracujesz z wyświetlaczem innym niż 2x20 to tutaj trzeba wprowadzić zmiany w LOCATE********

   I1 = I1 * 10
   I1 = I1 / 16
   If I1 >= I11 Then
   I11 = I1
   If I1 > 0 Then
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 1
   Lcd "Zew" ; Ss ; Chr(0) ; Chr(1) ;
   Else
   Ss = Str(i1)
   Ss = Format(ss , "0.0")
   Locate 1 , 1
   Lcd "Zew" ; Ss ; Chr(0) ; Chr(1) ;
   End If
   Else
   I11 = I1
   If I1 > 0 Then
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 1
   Lcd "Zew" ; Ss ; Chr(0) ; Chr(2) ;
   Else
   Ss = Str(i1)
   Ss = Format(ss , "0.0")
   Locate 1 , 1
   Lcd "Zew" ; Ss ; Chr(0) ; Chr(2) ;
   End If
   End If


   I2 = I2 * 10
   I2 = I2 / 16
   If I2 >= I22 Then
   I22 = I2
   If I2 > 0 Then
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 2 , 1
   Lcd "Lod" ; Ss ; Chr(0) ; Chr(1) ;
   Else
   Ss = Str(i2)
   Ss = Format(ss , "0.0")
   Locate 2 , 1
   Lcd "Lod" ; Ss ; Chr(0) ; Chr(1) ;
   End If
   Else
   I22 = I2
   If I1 > 0 Then
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 2 , 1
   Lcd "Lod" ; Ss ; Chr(0) ; Chr(2) ;
   Else
   Ss = Str(i2)
   Ss = Format(ss , "0.0")
   Locate 2 , 1
   Lcd "Lod" ; Ss ; Chr(0) ; Chr(2) ;
   End If
   End If


   I3 = I3 * 10
   I3 = I3 / 16
   If I3 >= I33 Then
   I33 = I3
   If I3 > 0 Then
   Ss = Str(i3)
   Ss = Format(ss , " 0.0")
   Locate 1 , 11
   Lcd "Wew" ; Ss ; Chr(0) ; Chr(1) ;
   Else
   Ss = Str(i3)
   Ss = Format(ss , "0.0")
   Locate 1 , 11
   Lcd "Wew" ; Ss ; Chr(0) ; Chr(1) ;
   End If
   Else
   I33 = I3
   If I1 > 0 Then
   Ss = Str(i3)
   Ss = Format(ss , " 0.0")
   Locate 1 , 11
   Lcd "Wew" ; Ss ; Chr(0) ; Chr(2) ;
   Else
   Ss = Str(i3)
   Ss = Format(ss , "0.0")
   Locate 1 , 11
   Lcd "Wew" ; Ss ; Chr(0) ; Chr(2) ;
   End If
   End If


   I4 = I4 * 10
   I4 = I4 / 16
   If I4 >= I44 Then
   I44 = I4
   If I1 > 0 Then
   Ss = Str(i4)
   Ss = Format(ss , " 0.0")
   Locate 2 , 11
   Lcd "Pie" ; Ss ; Chr(0) ; Chr(1) ;
   Else
   Ss = Str(i4)
   Ss = Format(ss , "0.0")
   Locate 2 , 11
   Lcd "Pie" ; Ss ; Chr(0) ; Chr(1) ;
   End If
   Else
   I44 = I4
   If I4 > 0 Then
   Ss = Str(i4)
   Ss = Format(ss , " 0.0")
   Locate 2 , 11
   Lcd "Pie" ; Ss ; Chr(0) ; Chr(2) ;
   Else
   Ss = Str(i4)
   Ss = Format(ss , "0.0")
   Locate 2 , 11
   Lcd "Pie" ; Ss ; Chr(0) ; Chr(2) ;
   End If
   End If

Loop

'Koniec programu
'Pozdrawiam Duch




Ciesze się temat jest nadal "na topie" i się powoli, ale stopniowo rozwija.

Pozdrawiam Duch.
Powrót do góry
   
peleton123
Poziom 10
Poziom 10

Dołączył: 22 Mar 2008
Posty: 51
Miasto: Mińsk Maz.

Post 24 Kwi 2008 20:51   

Re: 4x DS18b20 +LCD = Termometr


Duch__ napisał:

PS. Warto by pomyśleć o sposobie wyświetlania strzałek jeśli temperatura się utrzymuje niezmiennie przez dłuższą chwilę.


Żaden problem dodać tylko dodatkowy elseif

Kod:
   I1 = I1 * 10
   I1 = I1 / 16
   If I1 > I11 Then
   I11 = I1
   If I1 > 0 Then
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 1
   Lcd "Zew" ; Ss ; Chr(0) ; Chr(1) ;
   Else
   Ss = Str(i1)
   Ss = Format(ss , "0.0")
   Locate 1 , 1
   Lcd "Zew" ; Ss ; Chr(0) ; Chr(1) ;
   End If
   Elseif I1 < I11 Then
   I11 = I1
   If I1 > 0 Then
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 1
   Lcd "Zew" ; Ss ; Chr(0) ; Chr(2) ;
   Else
   Ss = Str(i1)
   Ss = Format(ss , "0.0")
   Locate 1 , 1
   Lcd "Zew" ; Ss ; Chr(0) ; Chr(2) ;
   End If
   Else
   I11 = I1
   If I1 > 0 Then
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 1
   Lcd "Zew" ; Ss ; Chr(0) ; Chr(3) ;
   Else
   Ss = Str(i1)
   Ss = Format(ss , "0.0")
   Locate 1 , 1
   Lcd "Zew" ; Ss ; Chr(0) ; Chr(3) ;
   End If
   End If


   I2 = I2 * 10
   I2 = I2 / 16
   If I2 >= I22 Then
   I22 = I2
   If I2 > 0 Then
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 2 , 1
   Lcd "Lod" ; Ss ; Chr(0) ; Chr(1) ;
   Else
   Ss = Str(i2)
   Ss = Format(ss , "0.0")
   Locate 2 , 1
   Lcd "Lod" ; Ss ; Chr(0) ; Chr(1) ;
   End If
   Elseif I2 < I22 Then
   I22 = I2
   If I1 > 0 Then
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 2 , 1
   Lcd "Lod" ; Ss ; Chr(0) ; Chr(2) ;
   Else
   Ss = Str(i2)
   Ss = Format(ss , "0.0")
   Locate 2 , 1
   Lcd "Lod" ; Ss ; Chr(0) ; Chr(2) ;
   End If
   Else
   I22 = I2
   If I1 > 0 Then
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 2 , 1
   Lcd "Lod" ; Ss ; Chr(0) ; Chr(3) ;
   Else
   Ss = Str(i2)
   Ss = Format(ss , "0.0")
   Locate 2 , 1
   Lcd "Lod" ; Ss ; Chr(0) ; Chr(3) ;
   End If
   End If


   I3 = I3 * 10
   I3 = I3 / 16
   If I3 >= I33 Then
   I33 = I3
   If I3 > 0 Then
   Ss = Str(i3)
   Ss = Format(ss , " 0.0")
   Locate 1 , 11
   Lcd "Wew" ; Ss ; Chr(0) ; Chr(1) ;
   Else
   Ss = Str(i3)
   Ss = Format(ss , "0.0")
   Locate 1 , 11
   Lcd "Wew" ; Ss ; Chr(0) ; Chr(1) ;
   End If
   Elseif I3 < I33 Then
   I33 = I3
   If I1 > 0 Then
   Ss = Str(i3)
   Ss = Format(ss , " 0.0")
   Locate 1 , 11
   Lcd "Wew" ; Ss ; Chr(0) ; Chr(2) ;
   Else
   Ss = Str(i3)
   Ss = Format(ss , "0.0")
   Locate 1 , 11
   Lcd "Wew" ; Ss ; Chr(0) ; Chr(2) ;
   End If
   Else
   I33 = I3
   If I1 > 0 Then
   Ss = Str(i3)
   Ss = Format(ss , " 0.0")
   Locate 1 , 11
   Lcd "Wew" ; Ss ; Chr(0) ; Chr(3) ;
   Else
   Ss = Str(i3)
   Ss = Format(ss , "0.0")
   Locate 1 , 11
   Lcd "Wew" ; Ss ; Chr(0) ; Chr(3) ;
   End If
   End If


   I4 = I4 * 10
   I4 = I4 / 16
   If I4 >= I44 Then
   I44 = I4
   If I1 > 0 Then
   Ss = Str(i4)
   Ss = Format(ss , " 0.0")
   Locate 2 , 11
   Lcd "Pie" ; Ss ; Chr(0) ; Chr(1) ;
   Else
   Ss = Str(i4)
   Ss = Format(ss , "0.0")
   Locate 2 , 11
   Lcd "Pie" ; Ss ; Chr(0) ; Chr(1) ;
   End If
   Elseif I4 < I44 Then
   I44 = I4
   If I4 > 0 Then
   Ss = Str(i4)
   Ss = Format(ss , " 0.0")
   Locate 2 , 11
   Lcd "Pie" ; Ss ; Chr(0) ; Chr(2) ;
   Else
   Ss = Str(i4)
   Ss = Format(ss , "0.0")
   Locate 2 , 11
   Lcd "Pie" ; Ss ; Chr(0) ; Chr(2) ;
   End If
   Else
   I44 = I4
   If I4 > 0 Then
   Ss = Str(i4)
   Ss = Format(ss , " 0.0")
   Locate 2 , 11
   Lcd "Pie" ; Ss ; Chr(0) ; Chr(3) ;
   Else
   Ss = Str(i4)
   Ss = Format(ss , "0.0")
   Locate 2 , 11
   Lcd "Pie" ; Ss ; Chr(0) ; Chr(3) ;
   End If
   End If

Powrót do góry
   
Duch__
Poziom 22
Poziom 22

Dołączył: 12 Gru 2004
Posty: 1614
Miasto: Opole

Post 24 Kwi 2008 21:59   

Re: 4x DS18b20 +LCD = Termometr


Wykorzystałem znów twoją podpowiedź co do rozwiązania. Jako znak niezmienności temperatury od ostatniego pomiaru dałem
Kod:
Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32
puste pole.

Teraz przyszedł kolejny problem.

Zmiana temperatury czy to w dół czy w górę czy stała wyświetla się prawidłowo, ale przydało by się to uśrednić by nie reagował tak gwałtownie.

Narazie zmniejszyłem częstotliwość pomiaru do 1 co 15 sekund, ale nie sądze żeby to było dobre rozwiązanie.

Kod:
--------konwersja temp dla wszystkich dsow
   1wreset
   1wwrite &HCC
   1wwrite &H44
Wait 15

Powrót do góry
   
peleton123
Poziom 10
Poziom 10

Dołączył: 22 Mar 2008
Posty: 51
Miasto: Mińsk Maz.

Post 25 Kwi 2008 10:02   

Re: 4x DS18b20 +LCD = Termometr


Z tymi 15sek to trochę lipnie, bo zbyt rzadko będzie się odświeżać.

Można byłoby dać jeszcze ze 2 zmienne które zapamiętywałyby do 3 ostatnich temperatur. I dać inaczej instrukcje IF. Pierwszy by sprawdzał czy 3 ostatnie są równe jeśli tak to nic nie wypisuj jeśli nie to sprawdź czy obecna i ostatnia jest mniejsza jeśli tak to strzałka w dól jeśli nie to w gorę.

IF T1=T2=T3=T4 THEN
wpisz temp. bez strzałek
ELSE
IF T1<T2 THEN
wypisz temp ze strzałką w dół
ELSE
wypisz ze strzałką w górę
ENDIF
ENDIF

Co o tym myślicie??
Powrót do góry
   
Napisz nowy temat  Odpowiedz do tematu      Strona Główna -> Forum elektroda -> DIY Konstrukcje -> 4x DS18b20 +LCD = Termometr
Wypowiedź dla Wykop Wypowiedź dla Facebook Wypowiedź dla Delicious Wypowiedź dla Digg Wypowiedź dla Google Wypowiedź dla Twitter Wypowiedź dla Blip
Strona 5 z 12 Idź do strony Poprzedni  1, 2, 3, 4, 5, 6 ... 10, 11, 12  Następny
Skok:
Podobne tematy
4x DS18b20 +LCD = Termometr (1)
Zegar DCF 77,5kHz na LCD 128*64 znaków z termometr DS18B20 (8)
Termometr na: DS18B20 (1)
Jednopunktowy termometr na DS18B20 (45)
Termometr na ATmega32 2x DS18B20 (33)
NE044 TERMOMETR DWUPUNKTOWY DS18B20 (5)
Termometr Pokojowy 0-99,9 C deg. na DS18B20 (17)
Termometr na DS18B20 + SHT11 + GSM (19)
termometr DS18B20 + DS9097E - czy da sie zewnetrznie zasilac (7)
Mikrokontroler + Termometr + LCD (1)



[ Page generation time: 0.254 seconds ]

Regulamin || Administrator || Moderatorzy || Widgety i bannery || Kontakt
elektroda.pl temat RSS