DS18B20 Digitale Temperatuur Sensor

De DS18B20 is een temperatuur sensor die digitaal uitgelezen wordt.

Om de te zien hoe dat moet, is het het beste om de DS18B20 Datasheet
eerst door te lezen.

Schema 18F25K22 met DS18B20:



Hieronder is Proton/Amicus18 code geplaatst voor een simpele uitlezing van de DS18B20
Beperkingen van deze code zijn:

Maximaal 1 sensor per I/O poort (geen gebruik van het interne serie nummer)
Geen parasitaire voeding.(voeding vanaf de data lijn)
Alleen 12 bit resolutie (is wat langzamer)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
'***********************************************************************
'*  Name    : 28PIC-DS18B20.BAS                                      *
'*  Author  : Knutselaar.eu                                            *
'*  Date    : 10/12/2013 (1.0)                                         *
'*  Version : 1.1                                                      *
'*          : 23-12-2013 1.1 aangepast voor negatieve temperatuur      *
'*                                                                     *
'*  Notes   : Dit programma schrijft de DS18B20 temperatuur naar een   *
'*            HD44780 compatible display en naar de seriële poort      *
'***********************************************************************
Device 18F25K22

CONFIG_START    
     FOSC = INTIO67
     FCMEN = OFF                         ;Fail-Safe Clock Monitor disabled
     IESO = OFF                  ;internal external switchover mode
     PWRTEN = On             ;power-up timer  (18F25K22)
     BOREN = On                  ;brown-out reset
     BORV = 285                  ;brown-out reset value (2,85V) (18F25K22)
     WDTEN = OFF             ;watchdog timer
     WDTPS = 128             ;1:128 WDT prescalar
     PBADEN = OFF            ;analog port B<4:0>
     STVREN = On             ;stack overflow reset
     LVP = OFF                   ;low voltage programming
     XINST = OFF             ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
     Debug = OFF             ;no debug
CONFIG_END

XTAL = 8

OSCCON = %01100110
TRISA = %11011111
ANSELA = %00000000

Declare LCD_DATAUS 75  ' voor de wat langzamere 16x 2 displays

    Declare HSERIAL_BAUD  = 9600          ;Transmissiesnelheid van de data over de bus
    Declare HSERIAL_RCSTA = %10010000     ;Bit7:Enable serial port / Bit4:Continu ontvangen
    Declare HSERIAL_TXSTA = %00100000     ;Bit5:Transmitpin ingeschakeld (TXEN (Transmit ENable) = 1)
    Declare HSERIAL_CLEAR On

Symbol Convert      = $44     ;One Wire Convert command (zie datasheet DS1820)
Symbol RdScratchPad = $BE     ;One Wire Read ScratchPad command(zie datasheet DS1820)
Symbol SkipROM      = $CC     ;One Wire SkipROM command (zie datasheet DS1820)

Symbol LED         = LATA.5

Dim Temperatuur     As Word
Dim Decimalen       As Byte
Dim NegatieveTemp   As Bit
 
Cls                          
DelayMS 500

Print At 1,1, " Knutselaar.eu  "
Print At 2,1, "                "

Loop:
 
OWrite PORTA.0, 1, [SkipROM, Convert]     ' Zend 'Convert' opdracht (temperatuur meten)
While ORead PORTA.0,4 = 0 : Wend          ' Wacht tot conversie is voltooid...
OWrite PORTA.0, 1, [SkipROM, RdScratchPad]' Zend 'Read ScratchPad' opdracht
ORead  PORTA.0, 2, [Temperatuur.LowByte, Temperatuur.HighByte]'Lees temperatuur en plaats dit in de variabele

NegatieveTemp  = Temperatuur.11 ' Bit 11 van Temperatuur is "1" bij negatieve temperatuur
 
Decimalen = Temperatuur.LowByte << 4 ' Alleen de laatste 4 bits van Temperatuur zijn nodig voor Decimalen
Decimalen = Decimalen >> 4           ' Bits weer op de originele plaats zetten
Decimalen = Decimalen * 6.25         ' Resolutie van de DS18B20 is 0.0625 graden celcius.

If NegatieveTemp = 1 Then
    Temperatuur = 65536 - Temperatuur  'inverteren
    Decimalen = 100 - Decimalen        'inverteren
    Print At 2, 1, "-", Dec (Temperatuur >> 4) , ".", DEC1 Decimalen / 10, 223
    HSerOut ["Temperatuur ", "-",Dec (Temperatuur >> 4) , ".", DEC1 Decimalen / 10  ,13]
    'Door de laatste 4 bits van Temperatuur weg te gooien krijg je de graden Celcius.
Else
    Print At 2, 1, " ", Dec (Temperatuur >> 4) , ".", DEC1 Decimalen / 10, 223
    HSerOut ["Temperatuur ",Dec (Temperatuur >> 4) , ".", DEC1 Decimalen / 10  ,13]
End If
                         
Toggle LED
 
GoTo Loop
 
End

Verschil tussen de DS18B20 en de DS18S20 zie Maxim application note 4377
Meer informatie is te vinden in Maxim application note 162


DS18B20 Digitale Temperatuur Sensor Bestellen

Hieronder nog dezelfde code als boven maar dan voor de DS1820 of DS18S20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
'***********************************************************************
'*  Name    : 28PIC-DS18S20.BAS                                        *
'*  Author  : Knutselaar.eu                                            *
'*  Date    : 23/12/2013 (1.0)                                         *
'*  Version : 1.0                                                      *
'*                                                                     *
'*  Notes   : Dit programma schrijft de DS18S20 temperatuur naar een   *
'*            HD44780 compatible display en naar seriële poort         *
'*  Bron    : http://www.picbasic.nl/electro_ds1820.htm                *
'***********************************************************************
Device 18F25K22

CONFIG_START    
     FOSC = INTIO67
     FCMEN = OFF                 ;Fail-Safe Clock Monitor disabled
     IESO = OFF                  ;internal external switchover mode
     PWRTEN = On                 ;power-up timer  (18F25K22)
     BOREN = On                  ;brown-out reset
     BORV = 285                  ;brown-out reset value (2,85V) (18F25K22)
     WDTEN = OFF                 ;watchdog timer
     WDTPS = 128                 ;1:128 WDT prescalar
     PBADEN = OFF                ;analog port B<4:0>
     STVREN = On                 ;;stack overflow reset
     LVP = OFF                   ;low voltage programming
     XINST = OFF                 ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
     Debug = OFF                 ;no debug
CONFIG_END

XTAL = 8

OSCCON = %01100110
TRISA = %11011111
ANSELA = %00000000

Declare LCD_DATAUS 75  ' voor de wat langzamere 16x 2 displays

    Declare HSERIAL_BAUD  = 9600          ;Transmissiesnelheid van de data over de bus
    Declare HSERIAL_RCSTA = %10010000     ;Bit7:Enable serial port / Bit4:Continu ontvangen
    Declare HSERIAL_TXSTA = %00100000     ;Bit5:Transmitpin ingeschakeld (TXEN (Transmit ENable) = 1)
    Declare HSERIAL_CLEAR On

Symbol Convert      = $44     ;One Wire Convert command (zie datasheet DS1820)
Symbol RdScratchPad = $BE     ;One Wire Read ScratchPad command(zie datasheet DS1820)
Symbol SkipROM      = $CC     ;One Wire SkipROM command (zie datasheet DS1820)

Symbol LED         = LATA.5

Dim Temperatuur     As Word
Dim Slope           As Byte
Dim Remain          As Byte
Dim DB1              As Byte
Dim Decimalen       As Byte
Dim NegatieveTemp   As Bit
 
Cls                          
DelayMS 500

Print At 1,1, " Knutselaar.eu  "
Print At 2,1, "                "

Loop:
 
OWrite PORTA.0, 1, [SkipROM, Convert]     ' Zend 'Convert' opdracht (temperatuur meten)
While ORead PORTA.0,4 = 0 : Wend          ' Wacht tot conversie is voltooid...
OWrite PORTA.0, 1, [SkipROM, RdScratchPad]' Zend 'Read ScratchPad' opdracht
ORead  PORTA.0, 2, [Temperatuur.LowByte, Temperatuur.HighByte, DB1, DB1, DB1, DB1,Remain, Slope]'Lees temperatuur en plaats dit in de variabele

NegatieveTemp  = Temperatuur.8 ' Bit 8 van Temperatuur is "1" bij negatieve temperatuur
Decimalen = ((Slope - Remain) * 100) / Slope
Temperatuur     = Temperatuur * 5

If NegatieveTemp = 1 Then
    Temperatuur = 65536 - Temperatuur  'inverteren
    Decimalen = 100 - Decimalen        'inverteren
    If Decimalen < 51 Then Decimalen = Decimalen + 100
End If

Temperatuur = (((Temperatuur + 550) / 10) * 100) + Decimalen - 5500 ;

Print At 2, 1, Rep "-"\NegatieveTemp, Dec Temperatuur/100 , ".", DEC1 Decimalen / 10, 223, "  "
HSerOut [ "Temperatuur ", Rep "-"\NegatieveTemp, Dec Temperatuur/100 , ".", DEC1 Decimalen / 10  ,13]
                         
Toggle LED
 
GoTo Loop
 
End




Hit Counter by Digits
  Sinds 11 December 2013