Panic Button using XinaBox, micro:bit and Ubidots
Learn how to create a Panic button, that will send text message directly to your mobile phone when pushed.
XinaBox produces a range of 70+ modular xChips, which includes cores/CPUs, sensors, power, communication, output, and storage, using a connectivity standard without wires, soldering, breadboards or hardware knowledge
The xChip CW01(ESP82666 Core) is a Wi-Fi module, that enables its users to send/receive data to/from cloud anywhere.
This xChip BM01 is designed to interface with the micro:bit single board computer. This provides an interface to support the XinaBox xChips ecosystem, adding support for many additional sensors etc.
The BBC micro:bit (MB) is a handheld, programmable micro-computer that can be used for all sorts ofcool creations, from robots to musical instruments – the possibilities are endless.
By the end of this guide you will be able to build a “Panic button” device. The device consists of a central gateway MB and multiple clientMBs. Client MBs has two buttons a Red and Green. Whenever, any button is pressed on client MB, it then sends message to gateway MB over Bluetooth. The gateway then sends text message to the specified mobile number using Ubidots.
The Red button is used to send text message, whenever a user feels Panic. The user is required to press the Green button within an hour to indicate OK situation, otherwise if not pressed, text message is sent to the mobile phone that something may be wrong.
- 1x BM01 - micro:bit Bridge
- 1x CW01 – Wi-Fi Core (ESP8266/ESP-12F)
- 1x IP01 - USB Programming Interface (FT232R)
- 1x XC10 - 10-Pack xBus Connectors
- 2x micro:bit (at-least)
- (Optional) Foam board
- (Optional) Color paper
- (Optional) Hot-glue gun
- Flashing Firmware
- Hardware Setup
- (Optional) Adding foam buttons to the original buttons
- Integrating Ubidots SMS/Email Event
1. Flashing Firmware
- Flash CW01.bin Firmware to CW01 using XinaBox Uploader
- Flash MBClient., py to Client micro:bit
- Flash MBGateway.py to Gateway micro:bit
2. Hardware Setup
Connect micro:bit, CW01, BM01 and IP01 together using the XC10 xBus connectors. You may connect it as shown in the diagram below. Please see this guide on how to assemble xChips generally.
Then connect IP01 to PC or Power bank to provide enough power to work.
After the gateway is Powered On the gateway should display "Tick mark" 3 times consecutively, indicating that the gateway is connected to Ubidots, otherwise if crossed is diplay even for once, the gateway should be restarted to reconnect to Ubidots.
3. (Optional) Adding foam buttons to the original buttons
1. Cut the foam board into appropriate button size and shape
2. Paste color paper of required color onto the cut foam pieces
Attach each foam piece to the micro:bit client’s button:
Attach battery pack of 2x AAA size to the MB. Click any of the button to create device on Ubidots.
When you press the button the client MB displays button's alphabet and the gateway MB displays a Happy face.
4. Integrating Ubidots SMS/Email Event
1. Go to Ubidots Event. Select your Device 'PANIC', Variable 'help'. Select value form drop-down and set it to "1":
IMPORTANT NOTE: Ubidots charges 20 credits per event, while Email is charged 1 credit per event.
2. Enter your Phone number/Email address. Enter the message to be sent:
Press the red button, the message is received within few seconds.
In this project we have built a “Panic button” device with XinaBox and micro:bit. The device sends text message to the mobile phone when a Red button is pressed, calling for help. The project is useful for patients, especially for those who are patient of mild Alzheimer's disease.
from microbit import * import radio radio.on() radio.config(length=64, queue=8, channel=11, power=6) # NOTE: radio settings are identical to those in the MBclient.py code uart.init(baudrate=9600, bits=8, parity=None, stop=1, tx=pin20, rx=pin19) # NOTE: gets the uart (serial / USB) port on the micro:bit ready to communicate with the CW01 numberOfClassroomMicrobits = 10 def sendMessageToCW01(parm): display.clear() uart.write(parm) sleep(500) data = uart.readline() while(data is None): data = uart.readline() if(len(str(data)) >0): uartMessageID = getIntegerFromString(data[:1]) if(uartMessageID == 1): display.show(Image.YES) # NOTE: a tick is displayed when data is being transmitted correctly to the CW01 else: display.show(Image.NO) # NOTE: this means that a cross is displayed when an attempt to send data fails sleep(500) def processRadioSignal(radioSignal, numberOfClassroomMicrobits): # NOTE: a 'valid' signal looks like this "0_a" or this "11_b" if(len(str(radioSignal)) < 3): return False # NOTE: valid radio signals are at least 3 or more characters long locationOfUnderscore = getLocationOfUnderscore(radioSignal) if(locationOfUnderscore == -1): return False # NOTE: valid radio signals contain an underscore currentMicrobitID = getIntegerFromString(radioSignal[0:locationOfUnderscore]) if(currentMicrobitID < 0): return False # NOTE: valid radio messages begin with an integer starting at 0. if(currentMicrobitID >= numberOfClassroomMicrobits): return False # NOTE: IDs should go from 0 to (numberOfClassroomMicrobits - 1) # NOTE: If we've reached this point of the code the radioSignal has passed all our validation checks. It is 'safe' to process it. return sendValidMessageToCW01(radioSignal, locationOfUnderscore, currentMicrobitID) def sendValidMessageToCW01(radioSignal, locationOfUnderscore, currentMicrobitID): messageType = str(radioSignal[locationOfUnderscore +1 : locationOfUnderscore +2]) # NOTE: you could experiment with sending new types of data from the classroom microbit - how about temperature ("0_c_25") if(messageType == "a"): sendMessageToCW01("+4@PANIC@help@1$") sleep(500) sendMessageToCW01("+4@PANIC@help@0$") return True if(messageType == "b"): sendMessageToCW01("+4@PANIC@ok@1$") sleep(500) sendMessageToCW01("+4@PANIC@ok@0$") return True return False def getLocationOfUnderscore(radioSignal): # NOTE: The underscore can only be in 1 of 2 places in the string, so KISS: radioSignalStr = str(radioSignal) if(radioSignalStr[1:2] == "_"): return 1 if(radioSignalStr[2:3] == "_"): return 2 return -1 def getIntegerFromString(uncheckedString): try: return int(uncheckedString) except ValueError: return -1 # INIT: display.show(Image.SQUARE) # NOTE: the square is shown on your micro:bit while it is connecting to Ubidots sleep(2000) uart.write("$") # NOTE: Cleans out the serial buffer sleep(100) uart.write("+9@?$") # NOTE: Reboots the CW01 sleep(5000) # NOTE: long delay is necessary - we need to give Wi-Fi time to sort itself out. uart.write("$") # NOTE: Clean out Serial buffer, again. sleep(500) sendMessageToCW01("+1@SSID@SSID-PASSWORD$") # EDIT GUIDELINES: you MUST enter the name and password of the Wi-Fi network you are trying to connect to in the line above. sendMessageToCW01("+2@UBIDOTS-TOKEN@?$") # EDIT GUIDELINES: you MUST enter the DEFAULT TOKEN from Ubidots in the line above. sendMessageToCW01("+email@example.com@1883$") # NOTE: above line tells the micro;bit where to send the data to - its a Ubidots URL. while True: if(processRadioSignal(radio.receive(), numberOfClassroomMicrobits)): display.show(Image.HAPPY) sleep(100) else: display.show(Image.SAD) sleep(100)
from microbit import* import radio radio.on() radio.config(length=64, queue=8, channel=11, power=6) # NOTE - radio settings are identical to those in the gatewayMicrobit.py code thisMicrobitID = 0 # EDIT GUIDELINES: remember to name each classroom microbit with a unique integer. Start from 0 and count upwards. while True: display.show(str(thisMicrobitID)) if(button_a.was_pressed()): radio.send(str(thisMicrobitID) + "_a") display.show("a") sleep(500) if(button_b.was_pressed()): radio.send(str(thisMicrobitID) + "_b") display.show("b") sleep(500)