'Termometr 4 punktowy DS18b20 by Duch na podstawie materiałów znalezionych w sieci
'Kontakt duszkowski@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 * 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

Config Pinc.0 = Input
Config Pinc.1 = Input                                       ' definicja portów
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Output
Config Pinc.5 = Output
Config Pind.0 = Input

Set Portc.0                                                 ' podciągnięcie portów rezystorem do plusa
Set Portc.1
Set Portc.2
Set Portc.3
Set Portd.0

Pk1 Alias Portc.4
Pk2 Alias Portc.5


Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
Dim I3 As Integer



Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Dsid3(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
Dim A1 As Integer                                           'deklaracja zmiennych dla alarmów
Dim A2 As Integer

Readeeprom A1 , 0
Readeeprom A2 , 100

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 "**Elektroda.pl**" ;                                    'ekran startowy (pojawia się tylko podczas włączania urządzenia)
Lowerline
Lcd "      2010      "
Wait 1
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 1
Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
Dsid2(1) = 1wsearchnext()
Dsid3(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 1

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 1
Cls
If Dsid3(8) = Crc8(dsid3(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
 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 1


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)                                        'wysyłamy adres pierwszego czujnika
   1wwrite &HBE
   I3 = 1wread(2)


   '--------konwersja temp dla wszystkich dsow
   1wreset
   1wwrite &HCC
   1wwrite &H44


'****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 "1-" ; Ss ; Chr(0) ;

   If A1 <= I1 Then
      Set Pk1
   Else
      Reset Pk1
   End If

   I2 = I2 * 10
   I2 = I2 / 16
   'If I2 > 0 Then Cls
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 1 , 10
   Lcd "2-" ; Ss ; Chr(0) ;

   Wait 2

   Cls

   I3 = I3 * 10
   I3 = I3 / 16
   'If I3 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
   Ss = Str(i3)
   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 "3-" ; Ss ; Chr(0) ;


  

   If A2 <= I2 Then
      Set Pk2
   Else
      Reset Pk2
   End If

   Locate 2 , 1                                             'Wyświetlanie wartosci alarmów
   Lcd "Al-" ; A1

   Locate 2 , 10
   Lcd "Al-" ; A2

'***** Obsługa Przycisków **********

If Pinc.0 = 0 Then
   Incr A1
End If

If Pinc.1 = 0 Then
   Incr A2
End If

If Pinc.2 = 0 Then
   Decr A1
End If

If Pinc.3 = 0 Then
   Decr A2
End If

If Pind.0 = 0 Then
   Writeeeprom A1 , 0
   Writeeeprom A2 , 100
End If

 Loop

'Koniec programu
'Pozdrawiam Duch