Witam jak wykonać, szczałki sygnalizujące spadek tem i wzrost temp w bascom?? Jak napisać program, aby dobrze on działał i szczałki dobrze wskazywały?
Czy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tamjesli [t2>t1] wtedy
wyswietl strzalke [temp. rosnie]
w przeciwnym wypadku
jesli [t2<t1] // to zeby wyeliminowac gdy temperatura jest identyczna
wyswietl strzalke [temp. maleje]Cytat:Przyjmę zlecenia na układy z uC (PIC/AVR/51/8080) w (C/ASM/BASCOM) i nie tylko, krótkie terminy, rzetelnie!
Cytat:Histereza - zjawisko zależności aktualnego stanu układu od stanów w poprzedzających chwilach. Inaczej - opóźnienie w reakcji na czynnik zewnętrzny (...)
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 DuchJmL(TM) napisał:No nic prostrzego chyba juz nie ma do zrobienia. Deklarujesz 2 zmienne i najpierw dokonujesz odczytu i zapisujesz do jednej zmiennej, a nastepnie po min. 0,7sek bo chyba tyle potrzebuje DS z tego co pamietam dodkonujesz nastepnego pomiaru i wartosc zapisujesz do zmiennej nr 2. Pozniej tylko warunek:
jesli [t2>t1] wtedy wyswietl strzalke [temp. rosnie] w przeciwnym wypadku jesli [t2<t1] // to zeby wyeliminowac gdy temperatura jest identyczna wyswietl strzalke [temp. maleje]
A jesli chcesz gotowca to Balu chetnie ci pomoze bo w jego poscie na dole mozna przeczytac:
Cytat:Przyjmę zlecenia na układy z uC (PIC/AVR/51/8080) w (C/ASM/BASCOM) i nie tylko, krótkie terminy, rzetelnie!
wiec pewnie sobie z tym poradzi i niedrogo wezmie!
1wreset
1wwrite &H55
1wverify Dsid1(1)
1wwrite &HBE
I1(1) = 1wread(9)
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 300
Waitms 300
If I1(8) = Crc8(i1(1) , 7) Then
Crc = 0
End If
If Crc = 0 Then
Tmp = I1(1) And 1
If Tmp = 1 Then Decr I1(1)
T = Makeint(i1(1) , I1(2))
T = T * 50 : T = T - 25 : T1 = I1(8) - I1(7) : T1 = T1 * 100
T1 = T1 / I1(8) : T = T + T1 : T = T / 10
End If
If Crc = 1 Then
Locate 4 , 1 : Lcd " Sensor Error! "
Else
Locate 4 , 1
Lcd "WaterTemp:"
If Crc = 0 Then
Locate 4 , 12
Ia = Str(t)
Lcd Left(ia , 2) : Lcd "."
Lcd Mid(ia , 3 , 1)
Locate 4 , 16 : Lcd Chr(1) ; "C"
End If
'------------------Strzalka przy obnizeniu albo podwyzszeniu Temp---------------
If T1 > T Then
Locate 4 , 19 : Lcd Chr(12)
Else
If T1 < T Then
Locate 4 , 19 : Lcd Chr(13)
End If
End If
Loop
End
Return
Cytat:
post raportowany,
proszę poprawić błędy,
post będzie bardziej czytelny
And!
Hubold napisał:Witam!
W zeszłym roku był na ten temat topic.
Strona z kodem w połowie jest 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
Musisz tylko dostosować go do swoich potrzeb , czyli jeżeli masz 2 czujniki musisz usunąć komendy wyszukiwania 3 i 4 czujnika oraz wyświetlania temp. pobranej z 3 i 4 czujnika itp. :] Ja w swoim projekcie wykorzystałem właśnie ten kod, działa wyśmienicie:) problem tylko w tym ,że strzałka jest cały czas w ruchy zn. zmienia się bardzo często ze wzrostowej na malejącą przy niewielkich różnicach temp.
Pozdrawiam
Michał