RF Communication using BS2sx
I'm currently working on a project that uses the BS2sx to take temperature readings with the Sensirion SHT1x module and relaying that information through RF modules to a home base. Ideally, the home base can support an "indefinate" amount of transmitters.
Code for the reciever, or base unit, is:
Note: Please forgive the disorganized manner.
Also, here is the code (much longer) for the transmitter. It's an adaptation of one of the modules posted on the parallax website:
·The data I'm recieving looks like this:
![debug_screen.JPG](http://www.geocities.com/chaz_br/debug_screen.JPG)
Where "A" is the name for the transmitter. Now values like "T789H472" make sense because it translates to "temperature: 78.9 and humidity: 47.2"... But the other data values like "T32378H65310" make no sense. Any clues?
Code for the reciever, or base unit, is:
' {$STAMP BS2sx} ' {$PBASIC 2.5} x VAR Word y VAR Word tF VAR Word tC VAR Word rhTrue VAR Word rhLin VAR Word name VAR Byte inbyte VAR Byte SerBaud CON 240 + 16384 ' 9600 Baud, 'inverted' SerPort CON 16 MyData VAR Byte MyPin VAR IN4 LED CON 13 name = "A" DO GIVEUP: DEBUG "Preparing... ", name, CR PULSOUT 2, 3000 SEROUT 2, 17405, [noparse][[/noparse]name] DEBUG "Request sent", CR SERIN 0, 17405, 5000, GIVEUP1, [noparse][[/noparse]WAIT(name), x.HIGHBYTE, x.LOWBYTE, y.HIGHBYTE, y.LOWBYTE] PAUSE 200 GOTO CONTINUE GIVEUP1: DEBUG "Gave up once... trying again.", CR DEBUG "Preparing... ", name, CR PULSOUT 2, 3000 SEROUT 2, 17405, [noparse][[/noparse]name] DEBUG "Request sent", CR SERIN 0, 17405, 5000, GIVEUP2, [noparse][[/noparse]WAIT(name), x.HIGHBYTE, x.LOWBYTE, y.HIGHBYTE, y.LOWBYTE] PAUSE 200 CONTINUE: tf = x rhtrue = y DEBUG name SEROUT SerPort, SerBaud, [noparse][[/noparse]"T", DEC tf] ' Output as "0" or "1" PAUSE 500 HIGH 13 SEROUT SerPort, SerBaud, [noparse][[/noparse]"H", DEC rhtrue] ' Output as "0" or "1" PAUSE 500 ' Wait 1000 mSec LOW 13 DEBUG CR GIVEUP2: PAUSE 10000 'name = name + 1 'IF name = 67 THEN ' name = 65 'ENDIF LOOP
Note: Please forgive the disorganized manner.
Also, here is the code (much longer) for the transmitter. It's an adaptation of one of the modules posted on the parallax website:
' ============================================================================== ' {$PBASIC 2.5} ' ' File...... SHT11.BS2 ' Purpose... Interface to Sensirion SHT11 temperature/humidity sensor ' E-mail.... [url=mailto:stamptech@parallax.com]stamptech@parallax.com[/url] ' Date...... 12/30/02 ' ' {$STAMP BS2sx} ' ' ============================================================================== ' ------------------------------------------------------------------------------ ' Program Description ' ------------------------------------------------------------------------------ ' ' This program demonstrates the interface to the Sht1X and displays the raw data ' ------------------------------------------------------------------------------ ' I/O Definitions ' ------------------------------------------------------------------------------ ShtData CON 3 ' bi-directional data Clock CON 1 ' ------------------------------------------------------------------------------ ' Constants ' ------------------------------------------------------------------------------ ShtTemp CON %00011 ' read temperature ShtHumi CON %00101 ' read humidity ShtStatW CON %00110 ' status register write ShtStatR CON %00111 ' status register read ShtReset CON %11110 ' soft reset (wait 11 ms after) Ack CON 0 NoAck CON 1 No CON 0 Yes CON 1 MoveTo CON 2 ' for DEBUG control ClrRt CON 11 ' clear DEBUG line to right DegSym CON 186 ' degrees symbol for DEBUG ' ------------------------------------------------------------------------------ ' Variables ' ------------------------------------------------------------------------------ ioByte VAR Byte ' data from/to SHT1x ackBit VAR Bit ' ack/nak from/to SHT1x toDelay VAR Byte ' timeout delay timer timeOut VAR Bit ' timeout status soT VAR Word ' temp counts from SHT1x soRH VAR Word ' humidity counts from SHT1x rhLin VAR Word ' humidity; linearized rhTrue VAR Word ' humidity; temp compensated status VAR Byte ' SHT1x status byte x VAR Word y VAR Word tF VAR Word tC VAR Word adjTemp VAR Byte adjHumi VAR Byte signTemp VAR Bit signHumi VAR Bit BtnWk VAR Byte txpin CON 7 Baud9600 CON 110 HIGH txpin PAUSE 100 SEROUT txpin, Baud9600, [noparse][[/noparse]17] adjTemp = 0 adjHumi = 0 signTemp = 0 signHumi = 0 ' ------------------------------------------------------------------------------ ' EEPROM Data ' ------------------------------------------------------------------------------ ' ------------------------------------------------------------------------------ ' Initialization ' ------------------------------------------------------------------------------ Initialize: GOSUB SHT_Connection_Reset ' reset device connection PAUSE 250 ' let DEBUG window open ' ------------------------------------------------------------------------------ ' Program Code ' ------------------------------------------------------------------------------ Sensor_Demo: GOSUB SHT_Measure_Temp Main: DEBUG CLS DEBUG "SHT1x Demo", CR DEBUG "----------", CR Main2: GOSUB SHT_Measure_Temp DEBUG MoveTo, 0, 3 DEBUG "Raw Data Temp: " DEBUG DEC soT, ClrRt, CR GOSUB SHT_Measure_Humidity ' DEBUG MoveTo, 0, 7 DEBUG "Raw Data Humidity: " DEBUG DEC soRH, ClrRt, CR x = soT y = soRH BUTTON 15, 0, 1,1, BtnWk, 0, NoPress1 IF signTemp = 0 THEN adjTemp = adjTemp + 1 ELSE IF adjTemp = 1 THEN signTemp = 0 adjTemp = 0 ELSE adjTemp = adjTemp - 1 ENDIF ENDIF GOTO MAIN2 NoPress1: BUTTON 14, 0, 1,1, BtnWk, 0, NoPress2 IF signTemp = 0 THEN IF adjTemp = 0 THEN signTemp = 1 adjTemp = 1 ELSE adjTemp = adjTemp - 1 ENDIF ELSE adjTemp = adjTemp + 1 ENDIF GOTO MAIN2 NoPress2: BUTTON 13, 0, 1,1, BtnWk, 0, NoPress3 IF signHumi = 0 THEN adjHumi = adjHumi + 1 ELSE IF adjHumi = 1 THEN signHumi = 0 adjHumi = 0 ELSE adjHumi = adjHumi - 1 ENDIF ENDIF GOTO MAIN2 NoPress3: BUTTON 12, 0, 1,1, BtnWk, 0, NoPress4 IF signHumi = 0 THEN IF adjHumi = 0 THEN signHumi = 1 adjHumi = 1 ELSE adjHumi = adjHumi - 1 ENDIF ELSE adjHumi = adjHumi + 1 ENDIF GOTO MAIN2 NoPress4: tF = x ** 11796 - 400 tC = x / 10 - 400 'DEBUG CLS, DEC (tF / 10), ".", DEC1 tF, CR rhLin = (y ** 26542) rhLin = rhLin - ((y ** 3468) * (y ** 3468) + 50 / 100) rhLin = rhLin - 40 rhTrue = ((tC / 10 - 25) * (y ** 524 + 1) + (rhLin * 10)) + 5 / 10 'DEBUG DEC (rhTrue / 10), ".", DEC1 rhTrue, CR IF signTemp = 0 THEN tF = tF + adjTemp ELSE tF = tF - adjTemp ENDIF IF signHumi = 0 THEN rhTrue = rhTrue + adjHumi ELSE rhTrue = rhTrue - adjHumi ENDIF DEBUG "Begin waiting...", CR SERIN 9, 17405, [noparse][[/noparse]WAIT("A")] DEBUG "End waiting...", CR PAUSE 300 PULSOUT 5, 3000 SEROUT 5, 17405, [noparse][[/noparse]"A", tF.HIGHBYTE, tF.LOWBYTE, rhTrue.HIGHBYTE, rhTrue.LOWBYTE] HIGH txpin PAUSE 100 SEROUT txpin, Baud9600, [noparse][[/noparse]22] SEROUT txpin, Baud9600, [noparse][[/noparse]17] 'PAUSE 100 'SEROUT txpin, Baud9600, [noparse][[/noparse]"SHOVE IT!"] 'PAUSE 10 SEROUT txpin, Baud9600, [noparse][[/noparse]13] 'PAUSE 10 SEROUT txpin, Baud9600, [noparse][[/noparse]" Temp: ", SDEC (tF / 10), ".", SDEC1 tF, " F"] 'PAUSE 10 SEROUT txpin, Baud9600, [noparse][[/noparse]13] 'PAUSE 10 SEROUT txpin, Baud9600, [noparse][[/noparse]" Humi: ", SDEC (rhTrue / 10), ".", SDEC1 rhTrue, " %"] 'PAUSE 10 SEROUT txpin, Baud9600, [noparse][[/noparse]128] 'PAUSE 100 PAUSE 1000 ' minimum delay between readings GOTO Main2 ' ------------------------------------------------------------------------------ ' Subroutines ' ------------------------------------------------------------------------------ ' connection reset: 9 clock cyles with ShtData high, then start sequence ' SHT_Connection_Reset: SHIFTOUT ShtData, Clock, LSBFIRST, [noparse][[/noparse]$FFF\9] ' SHT_Start: INPUT ShtData ' let pull-up take line high LOW Clock HIGH Clock LOW ShtData LOW Clock HIGH Clock INPUT ShtData LOW Clock RETURN SHT_Measure_Temp: GOSUB SHT_Start ' alert device ioByte = ShtTemp ' temperature command GOSUB SHT_Write_Byte ' send command GOSUB SHT_Wait ' wait until measurement done ackBit = Ack ' another read follows GOSUB SHT_Read_Byte ' get MSB soT.HIGHBYTE = ioByte ackBit = NoAck ' last read GOSUB SHT_Read_Byte ' get LSB soT.LOWBYTE = ioByte ' Note: Conversion factors are multiplied by 10 to return the ' temperature values in tenths of degrees RETURN ' measure humidity ' SHT_Measure_Humidity: GOSUB SHT_Start ' alert device ioByte = ShtHumi ' humidity command GOSUB SHT_Write_Byte ' send command GOSUB SHT_Wait ' wait until measurement done ackBit = Ack ' another read follows GOSUB SHT_Read_Byte ' get MSB soRH.HIGHBYTE = ioByte ackBit = NoAck ' last read GOSUB SHT_Read_Byte ' get LSB soRH.LOWBYTE = ioByte RETURN SHT_Write_Status: GOSUB SHT_Start ' alert device ioByte = ShtStatW ' write to status reg command GOSUB SHT_Write_Byte ' send command ioByte = status GOSUB SHT_Write_Byte RETURN SHT_Read_Status: GOSUB SHT_Start ' alert device ioByte = ShtStatW ' write to status reg command GOSUB SHT_Read_Byte ' send command ackBit = NoAck ' only one byte to read GOSUB SHT_Read_Byte RETURN SHT_Write_Byte: SHIFTOUT ShtData, Clock, MSBFIRST, [noparse][[/noparse]ioByte] ' send byte SHIFTIN ShtData, Clock, LSBPRE, [noparse][[/noparse]ackBit\1] ' get ack bit RETURN SHT_Read_Byte: SHIFTIN ShtData, Clock, MSBPRE, [noparse][[/noparse]ioByte] ' get byte SHIFTOUT ShtData, Clock, LSBFIRST, [noparse][[/noparse]ackBit\1] ' send ack bit INPUT ShtData ' release data line RETURN SHT_Wait: INPUT ShtData ' data line is input FOR toDelay = 1 TO 250 ' give ~1/4 second to finish timeOut = INS.LOWBIT(ShtData) ' scan data line IF (timeOut = No) THEN SHT_Wait_Done ' if low, we're done PAUSE 1 NEXT SHT_Wait_Done: RETURN SHT_Soft_Reset: GOSUB SHT_Connection_Reset ' reset the connection ioByte = ShtReset ' reset command ackBit = NoAck ' only one byte to send GOSUB SHT_Write_Byte ' send it PAUSE 11 ' wait at least 11 ms RETURN
·The data I'm recieving looks like this:
Where "A" is the name for the transmitter. Now values like "T789H472" make sense because it translates to "temperature: 78.9 and humidity: 47.2"... But the other data values like "T32378H65310" make no sense. Any clues?
Comments
·· What transmitters and receivers are you using?· It sounds like what is happening is that multiple transmitters are sending data at the same time and the receiver is getting the extra data mixed in sometimes.· Ideally to have multiple transmitters you would need to set up a polled-system where each unit actually has a transmitter and receiver.· Thebase would send out the address of the first station and only that station would reply.· Then it would poll/query the second station and so on.· In this manner only one system is transmitting at any given time.
Your other option is to use something like the EB500 which is addressable.· That way you could specify the connections by MAC Address.· I hope this helps.· Take care.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Chris Savage
Parallax Tech Support
csavage@parallax.com