Turning on LEDs remotely with xbee
DavidNyman
Posts: 52
I've got a project where I need to turn on or off three LEDs in another room. I've downloaded the circuits from Parallax Simple_Byte_Rx.BS2 and Simple_Byte_Tx.bS2 and got them up and running with two Xbee S1 radios. I can turn on the LED just as the program is designed to do. Here's my problem:
I'm not versed well enough with xbees yet to have much luck modifying the code. At first it looked like simple cut and paste to add a few LEDs, but I learned very quickly it wasn't that easy.
On the base (Tx), I have three normally open momentary pushbuttons tied to PIN 0, PIN 1, PIN 2. The inputs are pulled low with a 2.2k resistor to ground and the switches are tied to +5 effectively bring the input high when the button is pressed, otherwise the circuit is wired just as the program shows.
The remote (Rx), has three LEDs, Red, Yellow and Green tied to PIN 0, PIN 1 and PIN 2 through 220 ohm resistors. The rest of the circuit is wired just as the program for the receiver shows.
On the receiver, the buzzer isn't needed and I haven't included it on my breadboard mockups.
Can anyone help me add control over two more LEDs?
Here's the initial programs as downloaded from Parallax:
' ***********************************************
' Simple_Byte_Tx.bs2
' Sends the state of pushbutton every 250mSec
' ***********************************************
' {$STAMP BS2}
' {$PBASIC 2.5}
#SELECT $STAMP
#CASE BS2, BS2E, BS2PE
T9600 CON 84
#CASE BS2SX, BS2P
T9600 CON 240
#CASE BS2PX
T9600 CON 396
#ENDSELECT
' ***************** Variables, Constants and Pins
Baud CON T9600 ' Set baud rate
Rx CON 15 ' XBee DOUT
Tx CON 14 ' XBee DIN
PB PIN 0 ' Pushbutton
State VAR Bit
' ***************** Main Loop
DO
State = PB ' Read pushbutton
SEROUT Tx, Baud,[State] ' Send pushbutton value as byte
PAUSE 250 ' short delay
LOOP
' ***************************************************
' Simple_Byte_Rx.bs2
' Receives byte value (0/1) to control LED and buzzer
' ***************************************************
' {$STAMP BS2}
' {$PBASIC 2.5}
#SELECT $STAMP
#CASE BS2, BS2E, BS2PE
T9600 CON 84
#CASE BS2SX, BS2P
T9600 CON 240
#CASE BS2PX
T9600 CON 396
#ENDSELECT
' ***************** Variables, Constants and Pins
Baud CON T9600 ' Set Baud rate
Rx CON 15 ' XBee DOUT
Tx CON 14 ' XBee DIN
State VAR Bit
Led PIN 0
Buzzer PIN 5
' ***************** Main Loop
DO
SERIN Rx, Baud, [State] ' Wait for byte and accept
IF State = 1 THEN ' Based on value,
HIGH LED ' if 1, Turn on LED
FREQOUT Buzzer,200,3000 ' Sound buzzer
ELSE
LOW LED ' if 0, turn off LED
ENDIF
LOOP
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' ***********************************************
' Simple_Byte_Tx.bs2
' Sends the state of pushbutton every 250mSec
' ***********************************************
' {$STAMP BS2}
' {$PBASIC 2.5}
#SELECT $STAMP
#CASE BS2, BS2E, BS2PE
T9600 CON 84
#CASE BS2SX, BS2P
T9600 CON 240
#CASE BS2PX
T9600 CON 396
#ENDSELECT
' ***************** Variables, Constants and Pins
Baud CON T9600 ' Set baud rate
Rx CON 15 ' XBee DOUT
Tx CON 14 ' XBee DIN
PB PIN 0 ' Pushbutton
State VAR Bit
' ***************** Main Loop
DO
State = PB ' Read pushbutton
SEROUT Tx, Baud,[State] ' Send pushbutton value as byte
PAUSE 250 ' short delay
LOOP
I'm not versed well enough with xbees yet to have much luck modifying the code. At first it looked like simple cut and paste to add a few LEDs, but I learned very quickly it wasn't that easy.
On the base (Tx), I have three normally open momentary pushbuttons tied to PIN 0, PIN 1, PIN 2. The inputs are pulled low with a 2.2k resistor to ground and the switches are tied to +5 effectively bring the input high when the button is pressed, otherwise the circuit is wired just as the program shows.
The remote (Rx), has three LEDs, Red, Yellow and Green tied to PIN 0, PIN 1 and PIN 2 through 220 ohm resistors. The rest of the circuit is wired just as the program for the receiver shows.
On the receiver, the buzzer isn't needed and I haven't included it on my breadboard mockups.
Can anyone help me add control over two more LEDs?
Here's the initial programs as downloaded from Parallax:
' ***********************************************
' Simple_Byte_Tx.bs2
' Sends the state of pushbutton every 250mSec
' ***********************************************
' {$STAMP BS2}
' {$PBASIC 2.5}
#SELECT $STAMP
#CASE BS2, BS2E, BS2PE
T9600 CON 84
#CASE BS2SX, BS2P
T9600 CON 240
#CASE BS2PX
T9600 CON 396
#ENDSELECT
' ***************** Variables, Constants and Pins
Baud CON T9600 ' Set baud rate
Rx CON 15 ' XBee DOUT
Tx CON 14 ' XBee DIN
PB PIN 0 ' Pushbutton
State VAR Bit
' ***************** Main Loop
DO
State = PB ' Read pushbutton
SEROUT Tx, Baud,[State] ' Send pushbutton value as byte
PAUSE 250 ' short delay
LOOP
' ***************************************************
' Simple_Byte_Rx.bs2
' Receives byte value (0/1) to control LED and buzzer
' ***************************************************
' {$STAMP BS2}
' {$PBASIC 2.5}
#SELECT $STAMP
#CASE BS2, BS2E, BS2PE
T9600 CON 84
#CASE BS2SX, BS2P
T9600 CON 240
#CASE BS2PX
T9600 CON 396
#ENDSELECT
' ***************** Variables, Constants and Pins
Baud CON T9600 ' Set Baud rate
Rx CON 15 ' XBee DOUT
Tx CON 14 ' XBee DIN
State VAR Bit
Led PIN 0
Buzzer PIN 5
' ***************** Main Loop
DO
SERIN Rx, Baud, [State] ' Wait for byte and accept
IF State = 1 THEN ' Based on value,
HIGH LED ' if 1, Turn on LED
FREQOUT Buzzer,200,3000 ' Sound buzzer
ELSE
LOW LED ' if 0, turn off LED
ENDIF
LOOP
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' ***********************************************
' Simple_Byte_Tx.bs2
' Sends the state of pushbutton every 250mSec
' ***********************************************
' {$STAMP BS2}
' {$PBASIC 2.5}
#SELECT $STAMP
#CASE BS2, BS2E, BS2PE
T9600 CON 84
#CASE BS2SX, BS2P
T9600 CON 240
#CASE BS2PX
T9600 CON 396
#ENDSELECT
' ***************** Variables, Constants and Pins
Baud CON T9600 ' Set baud rate
Rx CON 15 ' XBee DOUT
Tx CON 14 ' XBee DIN
PB PIN 0 ' Pushbutton
State VAR Bit
' ***************** Main Loop
DO
State = PB ' Read pushbutton
SEROUT Tx, Baud,[State] ' Send pushbutton value as byte
PAUSE 250 ' short delay
LOOP
Comments
I've seen this Subject languish for several hours with nary a response.
If nobody gets around to it in the next few days then I'll jump in.
Here's where I'm at currently:
' ******************************************************
' Manual_Polling_Base.bs2
' This program:
' - Configures XBee for fast AT Command Mode
' - Using DEBUG Window, User can control Remote
' - R-RedLED, Y-YellowLED and G-GreenLED.
' - Address changed to a constant.
' - Accepts an acknowledgement value
' - Requires 802.15.4 XBee (Series 1)
' ******************************************************
' {$STAMP BS2}
' {$PBASIC 2.5}
#SELECT $STAMP
#CASE BS2, BS2E, BS2PE
T9600 CON 84
#CASE BS2SX, BS2P
T9600 CON 240
#CASE BS2PX
T9600 CON 396
#ENDSELECT
' ***************** Variables, Constants and Pins
Green_button PIN 0
Red_button PIN 1
Yellow_button PIN 2
Baud CON T9600 ' Set Baud rate
Rx PIN 15 ' XBee DOUT
Tx PIN 14 ' XBee DIN
DataOut VAR Word ' Frequency to send
DL_Addr CON $2 ' Destination address for data
DataIn VAR Byte ' General variable for data
Light VAR Word ' Returned light level
' ***************** Configure XBee in AT Command Mode
PAUSE 500
DEBUG CLS,"Configuring XBee..."
PAUSE 3000 ' Guard time
SEROUT Tx,Baud,["+++"] ' Command Mode Sequence
PAUSE 2000 ' Guard time
SEROUT Tx,Baud,["ATGT 3,MY 0",CR] ' Set low guard time and Base address
SEROUT TX,Baud,["ATCN",CR] ' Exit Command Mode
' ***************** Main Loop
DO
GOSUB Config_XBee ' Set DL address of XBee
DEBUG CR,"Choose Action:",CR,
"R - Red LED",CR,
"G - Green LED",CR,
"Y - Yellow LED",CR,
"? "
DEBUGIN DataIn ' Accept choice
SELECT DataIn ' LED control, get state and send
CASE "G","l"
DEBUG CR,"Enter LED State (0/1):"
DEBUGIN DEC DataOut ' Accept user data
DEBUG "Sending Data!",CR
SEROUT Tx,Baud,["G",CR,CR] ' Send G
SEROUT Tx,Baud,[DEC DataOut,CR,CR] ' Send LED state
GOSUB CheckAck ' Get Acknowledgement
GOTO Done
' LED control, get state and send
CASE "R","l"
DEBUG CR,"Enter LED State (0/1):"
DEBUGIN DEC DataOut ' Accept user data
DEBUG "Sending Data!",CR
SEROUT Tx,Baud,["R",CR,CR] ' Send L
SEROUT Tx,Baud,[DEC DataOut,CR,CR] ' Send LED state
GOSUB CheckAck ' Get Acknowledgement
GOTO Done
' LED control, get state and send
CASE "Y","l"
DEBUG CR,"Enter LED State (0/1):"
DEBUGIN DEC DataOut ' Accept user data
DEBUG "Sending Data!",CR
SEROUT Tx,Baud,["Y",CR,CR] ' Send L
SEROUT Tx,Baud,[DEC DataOut,CR,CR] ' Send LED state
GOSUB CheckAck ' Get Acknowledgement
GOTO Done
ENDSELECT
Timeout:
DEBUG "No data received",CR
Done:
PAUSE 2000
LOOP
Config_XBee:
' Configure XBee for destination node address
PAUSE 10 ' Short guard time
SEROUT Tx,Baud,["+++"] ' Command Mode sequence
PAUSE 10 ' Short guard time
SEROUT TX,Baud,["ATDL ", HEX DL_Addr,CR] ' Set Destination Node Address
SEROUT Tx,Baud,["ATCN",CR] ' Exit Command Mode
RETURN
CheckAck:
SERIN Rx,Baud,1000,CheckTimeout,[DEC dataIn] ' Accept incoming byte
IF dataIn = 1 THEN ' If 1, then ack'd
DEBUG BELL,"OK - Ack Received!",CR
ELSE ' If received, but not "1", problem
DEBUG "Bad Ack!",CR
ENDIF
RETURN
CheckTimeout:
DEBUG "No ack received!",CR ' If nothing recieved
RETURN
' ******************************************************
' Polling_Remote.bs2
' This program accepts a character and values:
' - G & 0 or 1 to control state of LED
' - R & 0 or 1 to control state of LED
' - Y & 0 or 1 to control state of LED
'
' Return acknowledgements or value to Base
'
' Requires 802.15.4 XBee (Series 1)
' ******************************************************
' {$STAMP BS2}
' {$PBASIC 2.5}
#SELECT $STAMP
#CASE BS2, BS2E, BS2PE
T9600 CON 84
#CASE BS2SX, BS2P
T9600 CON 240
#CASE BS2PX
T9600 CON 396
#ENDSELECT
'****************** Variable, Constants and Pins
Baud CON T9600
GLED PIN 7
YLed PIN 6
RLED PIN 5
'Servo PIN 12
Rx PIN 15 ' XBee DOUT
Tx PIN 14 ' XBee DIN
RTS PIN 11 ' XBee RTS
Freq VAR Word ' Received frequency for buzzer
GState VAR Bit ' Received state of green LED
RState VAR Bit ' Received state FOR red LED
YState VAR Bit ' Received state for yellow LED
DataIn VAR Byte ' General byte data
Light VAR Word ' Measured light level
Position VAR Word ' Received servo position
My_Addr CON $2 ' Set address of node, modify as desired, $1-$FFFE
' ***************** Configure XBee to use RTS and set Address
Position = 750
PAUSE 500
DEBUG CLS,"Configuring XBee...",CR
PAUSE 3000 ' Guard time
SEROUT Tx,Baud,["+++"] ' Command Mode Sequence
PAUSE 2000 ' Guard time
SEROUT Tx,Baud,["ATD6 1",CR] ' Enable RTS
SEROUT Tx,Baud,["ATMY ", HEX My_Addr,CR] ' Set node address
SEROUT Tx,Baud,["ATDL 0,CN",CR] ' Set destination address of Base
' & Exit Command Mode
' ***************** Main Loop
DO
GOSUB AcceptData
GOSUB Control
LOOP
AcceptData:
SERIN Rx\RTS,Baud,10,Timeout,[DataIn] ' Accept byte
SELECT DataIn
CASE "G" ' G to control Green LED
SERIN Rx\RTS,Baud,1000,Timeout,[DEC GState] ' Accept LED state
PAUSE 200 ' Give Base time to set up
SEROUT Tx,Baud,[CR,DEC 1,CR] ' Return acknowledgment
CASE "R" ' R to control Red LED
SERIN Rx\RTS,Baud,1000,Timeout,[DEC RState] ' Accept buzzer frequency
PAUSE 200 ' Give Base time to set up
SEROUT Tx,Baud,[CR,DEC 1,CR] ' Return acknowledgment
CASE "Y" ' Y to control Yellow LED
SERIN Rx\RTS,Baud,1000,Timeout,[DEC YState]' Accept position
PAUSE 200
SEROUT Tx,Baud,[CR,DEC 1,CR] ' Return acknowledgment
ENDSELECT
Timeout:
RETURN
Control:
IF GState = 1 THEN ' Control LED based on state
HIGH GLED
ELSE
LOW GLED
ENDIF
IF YState = 1 THEN ' Control Buzzer based on Freq
HIGH YLed
ELSE
LOW YLed
PAUSE 100
ENDIF
IF RState = 1 THEN ' Control Buzzer based on Freq
HIGH RLed
ELSE
LOW RLed
PAUSE 100
ENDIF
RETURN
In PBASIC there are several variables that control the input and output of the BS2. IN0, IN1, and IN2 tell you what the input states of Pins 0, 1, and 2 are. INA tells that states of Pin 0-3, so you only need the line State = INA. There are similar variables for output as well. The BS2 pins start out as inputs so you would need change pins to outputs and this is done using the DIR variable. DIRA = %0111 will change Pin 0, 1, and 2 to output. Then you could add the line OUTA = State.
Look up DIR, IN, and OUT in the Basic Stamp Manual.
http://www.parallax.com/downloads/basic-stamp-manual
That should get you started. You should write a simple test program though to test each of your switches and LEDs so you know they work before you start modifying programs.
DEBUG ? IN0 ' Print the value of Pin 0 on the screen
High 0 ' Turn on LED
PAUSE 500 ' Wait for 1/2 second
Low 0 ' Turn off LED
Good Luck!
Time for the happy dance.
Thanks very much for the help.
Here's how it turned out:
' ******************************************************
' Desktop transmitter.bs2
' 14 Sept 2014
' This program:
' - Configures XBee for fast AT Command Mode
' - Using DEBUG Window, User can control Remote
' - R-RedLED, Y-YellowLED and G-GreenLED.
' - Address changed to a constant.
' - Accepts an acknowledgement value
' - Requires 802.15.4 XBee (Series 1)
' ******************************************************
' {$STAMP BS2}
' {$PBASIC 2.5}
' ***************** Variables, Constants and Pins
T9600 CON 84
Green_button PIN 0
Red_button PIN 1
Yellow_button PIN 2
Baud CON T9600 ' Set Baud rate
Rx PIN 15 ' XBee DOUT
Tx PIN 14 ' XBee DIN
DataOut VAR Word ' Frequency to send
DL_Addr CON $2 ' Destination address for data
DataIn VAR Byte ' General variable for data
' ***************** Configure XBee in AT Command Mode
PAUSE 500
DEBUG CLS,"Configuring XBee..."
PAUSE 3000 ' Guard time
SEROUT Tx,Baud,["+++"] ' Command Mode Sequence
PAUSE 2000 ' Guard time
SEROUT Tx,Baud,["ATGT 3,MY 0",CR] ' Set low guard time and Base address
SEROUT TX,Baud,["ATCN",CR] ' Exit Command Mode
' ***************** Main Loop***********************************
GOSUB Config_XBee ' Set DL address of XBee
DO
IF IN0 = 1 THEN GOSUB Green_Push_Button ELSE GOSUB Green_Off
IF IN1 = 1 THEN GOSUB Yellow_Push_Button ELSE GOSUB Yellow_Off
IF IN2 = 1 THEN GOSUB Red_Push_Button ELSE GOSUB Red_Off
LOOP
'*******************Subroutines*********************************
Green_Off:
DataOut = 0
SEROUT Tx,Baud,["G",CR,CR] ' Send G
SEROUT Tx,Baud,[DEC DataOut,CR,CR] ' Send LED state
GOSUB CheckAck ' Get Acknowledgement
PAUSE 200
RETURN
Green_Push_Button:
DataOut = 1
SEROUT Tx,Baud,["G",CR,CR] ' Send G
SEROUT Tx,Baud,[DEC DataOut,CR,CR] ' Send LED state
GOSUB CheckAck ' Get Acknowledgement
PAUSE 200
RETURN
Red_Off:
DataOut = 0
SEROUT Tx,Baud,["R",CR,CR] ' Send R
SEROUT Tx,Baud,[DEC DataOut,CR,CR] ' Send LED state
GOSUB CheckAck ' Get Acknowledgement
PAUSE 200
RETURN
Red_Push_Button:
DataOut = 1
SEROUT Tx,Baud,["R",CR,CR] ' Send R
SEROUT Tx,Baud,[DEC DataOut,CR,CR] ' Send LED state
GOSUB CheckAck ' Get Acknowledgement
RETURN
Yellow_Off:
DataOut = 0
SEROUT Tx,Baud,["Y",CR,CR] ' Send Y
SEROUT Tx,Baud,[DEC DataOut,CR,CR] ' Send LED state
GOSUB CheckAck ' Get Acknowledgement
PAUSE 200
RETURN
Yellow_Push_Button:
DataOut = 1
SEROUT Tx,Baud,["Y",CR,CR] ' Send Y
SEROUT Tx,Baud,[DEC DataOut,CR,CR] ' Send LED state
GOSUB CheckAck ' Get Acknowledgement
RETURN
Timeout:
DEBUG "No data received",CR
Config_XBee:
' Configure XBee for destination node address
PAUSE 10 ' Short guard time
SEROUT Tx,Baud,["+++"] ' Command Mode sequence
PAUSE 10 ' Short guard time
SEROUT TX,Baud,["ATDL ", HEX DL_Addr,CR] ' Set Destination Node Address
SEROUT Tx,Baud,["ATCN",CR] ' Exit Command Mode
RETURN
CheckAck:
SERIN Rx,Baud,1000,CheckTimeout,[DEC dataIn] ' Accept incoming byte
IF dataIn = 1 THEN ' If 1, then ack'd
DEBUG BELL,"OK - Ack Received!",CR
ELSE ' If received, but not "1", problem
DEBUG "Bad Ack!",CR
ENDIF
RETURN
CheckTimeout:
DEBUG "No ack received!",CR ' If nothing recieved
RETURN
' ******************************************************
' Wall Light.bs2
' 14 Sept 2014
' This program accepts a character and values:
' - G & 0 or 1 to control state of LED
' - R & 0 or 1 to control state of LED
' - Y & 0 or 1 to control state of LED
' Return acknowledgements or value to Base
' Requires 802.15.4 XBee (Series 1)
' ******************************************************
' {$STAMP BS2}
' {$PBASIC 2.5}
'****************** Variable, Constants and Pins
T9600 CON 84
Baud CON T9600
GLED PIN 7
YLed PIN 6
RLED PIN 5
Rx PIN 15 ' XBee DOUT
Tx PIN 14 ' XBee DIN
RTS PIN 11 ' XBee RTS
GState VAR Bit ' Received state of green LED
RState VAR Bit ' Received state FOR red LED
YState VAR Bit ' Received state for yellow LED
DataIn VAR Byte ' General byte data
My_Addr CON $2 ' Set address of node, modify as desired, $1-$FFFE
' ***************** Configure XBee to use RTS and set Address
DEBUG CLS,"Configuring XBee...",CR
PAUSE 3000 ' Guard time
SEROUT Tx,Baud,["+++"] ' Command Mode Sequence
PAUSE 2000 ' Guard time
SEROUT Tx,Baud,["ATD6 1",CR] ' Enable RTS
SEROUT Tx,Baud,["ATMY ", HEX My_Addr,CR] ' Set node address
SEROUT Tx,Baud,["ATDL 0,CN",CR] ' Set destination address of Base
' & Exit Command Mode
' ***************** Main Loop
DO
GOSUB AcceptData
GOSUB Control
LOOP
AcceptData:
SERIN Rx\RTS,Baud,10,Timeout,[DataIn] ' Accept byte
SELECT DataIn
CASE "G" ' G to control Green LED
SERIN Rx\RTS,Baud,1000,Timeout,[DEC GState] ' Accept Green LED state
PAUSE 200 ' Give Base time to set up
SEROUT Tx,Baud,[CR,DEC 1,CR] ' Return acknowledgment
CASE "R" ' R to control Red LED state
SERIN Rx\RTS,Baud,1000,Timeout,[DEC RState] ' Accept Red LED state
PAUSE 200 ' Give Base time to set up
SEROUT Tx,Baud,[CR,DEC 1,CR] ' Return acknowledgment
CASE "Y" ' Y to control Yellow LED
SERIN Rx\RTS,Baud,1000,Timeout,[DEC YState] ' Accept Yellow LED state
PAUSE 200
SEROUT Tx,Baud,[CR,DEC 1,CR] ' Return acknowledgment
ENDSELECT
Timeout:
RETURN
Control:
IF GState = 1 THEN ' Control Green LED based on state
HIGH GLED
LOW YLed
LOW RLed
ENDIF
IF YState = 1 THEN ' Control Yellow LED based on state
HIGH YLed
LOW GLed
LOW RLed
ENDIF
IF RState = 1 THEN ' Control Red LED based on state
HIGH RLed
LOW GLed
LOW YLed
ENDIF
'DEBUG CLS
'DEBUG "GState = ", DEC GState,CR
'DEBUG "YState = ", DEC YState,CR
'DEBUG "RState = ", DEC RState
RETURN
What help?
You did it all, dude.
I guess that you noticed that you needed to come up with a value for "DataOut" when the input was not 1.
(That could be boiled way way down, but as long as you're dancing it's good.)
I've changed the program a little in that now the base unit latches the input from the three buttons. I added three LEDs to the base unit for indication as to which LED is illuminated on the remote. One challenge has been finding yellow LEDs that are somewhat bright. Even the so called super bright yellow don't come close to the red and green ones used in the project for brightness.
I learned a little too late about a hand held controller that was briefly available on Kickstarter. Now that the finished "favor" project is delivered to the new owner I'd like to eventually turn the circuit and program into something like this:
http://quantumri.com/Q4.html
I've emailed this company several times to inquire about purchasing one of these controllers. I never get a response so now it's time to build my own.