tempr not working


Author Message
phil99

Guru

Joined: 11/02/2018
Location: Australia
Posts: 3321
Posted: 06:13am 31 May 2026      

Ok, so if you don't know which DS18x20 you have these two functions should work with any, including slow ones.
In the first one you can optionally set the Conversion Time in mS.
Usage:-
Print DS18x20ct(mm.info(pinno GPxx)) ' the default Conversion Time is 750mS
or
Print DS18x20ct(mm.info(pinno GPxx, mS_delay) '1000mS should cover most.

The second doesn't need it as it checks if the conversion is finished before reading. If not finished it returns to the main loop.
After reading it starts a new conversion, whish happens in the background as it returns to the main loop.
Usage:-
Print DS18x20(mm.info(pinno GPxx))

Function DS18x20ct(PinNbr As INTEGER, Delay As INTEGER) As FLOAT
' derived from DS18x20 test code by TassyJim
  Local INTEGER  T1,T2,T3,CpC,F
  OneWire WRITE PinNbr,1,1,&h33 'read "family" ROM code
  OneWire READ PinNbr,0,1,F ':Print F, "16=DS1820/DS18S20, 32=DS18S22, 40=DS18B20",
  OneWire RESET PinNbr                       ' reset before command
  OneWire WRITE PinNbr, 8, 2, &hCC, &h44     ' start conversion, adjust for slow units
  If Delay < 10 then Delay = 750             ' maximum normal conversion time
  Pause Delay                                
  OneWire RESET PinNbr                       ' reset before command
  OneWire WRITE PinNbr, 1, 2, &hCC, &hBE     ' command read data
  OneWire READ PinNbr, 0, 8, T1,T2,T3,T3,T3,T3,T3,CpC  'get the data
  'process the data
  If F=16 Then DS18x20ct = Str2bin(int16,Chr$(T1)+Chr$(T2))\2  -0.25 + (CpC-T3)/CpC
  If F=40 or F=34 Then DS18x20ct = Str2bin(int16,Chr$(T1)+Chr$(T2))/16
End Function


PinNbr = MM.Info(pinno GP7)
Dim DStemp = DS18x20(PinNbr) 'purge old data and start new conversion
Dim integer n

Do    'Main Loop
  t = timer
  Print n;
  DStemp = DS18x20(PinNbr) 'get Temp, if ready
  If DStemp <> 1000 Then
    Print
    Print "Temp =";DStemp;"`C"
  n = 0
  EndIf
  Do : Loop until Timer > 49.9
  inc n,50
Loop

Function DS18x20(PinNbr As INTEGER) As FLOAT
' Adapted from DS18x20 test code by TassyJim
  Local INTEGER  done, T1, T2, T3, CpC, F
  DS18x20 = 1000                           ' standard error code
  OneWire READ PinNbr, 4, 1, done          ' is conversion finished?
  If done = 0 Then Exit Function           ' if not return to program
  'Get the data
  OneWire WRITE PinNbr,1,1,&h33 'read "family" ROM code
  OneWire READ PinNbr,0,1,F ':Print F; " 16=DS1820/DS18S20, 32=DS18S22, 40=DS18B20",
  OneWire RESET PinNbr                     ' reset before command
  OneWire WRITE PinNbr, 1, 2, &hCC, &hBE   ' command read data
  OneWire READ PinNbr, 0, 8, T1,T2,T3,T3,T3,T3,T3,CpC  ' get the data
  ' process the data
  If F=16 Then Value = Str2bin(int16,Chr$(T1)+Chr$(T2))\2  -0.25 + (CpC-T3)/CpC
  If F=40 or F=34 Then Value = Str2bin(int16,Chr$(T1)+Chr$(T2))/16
  DS18x20 = Cint(Value * 10) / 10 'round to 1/10ths

  'Start conversion, ready for next read
  OneWire RESET PinNbr                      ' reset before command
  OneWire WRITE PinNbr, 8, 2, &hCC, &h44    ' start conversion
End Function
End