Home
JAQForum Ver 24.01
Log In or Join  
Active Topics
Local Time 03:14 02 Jun 2026 Privacy Policy
Jump to

Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.

Forum Index : Microcontroller and PC projects : tempr not working

     Page 4 of 4    
Author Message
Peter63
Senior Member

Joined: 28/07/2017
Location: Sweden
Posts: 194
Posted: 05:35am 30 May 2026
Copy link to clipboard 
Print this post

Jepp  
 
Bryan1

Guru

Joined: 22/02/2006
Location: Australia
Posts: 2047
Posted: 05:47am 30 May 2026
Copy link to clipboard 
Print this post

Well I decided to setup my 2040 Zero with that ili9488 now it's free and gave this DS1820 code a go, now I was having no luck so went back to the start of this thread and saw Tempr(GP9,500) was the fix to get the DS1820 working.

Now when I run the code.

50
Temp = 680°C
50
Temp = 680°C
50
Temp = 680°C
50
Temp = 680°C
50
Temp = 680°C
50
Temp = 680°C
50
Temp = 680°C
50
Temp = 680°C
50
Temp = 154°C
50
Temp = 154°C
50
Temp = 154°C
50
> ? tempr (Gp9, 500)
19.25
>


Nothing changed in the code just copied it and pasted into MMEdit. Anyway the good thing the DS1820 looks to be working
 
phil99

Guru

Joined: 11/02/2018
Location: Australia
Posts: 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
 
Bryan1

Guru

Joined: 22/02/2006
Location: Australia
Posts: 2047
Posted: 07:00am 31 May 2026
Copy link to clipboard 
Print this post

Thanks for that Phil   just tried it

Temp = 85°C
50
Temp = 85°C
50
Temp = 85°C
50
Temp = 85°C
50
Temp = 85°C
50
Temp = 85°C
50
Temp = 85°C
50
Temp = 85°C
50
Temp = 18.1°C
50
Temp = 18.1°C
50
Temp = 18.1°C
50
Temp = 18.1°C
50
Temp = 18.1°C
50


I did get these sealed can temp sensors about 15-16 years ago so they may be DS1820's  that need the delay for it to work.

Anyway it is time to make a new thread with my project for the temp sensor.

Regards Bryan
 
phil99

Guru

Joined: 11/02/2018
Location: Australia
Posts: 3256
Posted: 12:32pm 31 May 2026
Copy link to clipboard 
Print this post

Have been puzzled by your output only showing "50" between reads. Each 50 is 50mS so you should get something like this.
50 100 150 200 250 300 350 400 450 500
Temp = 19.2`C
50 100 150 200 250 300 350 400 450 500
Temp = 19.3`C

Then when I tried a non-genuine DS18B20 I got the same as you. Further investigation showed it says it has completed the temperature conversion in 33mS.
But it hasn't actually finished so the data you get is from a previous read.
That is why you got a string of 85°C readings, then the correct temp.

For these non-genuine units you are better off using the MMBasic TEMPR START GPxx,3 before the TEMPR(GPxx) function. The ",3" gives maximum resolution and ensures TEMPR(GPxx) waits long enough before reading.

The example above shows TEMPR(GPxx) immediately following TEMPR START but it doesn't need to. You can put other code between to make use of the 600mS or so it takes to do a conversion.
Edited 2026-06-01 08:00 by phil99
 
phil99

Guru

Joined: 11/02/2018
Location: Australia
Posts: 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
 
     Page 4 of 4    
Print this page


To reply to this topic, you need to log in.

The Back Shed's forum code is written, and hosted, in Australia.
© JAQ Software 2026