phil99
 Guru
 Joined: 11/02/2018 Location: AustraliaPosts: 3256 |
| Posted: 06:13am 31 May 2026 |
Copy link to clipboard |
 Print this post |
|
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 |
phil99
 Guru
 Joined: 11/02/2018 Location: AustraliaPosts: 3256 |
| Posted: 10:56pm 31 May 2026 |
Copy link to clipboard |
 Print this post |
|
More experimenting with the nongenuine DS18B20.
It's conversion time is much faster than for the genuine unit. It does high res 1/16° conversions in less than 34mS. With the temperature changing rapidly it really does get new values that fast.
It's accuracy, however appears to be a little less, almost 1° high compared to a genuine unit and a pair of AHT10s.
Edit.
> 'Non-genuine DS18B20 > t2=timer:OneWire WRITE 9,1,2,204,68:t=timer:do:OneWire READ 9,4,1,d:loop until d :? timer-t,timer-t2 33.237 35.562 > ' So about 2.3mS to start conversion and 33.3mS to carry it out. >'genuine DS18B20 > t2=timer:OneWire WRITE 10,1,2,204,68:t=timer:do:OneWire READ 10,4,1,d:loop until d:?timer-t,timer-t2 479.366 481.694 > Edited 2026-06-01 11:09 by phil99 |