[ electron2008 @ 28.04.2013. 10:00 ] @
Dali je neko radio termostat (termometar) sa 2xDS18B20 i Picom na jednoj magistrali u PicBasicu?
Caka je koliko vidim u seriskim brojevima od DS senzora?
Link
Code:
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'* Universal thermostat -25/+75 C.  by R.T.G. van Steenis                  *
'* Digital thermostat (080090-11) from Elektor july_august 2008            *
'* Compiler : PicBasic Pro 2.44                                            *
'* B0 = Mode switch in (In)            A0 = LCD Enable    (Out)            *
'* B1 = + switch in    (In)            A1 = LCD RS        (Out)            *
'* B2 = - switch in    (In)            A2 = "Warm" Output (Out)            *
'* B3 = Not connected  (Out)           A3 = "Cold" Output (Out)            *
'* B4 = LCD Bit 4      (Out)           A4 = DQ DS1820     (In)             *
'* B5 = LCD Bit 5      (Out)                                               *
'* B6 = LCD Bit 6      (Out)                                               *
'* B7 = LCD Bit 7      (Out                                                *
'*                                                                         *
'*                 modify by Niculescu Dan                                 * 
'*                                                                         *
'*         DUAL THERMO 2xDS18B20 ; PIC 16F628A  ; LCD 2x16                 *
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

TRISA= %11110000                        ' RA0..3=Outputs RA4=Input
TRISB= %00000111                    ' RB0..RB2=Inputs, RB3..RB7=Outputs
CMCON=7                                 ' Disable comparators

DEFINE LCD_DREG PORTB                   ' LCD on port B
DEFINE LCD_DBIT 4                       ' Data bits B4..B7
DEFINE LCD_RSREG PORTA                  ' RS on PORTA
DEFINE LCD_RSBIT 1                      ' RS on A1 
DEFINE LCD_EREG PORTA                   ' E on PORTA
DEFINE LCD_EBIT 0                       ' E on A0
DEFINE LCD_BITS 4                       ' LCD 4 bit mode
DEFINE LCD_LINES 2                      ' 2 line LCD display

Temperature1     Var   Word      ' Temperature storage Sensor1
Temperature2     Var   Word      ' Temperature storage Sensor2
TempC            Var    Word
Float            Var    Word
TargetTemp        Var   Word      ' Desired Temperature
Hyst           Var   Word      ' Hystereris
V           Var   Word      ' Var. for display
V2           Var   Word      ' Var. for display
B1               Var    Byte        ' Byte for TargetTemp calculation 
B2               Var    Byte        ' Byte for TargetTemp calculation
Sign           Var   Byte      ' +/- sign
Mode            Var   Byte      ' 0=Temp. display, 1=Set Temp, 2=Set Hysteresis
DQ           Var   PORTA.4   ' One-wire data pin
Twist            Var    Bit
Twist2           Var    Bit
Dummy            Var    Byte

DS18B20_9bit    CON %00011111 ; 93.75ms, 0.5°C
DS18B20_10bit    CON %00111111 ; 187.5ms, 0.25°C 
DS18B20_11bit    CON %01011111 ; 375ms,   0.125°C
DS18B20_12bit    CON %01111111 ; 750ms,   0.0625°C  (default)
DS18B20_1_12bit    CON %01111111 ; 750ms,   0.0625°C  
DS18B20_2_12bit    CON %01111111 ; 750ms,   0.0625°C  

DATA 46, 224, 20                        ' Temp MSB, TEMP LSB, Hysteresis DIV 10

PORTA.2=0                               ' Warm Output Low
PORTA.3=0                               ' Cold Output Low
Mode=0                                  ' Temperature display mode  
Twist = 0
Twist2 = 0

Pause 500
LCDOUT $FE, 1, $FE, $0C                 ' Clear display, cursor off
Pause 250

Read 0, B1                              ' Read TargetTemp MSB
Read 1, B2                              ' Read TargetTemp LSB
TargetTemp=B1*256+B2                    ' Calculate TargetTemp value (Default=20.0 C.)
Read 2, B1                              ' Read Hysteresis 
Hyst=10*B1                              ' Calculate Hysteresis value (Default= 2.0 C.)  

 OWOut DQ, 1, [$55, $28,  $DD, $06, $49, $1, $0, $0, $D4, $4E, $FF, $FF, $7F] ' Init Sensor 1
 OWOut DQ, 1, [$55, $28,  $DD, $06, $49, $1, $0, $0, $D4, $48] 
 OWOut DQ, 1, [$55, $28,  $DD, $06, $49, $1, $0, $0, $D4, $B8] 
 OWOut DQ, 1, [$55, $28,  $DD, $06, $49, $1, $0, $0, $D4, $BE] 
Pause 1000
 OWIn DQ, 0, [Temperature1.Byte0, Temperature2.Byte1]
LcdOut $FE, $80,  "Senzor1 INIT OK" 
Pause 500


 OWOut DQ, 1, [$55, $28,  $EB, $EA, $48, $1, $0, $0, $FF, $4E, $FF, $FF, $7F] ' Init Sensor 2
 OWOut DQ, 1, [$55, $28,  $EB, $EA, $48, $1, $0, $0, $FF, $48] 
 OWOut DQ, 1, [$55, $28,  $EB, $EA, $48, $1, $0, $0, $FF, $B8] 
 OWOut DQ, 1, [$55, $28,  $EB, $EA, $48, $1, $0, $0, $FF, $BE] 
Pause 1000
 OWIn DQ, 0, [Temperature2.Byte0, Temperature2.Byte1] 
LcdOut $FE, $C0,  "Senzor2 INIT OK" 
Pause 1000


MainLoop: 
 If PORTB.0=0 then                      ' Mode switch pressed
  Pause 50                              ' Debounce 
LcdOut $FE, 1
 LcdOut $FE, $8F, "*"                   ' Show that command is accepted 
  If PORTB.0=0 then MainLoop            ' Wait until button is released  
  Mode=Mode+1                           ' Increment mode
  If Mode=2 then                        ' Save Target Temperature (Mode1 -> Mode2)
   Write 0, TargetTemp / 256          ' TargetTemp MSB
   Write 1, TargetTemp MOD 256          ' TargetTemp LSB
  EndIf
  If Mode > 2 Then                      ' Save Hysteresis (Mode 2 -> Mode 0) 
   Mode=0                         ' Only 0, 1, 2 are valid
   Write 2, Hyst / 10                   ' Divide Hyst value to fit in Byte
  EndIf
 EndIf

 If Mode =1 then
  LcdOut $FE, $80, "SET TEMPERATURE "   ' Show function
  V=TargetTemp                          ' TargetTemp in V  
  Gosub SelectSign                      ' Select +/blank/- 
  Gosub DTemp                           ' Display Target Temperature
  If (PORTB.1=0) Or (PORTB.2=0) then    ' Up or Down button pushed
   If PORTB.2=0 then                    ' Down button 
    If TargetTemp > 7500 then           ' Not lower than -25 C. (10000-MinTemp * 100)
     TargetTemp=TargetTemp-25           ' Decrease temperuture with 0.25 C.
    EndIf
   EndIf
   If PORTB.1=0 then                    ' Up button
    If TargetTemp < 17500 then          ' Not higher than 75 C. (10000+MaxTemp * 100)
     TargetTemp=TargetTemp+25           ' Increase temperature with 0.25 C.
    EndIf
   EndIf
   GoSub SetTargetTemp                  ' Display TargetTemp and delay 0.25 Sec.
  EndIf
 EndIf 

 If Mode=2 then                         ' Set Hysteresis  
  LcdOut $FE, $80, "SET HYSTERESIS "    ' Show function
  Sign=" "                              ' No sign  
  V= 10000+Hyst                         ' Set value for V  
  Gosub DTemp                           ' Display Hysteresis
  If (PORTB.1=0) Or (PORTB.2=0) then    ' Up or down button pushed  
   Sign=" "                             ' No sign for Hysteresis
   If PORTB.2=0 then                    ' Down button
    If Hyst > 10 then Hyst=Hyst-10      ' Not less than 0.1 C.
   EndIf
   If PORTB.1=0 then                    ' Up button
    If Hyst < 1000 then Hyst=Hyst+10    ' Not more than 10.0 C.
   EndIf 
   V= 10000+Hyst                        ' Set value for V
   Gosub DTemp                          ' Display Hysteresis 
   Pause 250                            ' Delay 0.25 Sec.
  EndIf
 EndIf 

 If Mode > 0 then Mainloop              ' Setting TargetTemperature or Hysteresis


Output DQ                          ' Make Pin Output
 DQ=0                         ' OneWire line Low
 PauseUs 480                            ' Keep down for 480 µS  
 Input DQ                               ' Make Pin Input
 PauseUs 70                             ' Wait 70 µS
 If DQ=1 then                           ' No presence pulse from DS1820   
  LcdOut $FE, $1, "** No sensor! **"    ' Show message
  Pause 500                             ' Wait 0.5 Sec. 
  Goto MainLoop                         ' Check again
 EndIf

'===================================================================================================

Main :
Part1:   
 OWOut DQ, 1, [$55, $28,  $DD, $06, $49, $1, $0, $0, $D4, $44] ' Start temp. conversion Sensor1

WaitLoop: 
While not DQ
Wend

OWOut DQ, 1,  [$55, $28,  $DD, $06, $49, $1, $0, $0, $D4, $BE]
Pause 500
OWIn DQ, 0, [Temperature1.Byte0, Temperature1.Byte1]
If Temperature1.15 then       
  Temperature1= ~Temperature1 +1
  Twist = 1
Endif
 
Dummy = 625 * Temperature1
TempC = DIV32 10 
TempC = (Temperature1 & $7FF) >> 4
Float = ((Temperature1.Lowbyte & $0F ) * 25 )>>2
Temperature1 = TempC*100 + Float
If Twist then
  V= 10000 - Temperature1               ' 25 C=12500  0 C=10000  -10 C=9000 
  Twist = 0
 else
  V= 10000 + Temperature1
 EndIf
 If V >= 10000 then                     ' Above 0 C.      
  Temperature1=V-10000                   
 Else                                   
  Temperature1=10000-V                  ' Below 0 C. 
 EndIf
 GoSub SelectSign                       ' +/blank/- Sign 
 GoSub DisplayTemp                      ' Temperature to LCD

'===================================================================================================
Part2 :   
 OWOut DQ, 1, [$55, $28, $EB, $EA, $48, $1, $0, $0, $FF, $44]  ' Start temp. conversion Sensor2

WaitLoop2: 
While not DQ
Wend

OWOut DQ, 1,  [$55, $28, $EB, $EA, $48, $1, $0, $0, $FF, $BE]
Pause 500
OWIn DQ, 0, [Temperature2.Byte0, Temperature2.Byte1]
If Temperature2.15 then       
  Temperature2= ~Temperature2 +1
  Twist2 = 1
Endif
 
Dummy = 625 * Temperature2
TempC = DIV32 10 
TempC = (Temperature2 & $7FF) >> 4
Float = ((Temperature2.Lowbyte & $0F ) * 25 )>>2
Temperature2 = TempC*100 + Float
If Twist2 then
  V2= 10000 - Temperature2              ' 25 C=12500  0 C=10000  -10 C=9000 
  Twist2 = 0
 else
  V2= 10000 + Temperature2
 EndIf
 If V2 >= 10000 then                    ' Above 0 C.      
  Temperature2=V2-10000                   
 Else                                   
  Temperature2=10000-V2                 ' Below 0 C. 
 EndIf

 GoSub SelectSign                       ' +/blank/- Sign 
 GoSub DisplayTemp                      ' Temperature to LCD


Goto MainLoop                ' Do it forever

' SUBROUTINES:
'===================================================================================================
SelectSign:
 If v = 10000 then                      ' Temperature = 0 C.
  Sign=" "                       ' No sign
 Else 
  If v < 10000 then                     ' <> 0
   Sign="-"                      ' Temperature below 0 C.    
  Else
   Sign="+"                      ' Temperature above 0 C.
  EndIf
 EndIf

 If v2 = 10000 then                     ' Temperature = 0 C.
  Sign=" "                       ' No sign
 Else 
  If v2 < 10000 then                     ' <> 0
   Sign="-"                      ' Temperature below 0 C.    
  Else
   Sign="+"                      ' Temperature above 0 C.
  EndIf
 EndIf

Return


'===================================================================================================
DisplayTemp:
 If V >= 10000 then                     ' Above 0 C.      
  Temperature1=V-10000                   
 Else                                   
  Temperature1=10000-V                  ' Below 0 C. 
 EndIf


 If V2 >= 10000 then                    ' Above 0 C.      
  Temperature2=V2-10000                   
 Else                                   
  Temperature2=10000-V2                 ' Below 0 C. 
 EndIf


LcdOut $FE, $80,  "INT : ", Sign," ", DEC (Temperature1 / 100), ".", DEC2 Temperature1, " ",223,"C " 
LcdOut $FE, $C0,  "EXT : ", Sign," ", DEC (Temperature2 / 100), ".", DEC2 Temperature2, " ",223,"C " 
Return

'===================================================================================================
SetTargetTemp:
 V=TargetTemp
 Gosub SelectSign
 Gosub DTemp 
 Pause 250
Return
'===================================================================================================
DTemp :
 If V >= 10000 then                     ' Above 0 C.      
  Temperature1=V-10000                   
 Else                                   
  Temperature1=10000-V                  ' Below 0 C. 
 EndIf
LcdOut $FE, $C0, Sign," ", DEC (Temperature1 / 100), ".", DEC2 Temperature1, " ",223,"C " 
Return

'============================================= END OF PROGRAM ======================================


Ako neko zna kako iscitati i gde ubaciti serijski broj? Mozda nisam dovoljo pazljivo citao?
Meni na LCD trenutno pokazuje
INT: -0.06 αC
EXT: -0.06 αC
[ ZAS011 @ 28.04.2013. 10:44 ] @
Serijski brojevi senzora se u programu koji si naveo koriste na više mesta.
Pogledaj datasheet od DS18B20 da bi video koja je sintaksa prilikom komunikacije sa senzorima.
Ni ja ne pamtim sve "do u sitna crevca" već čitam, prema potrebi.
Komande koje su ti interesantne su ReadROM, MatchROM, SkipROM,..
na taj način se obraćaš pojedinačnim senzorima.

Lakko ćeš iščitati senzore 1 po 1 kada shvatiš ROM komande.

Serijski senzora 1: $28, $DD, $06, $49, $1, $0, $0, $D4
Serijski senzora 2: $28, $EB, $EA, $48, $1, $0, $0, $FF
[ electron2008 @ 28.04.2013. 21:19 ] @
Imam dva DS18B20 i iscitao sam im serijske brojeve sa ovim programom:
Code:
'*****************************************************************************
'*                  LCD Defines for EasyPic5 & 16F887                                *
'*****************************************************************************

  
   clear
   DEFINE OSC 8                '8MHz << NOTICE UPPERCASE ON DEFINE

 'END of timer/oscillator defines

 OSCCON = %01110001          'Int CLK 8MHz
 ANSEL = %00000000           'All digital
 ANSELH = %00000000
 OPTION_REG.7 = 1            'Weak pull-ups enabled



           DEFINE  LCD_DREG    PORTD  'I/O port na kome se nalazi LCD
           DEFINE  LCD_DBIT    4       
           DEFINE  LCD_RSREG   PORTD
           DEFINE  LCD_RSBIT   1      'Register select pin
           DEFINE  LCD_EREG    PORTD
           DEFINE  LCD_EBIT    0      'Enable pin
           DEFINE  LCD_BITS    4      '4-bitni data bus 
           DEFINE  LCD_LINES   2       'LCD ima dva reda karaktera
           
    
    
    DQ Var PORTA.4 ' One-wire data pin
 i Var Byte
 Temp Var Byte
 ReadRom Con $33
 ID VAR BYTE[8] ' Array storage variable for 64-bit ROM code


 Begin:
 PAUSE 500 ' Wait .5 second
 LCDOUT $FE, 1, $FE, $0C ' Clear display, cursor off

 Start_Convert
 OWOUT DQ, 1, [$33] ' Issue Read ROM command

 ID_Loop:
 OWIN DQ, 0, [STR ID\8]' Read 64-bit device data into the 8-byte array "ID"
 for i = 0 to 7
 LcdOut HEX ID[i] 
 next i
 END

prvi sensor 28D698D7400F8
drugi sensor 28FED6D64002B


Kako ih staviti u sam kod merenja temperature, posto su u samom kodu ovako prikazani
Serijski senzora 1: $28, $DD, $06, $49, $1, $0, $0, $D4
Serijski senzora 2: $28, $EB, $EA, $48, $1, $0, $0, $FF

edit: ovako i radi:
$28, $D6, $98, $D7, $4, $0, $0, $F8
$28, $FE, $D6, $D6, $4, $0, $0, $2B

[Ovu poruku je menjao electron2008 dana 28.04.2013. u 22:41 GMT+1]

[Ovu poruku je menjao electron2008 dana 28.04.2013. u 22:41 GMT+1]
[ electron2008 @ 11.05.2015. 20:36 ] @
Kako da u ovaj kod ubacim podesavanje za jos jednu temperaturu SET TEMP2?
Code:
    '*****************************************************************************
    ' Variables
    '*****************************************************************************
     I var word
     J var word
     tmp1    var byte
     tmp2    var byte
    Temperature    Var   Word      ' Temperature storage
    TempC         Var Word
    Float         Var Word
    TargetTemp      Var   Word      ' Desired Temperature
    Hyst         Var   Word      ' Hystereris
    V            Var   Word      ' Var. for display

    B1              Var Byte            ' Byte for TargetTemp calculation
    B2              Var Byte            ' Byte for TargetTemp calculation
    Count_Remain    Var Byte      ' Count remaining
    Count_Per_C    Var   Byte      ' Count per degree C
    Sign         Var   Byte      ' +/- sign
    Mode          Var   Byte      ' 0=Temp. display, 1=Set Temp, 2=Set Hysteresis

    Twist         Var Bit

    '*****************************************************************************
    ' Resolution
    '*****************************************************************************

    DS18B20_9bit     CON %00011111      ' 93.75ms, 0.5°C
    DS18B20_10bit    CON %00111111      ' 187.5ms, 0.25°C  <-- My favorite
    DS18B20_11bit    CON %01011111      ' 375ms,   0.125°C
    DS18B20_12bit    CON %01111111      ' 750ms,   0.0625°C  (default)

    DATA 46, 224, 20                        ' Temp MSB, TEMP LSB, Hysteresis DIV 10

    Heat=0                               ' Warm Output Low
    Cool=0                               ' Cold Output Low
    Mode=0                                  ' Temperature display mode
    Twist = 0 

    PAUSE 500
    LCDOUT $FE, 1, $FE, $0C                 ' Clear display, cursor off
    PAUSE 250




    '-------------------------------------------------------------------------------

    OWOUT DQ, 1, [$CC, $4E, 0, 0, DS18B20_10bit]    'Skip ROM search and write N_bits
                                                   '  resolution to scratch pad
    Read 0, B1                              ' Read TargetTemp MSB
    Read 1, B2                              ' Read TargetTemp LSB
    TargetTemp=B1*256+B2                    ' Calculate TargetTemp value (Default=20.0 C.)
    Read 2, B1                              ' Read Hysteresis
    Hyst=10*B1                              ' Calculate Hysteresis value (Default= 2.0 C.) 
    '-------------------------------------------------------------------------------
    MainLoop:
    If Mode_B=0 then                      ' Mode switch pressed
      Pause 50                              ' Debounce
      LcdOut $FE, $8F, "*"                  ' Show that command is accepted
      If Mode_B=0 then MainLoop            ' Wait until button is released
      Mode=Mode+1                           ' Increment mode
      If Mode=1 then                        ' Save Target Temperature (Mode1 -> Mode2)
       Write 0, TargetTemp / 256      ' TargetTemp MSB
       Write 1, TargetTemp MOD 256          ' TargetTemp LSB
      EndIf
      If Mode > 1 Then                      ' Save Hysteresis (Mode 2 -> Mode 0)       
       Mode=0                     ' Only 0, 1, 2 are valid
       Write 2, Hyst / 10                   ' Divide Hyst value to fit in Byte
      EndIf
    EndIf


    If Mode =0 then                        ' Set Target Temperature                 
      LcdOut $FE, $80, "Set Temp1       "   ' Show function
     
       V=TargetTemp                          ' TargetTemp in V
      Gosub SelectSign                      ' Select +/blank/-
      Gosub DisplayTemp                     ' Display Target Temperature
      If (UP_B=0) Or (DOWN_B=0) then    ' Up or Down button pushed
       If DOWN_B=0 then                    ' Down button
        If TargetTemp > 7500 then           ' Not lower than -25 C. (10000-MinTemp * 100)
         TargetTemp=TargetTemp-25           ' Decrease temperuture with 0.25 C.
        EndIf
       EndIf
       If UP_B=0 then                    ' Up button
        If TargetTemp < 17500 then          ' Not higher than 75 C. (10000+MaxTemp * 100)
         TargetTemp=TargetTemp+25           ' Increase temperature with 0.25 C.
        EndIf
       EndIf
       GoSub SetTargetTemp                  ' Display TargetTemp and delay 0.25 Sec.
      EndIf
    EndIf

    If Mode=1 then                         ' Set Hysteresis                         
      LcdOut $FE, $80, "Hysteresys:     "   ' Show function
       Sign= " "                              ' No sign
      V= 10000+Hyst                         ' Set value for V
      Gosub DisplayTemp                     ' Display Hysteresis
      If (UP_B=0) Or (DOWN_B=0) then    ' Up or down button pushed
       Sign= " "                             ' No sign for Hysteresis
       If DOWN_B=0 then                    ' Down button
        If Hyst > 10 then Hyst=Hyst-10      ' Not less than 0.1 C.
       EndIf
       If UP_B=0 then                    ' Up button
        If Hyst < 1000 then Hyst=Hyst+10    ' Not more than 10.0 C.
       EndIf
       V= 10000+Hyst                        ' Set value for V
       Gosub DisplayTemp                    ' Display Hysteresis
       Pause 250                            ' Delay 0.25 Sec.
      EndIf
    EndIf

    if Mode > 0 then Mainloop              ' Setting TargetTemperature or Hysteresis

     goto mainloop                         ' Check again
    '-------------------------------------------------------------------------------



    ' SUBROUTINES:
    '----------------------------------------
    SelectSign:
    If v = 10000 then                      ' Temperature = 0 C.
      Sign=" "             ' No sign
    Else
      If v < 10000 then                 ' <> 0
       Sign="-"            ' Temperature below 0 C.   
      Else
       Sign="+"            ' Temperature above 0 C.
      EndIf
    EndIf
    Return
    '----------------------------------------
    DisplayTemp:
     If V >= 10000 then                     ' Above 0 C.     
      Temperature=V-10000                   
     Else                                   
      Temperature=10000-V                   ' Below 0 C.
     EndIf
     LcdOut $FE, $C0, Sign, DEC (Temperature / 100), ".", DEC2 Temperature, " ",223,"C "
    Return
    '-----------------------------------------
    SetTargetTemp:
    V=TargetTemp
    Gosub SelectSign
    Gosub DisplayTemp
    Pause 250
    Return