After ordering the cheapest (wrist-type) blood pressure monitor I could find online (around 10$) to see how it performs in comparison to a “regular one”, I got a nice surprise.
I’ve hooked up a logic analyzer to as many testpoints on its PCB as possible and found out that it has a UART interface on board!! How convenient is that?
This ABP hack has proven to be quite impractical after all, although many people have shown interest in this this project and contacted me as it’s quite useful to have access to your blood pressure data and almost no open source blood pressure monitor projects exist.
A sequence of bytes is sent from testpoint “P6” which turns out to be UART TXD @9600 baud 8N1. You can hook up ANY microcontroller to that and harvest the data easily. After a measurement is complete and successful, the device keeps sending the same byte sequence over and over again until powerdown.
This sequence is the one you see on the pictures: 255 – 254 – 008 – x – x – 0 – Syst. RR low byte – Syst. RR high byte – Diast. RR – heart rate. As you can see the last 4 bytes of the frame is our desired data. For the systolic pressure we seem to require 2 bytes because 255 is apparently not enough. Sad but true 🙂 , then comes the diastolic pressure and finally the heart rate. The frame starts with 3 fixed bytes (255, 254 and 008 in decimal), followed by 2 variable bytes (haven’t figured out what those are for yet) and a zero byte followed by the data.
Throughout the measurement process itself constantly pressure data is streamed via UART. Each data packet begins with a ‘254’ (DEC) byte followed by one “cuff pressure” byte and one byte that represents the pulse oscillation. Here’s what the data of one measuring cycle looks like if plotted over time:
2 JST connectors were inserted into the enclosure. The 3 pin one gives you access to GND, the ON/OFF/START button to remotely trigger the device (just has to be pulled to GND) and finally to the TXD pin of the device. The 2 pin one is simply connected to the battery terminals to eliminate the need for batteries and power the thing from an external source.
Just look online for sphyngomanometers of similar appearance if you want to hack one too. This one has “CK” as a logo, but there are models around from different brands that look the same enclosure-wise. The exact model name of this device is “CK-101”
These devices perform reproducible values but you have to make sure to keep your wrist at heart level, as otherwise the values vary extremely. There is also literature that suggests that the wrist-type sphyngomanometers overestimate blood pressure because of distinct anatomical properties of the wrist arteries (https://www.ncbi.nlm.nih.gov/pubmed/15096904).
One application for an automatically triggered wrist sphyngomanometer I can think of is automated sleep measurement because during sleep your wrist is roughly at heart level anyway.
15 thoughts on “Better Blood Pressure Monitor Hack”
I tried to make this project but I can’t harvest the data you have showed. I have connected my USB to UART converter to P6 but still no data was seen.
I am using FTDI 232RL
make sure you have a correct GND connection between FTDI board and the BPM PCB GND, also make sure TXD and RXD are not swapped, the correct port is opened on your PC and the baud rate is set to 9600 baud, 8 data bits, no parity, 1 stop bit…
I’ve tried more than one of these things and all of them spit out data.
Thanks kauz! Works like a charm! I’m now figuring out how can I interface this BP hack to my Arduino project. 😀 Thanks a lot!
You’re welcome! If you need some inspiration regarding Arduino code, you can consult this project: https://github.com/BigCorvus/Physio
Hello Andrew what pin of the BPM did you connect to RX and TX of the FTDI232RL? 😀
Could you show me how can i present its reading in serial monitor via arduino UNO? I have a project in school but I don’t know how. Thanks in advance.
Take a look at this project: https://github.com/BigCorvus/Physio there the code for extracting the important data from the CK101 is completely implemented. You might want to delete the parts you don’t use such as ECG, pulse oximetry etc… It’s for Teensy 3.2 but you can port it to the UNO by using the Software serial library.
Thanks for your reply. Very much appreciated Sir!
I am the Community Manager for a fall prevention challenge, you might want to take a look and see if you think it is a good fit for your device.
Thanks for posting. I think this thing would have to be adapted for fall prevention because it might be too uncomfortable to wear 24/7 and compliance would probably be too low. One has to do a thorough literature review what the leading causes and patrameters for falls of the elderly are and whether we can come up with unobtrusive ways of measuring these parameters. But your site is really interesting!
Could you please send me more detailed information about the hardware and software that you used
Thanks for posting this!! I’ve connected this BP monitor to Raspberry pi 3 and uts working! But I ahve some problms with data analysis: mu data looks like this, for example: \xbc\x0Xe or \xaa\x0fv
I simply cant understand how I suppose to analyze x0xe or x0fv.
can you help me with that?
Hi, thanks for sharing this info!!
I have a problem retracting this data to Raspberry Pi 3.
this is the data that i get : \xbc\x0hS
x0hS is non readable data, can you help me with that?
This is a very interesting project and I have set out to do it already. I already bought CK-101 and bluetooth module. I could not get the other components from the store. I own an Arduino too and write Android and Arduino programs quite well. I am looking at building this just for interview reasons maybe this could be the Ahaa you know. Thanks for this
Here is my problem, the connection arent really detailed for me to go on with the project, I need help. Are there other things I need to buy to harvest the CK-101 data? Can you point to a resource that might help me with making the connection. I need this asap, I have an interview in two weeks.
Please help, I really need this
Thanks for your tremendous work on the wrist BP machine. I am able to receive the data from BP machine. Sometimes, I am getting values as below:
syst_BP: – 125 , diast_BP: 80 , HR_BP: 98
Actual display on the screen is
syst_BP: 134, diast_BP: 80 , HR_BP: 98
I have tried taking for ten times, I have received all ten values are negative only.
What would be the reason here. Can you please help me in this regard.
Thank you in advance.