Nerd2
05-29-2010, 03:07 AM
I have a SHT temperature sensor attached to my propeller. I have the propeller displaying the Fahrenheit temperature on a TV screen but I need the temperature also to be stored in a variable as a whole number no decimal. This is so I can do several If Then statements. How do I do this?
Sal Ammoniac
05-29-2010, 05:30 AM
Convert it to fixed point. Multiply the original value by 10 or 100 and truncate it down to an integer and store that.
Nerd2
05-29-2010, 06:10 AM
How do I do that?
Here is part of my code
pri currenttemp | rawTemp, rawHumidity, tempC, rh, dewC,msd
rawTemp := f.FFloat(sht.readTemperature)
tempC := celsius(rawTemp)
curtemp :=(fp.FloatToFormat(fahrenheit(tempC), 2, 0))
' curtemp :=(fp.FloatToFormat(fahrenheit(tempC), 5, 1))
str(curtemp)
'Current Temp Slider
if curtemp > 090
gr.box (80,-10,5,12)'(x, y, box_width, box_height)
return
if curtemp > 85
gr.box (65,-10,5,12)'(x, y, box_width, box_height)
return
if curtemp[0] >= 80.0
gr.box (50,-10,5,12)'(x, y, box_width, box_height)
return
if curtemp > 7500
gr.box (35,-10,5,12)'(x, y, box_width, box_height)
return
if curtemp > 7000
gr.box (20,-10,5,12)'(x, y, box_width, box_height)
return
if curtemp > 6500
gr.box (5,-10,5,12)'(x, y, box_width, box_height)
return
if curtemp > 6000
gr.box (-10,-10,5,12)'(x, y, box_width, box_height)
return
if curtemp > 5500
gr.box (-25,-10,5,12)'(x, y, box_width, box_height)
return
if curtemp > 5000
gr.box (-40,-10,5,12)'(x, y, box_width, box_height)
return
if curtemp > 4500
gr.box (-55,-10,5,12)'(x, y, box_width, box_height
return
if curtemp > 4000
gr.box (-70,-10,5,12)'(x, y, box_width, box_height)
return
Sal Ammoniac
05-29-2010, 06:41 AM
Here's my SHT15 code. Perhaps you can extract something useful from it.
'' SHT15 Driver
''
'' Pin assignments (relative to 'Pin' parameter passed to SHT15Init):
''
'' 0 SCK (output)
'' 1 Data (input/output, open drain)
''
''
'' Since the data line on an I2C device (SHT15 is I2C with one minor difference), and the Propeller doesn't
'' have true open drain I/O ports, we fake it as follows: leave the port set to '0' and toggle the state of
'' the direction register (dira). The combinations are:
''
'' dira[datapin] = 0 Input, high-Z, pulled high by pull-up resistor
'' dira[datapin] = 1 Output, pulled low
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
SHT_TEMP = $3 ' read temperature command
SHT_HUMID = $5 ' read humidity command
SHT_PUTSTAT = $6 ' set status register command
SHT_GETSTAT = $7 ' read status register command
CR = 13 ' Carriage Return
VAR
long SCK, DATA
long status
long RH, RHraw, Temperature
long errcnt
long Stack[256]
byte Cog
PUB Start(PinStart) : okay
Stop
okay := (Cog := cognew(SHT15Init(PinStart), @Stack) + 1)
PUB Stop
if Cog
cogstop(Cog~ - 1)
PUB Active : YesNo
YesNo := Cog > 0
PUB SHT15Init(PinStart)
waitcnt(clkfreq/10 + cnt) ' wait 100 msec for SHT15 to initialize
SCK := PinStart ' save starting port pin number as SCK pin
DATA := SCK + 1 ' DATA pin is next port
outa[SCK..DATA]~ ' turn off both ports
dira[SCK..DATA] := %10 ' set port direction bits (SCK output, DATA input)
errcnt~
BusReset ' do a software reset of the sensor's bus
SHT15Loop ' kick off main loop
PUB SHT15Loop | SOrh, SOt, RHlinear, RHtrue, tempC, p
repeat
StartTransmission ' send transmission start sequence
Send(SHT_HUMID) ' send read humidity command
if(!WaitCompletion)
WaitMS(200) ' conversion failed; wait 200msec and try again
errcnt++
quit
SOrh := 0
SOrh := Read16 ' read raw humidity data
StartTransmission ' send transmission start sequence
Send(SHT_TEMP) ' send read temperature command
if(!WaitCompletion)
WaitMS(200) ' conversion failed; wait 200msec and try again
quit
SOt := Read16 ' read raw temperature data
tempC := -3970 + SOt ' in units of °C x 100
RHlinear := -20468 + ((SOrh * 10_000) ** 157_625_300) - (((SOrh * SOrh * 1000) ** 6853) * 10)
RHtrue := (tempC * 100 - 250_000) * (100 + (SOrh * 10_000) ** 343_597) / 10_000 + RHlinear
Temperature := tempC
RH := RHtrue
RHraw := SOrh
WaitMS(500) ' update twice a second
PUB SHT15Temp
result := Temperature
PUB SHT15RH
result := RH
PUB SHT15RHAddr
result := @RH
PUB SHT15RHraw
result := RHraw
PRI SCK_HI
outa[SCK]~~
PRI SCK_LO
outa[SCK]~
PRI Read16 : rword
SCK_LO ' lower SCK
dira[DATA]~ ' set DATA as input
repeat 8
SCK_HI ' raise clock
rword := (rword << 1) | ina[DATA] ' accumulate MSB
SCK_LO ' drop clodk
dira[DATA]~~ ' pull DATA low (ACK)
SCK_HI ' raise clock (DATA will be
' dira[DATA]~ ' release DATA line (will float high)
SCK_LO ' drop clock
dira[DATA]~ ' release DATA line (will float high)
repeat 8
SCK_HI ' raise clock
rword := (rword << 1) | ina[DATA] ' accumulate LCB
SCK_LO ' drop clock
SCK_HI ' raise clock (false ACK to terminate measurement without CRC)
SCK_LO ' lower clock
PRI Read8(ack) : rbyte
SCK_LO ' lower clock
dira[DATA]~ ' set DATA as input
repeat 8
SCK_HI ' raise clock
rbyte := (rbyte << 1) | ina[DATA] ' accumulate data
SCK_LO ' drop clock
if(ACK)
dira[DATA]~~ ' pull DATA low (ACK)
SCK_HI ' raise clock
SCK_LO ' drop clock
dira[DATA]~ ' set DATA back to input
PRI Send(value) : rbyte | tmp
tmp := value >< 8 ' reverse order of bits
repeat 8
if tmp & 1
dira[DATA]~ ' output a '1' by floating pin and allowing pull-up to pull DATA to a '1'
else
dira[DATA]~~ ' pull data low to output a '0'
SCK_HI ' raise clock
SCK_LO ' lower clock
tmp >>= 1 ' shift byte
dira[DATA]~ ' set DATA to input
SCK_HI ' raise clock
rbyte := ina[DATA] ' read DATA line
SCK_LO ' drop clock
' return state of ACK bit
PRI WaitCompletion | i
dira[DATA]~ ' set DATA as input
repeat i from 1 to 255
if(ina[DATA] == 0)
quit ' exit loop if sensor pulls DATA low
WaitMS(10) ' wait 10msec
if(i == 255)
BusReset ' timed out waiting for completion; reset bus
return FALSE ' signal timeout to caller
return TRUE
PRI StartTransmission
dira[DATA]~ ' set DATA as input (hi-Z)
SCK_HI ' raise clock
dira[DATA]~~ ' pull DATA low
SCK_LO ' lower clock
SCK_HI ' raise clock
dira[DATA]~ ' release DATA (hi-Z)
SCK_LO ' lower clock
'' BusReset
''
'' Reset the SHT15's bus by toggle SCK nine times while DATA is high
''
PRI BusReset
dira[DATA]~ ' set DATA line as input (allowing it to be pulled high by pullup resistor
SCK_LO ' set SCK low
repeat 9
SCK_HI ' raise SCK
SCK_LO ' lower SCK
PRI WaitMS(ms)
waitcnt(clkfreq/1000*ms + cnt) ' wait for specifiec number of milliseconds
Nerd2
05-29-2010, 11:44 PM
I guess my problem is I have a string value of 85.0 I need this converted to a decimal value 85.
Ttailspin
05-30-2010, 08:30 AM
Maybe You Might have to "TRUNC" it.
This comes straight from the Prop Manual.
TRUNC ( FloatConstant )
Returns: Integer that is the given floating-point constant value truncated at the decimal point.
•· FloatConstant is the floating-point constant expression to be truncated to an integer.
Explanation
TRUNC is one of three directives (FLOAT, ROUND and TRUNC) used for floating-point constant expressions.
TRUNC returns an integer constant that is the given floating-point constant expression with the fractional portion removed.
I·don't know if this is what you were thinking of, or·is this way off base?
Zap-o
05-30-2010, 11:03 AM
Try using this line
pri currenttemp | rawTemp, rawHumidity, tempC, rh, dewC,msd
rawTemp := f.FFloat(sht.readTemperature)
rawtemp := f.round(rawtemp)
That should bring it to a decimal just remember that you cant use the expression floatotformat after that, at least for this variable
Nerd2
06-01-2010, 12:08 AM
I got it working thanks for all of your help here is my code if anyone wants to use it.
rawTemp := f.FFloat(sht.readTemperature)
tempC := celsius(rawTemp)
curtemp := f.FAdd(f.FMul(tempc, 1.8), 32.0)
curtemp := f.fround(curtemp)