Hacking Touch Screens to Count Pulses

Heart rate sensors available for DIY use employ photoplethysmography which illuminates the skin and measures changes in light absorption. These sensors are cheap, however, the circuitry required to interface them to other devices is not. [Petteri Hyvärinen] is successfully investigating the use of capacitive touchscreens for heart rate sensing among other applications.

The capacitive sensor layer on modern-day devices has a grid of elements to detect touch. Typically there is an interfacing IC that translates the detected touches into filtered digital numbers that can be used by higher level applications. [optisimon] first figured out a way to obtain the raw data from a touch screen. [Petteri Hyvärinen] takes the next step by using a Python script to detect time variations in the data obtained. The refresh rate of the FT5x06 interface is adequate and the data is sent via an Arduino in 35-second chunks to the PC over a UART. The variations in the signal are very small, however, by averaging and then using the autocorrelation function, the signal was positively identified as a pulse.

A number of applications could benefit from this technique if the result can be replicated on other devices. Older devices could possibly be recycled to become low-cost medical equipment at a fraction of the cost. There is also the IoT side of things where the heart-rate response to media such as news, social media and videos could be used to classify content.

Check out our take on the original hack for capacitive touch imaging as well as using a piezoelectric sensor for the same application.

5 thoughts on “Hacking Touch Screens to Count Pulses

  1. I like this sort of hack, where somebody peels back a few technology layers from a commodity solution and then branches off the functionality in another direction.

    1. The app does not use the capacitive touch screen to derive any physiologic parameters. It is basically using the light and camera on the back of the phone to detect subtle blood flow changes in the capillary of your finger during systole and diastole to derive your pulse. BP is not really measured but derived by taking into account the amplitude, variability, and waveform morphology of the pulsations. This data is converted into a weighted data series which can then undergo further processing such as Fourier analysis to produce a signature which is then compared to a list of known signatures with correlated BP measurements to derive an estimated blood pressure (essentially a look up table). The main crutch of this method is that the look up table for which it compares the user’s signature to must be well implemented (large number of samples, population similar to user, etc) or else it will fail. Accuracy varies widely of course.

      Other novel methods (non-invasive) to derive blood pressure have their own set of problems. Example would be the pulse wave transient time method which is sound in theory until they apply it to real subjects with pathology (diabetes, vascular disease, and heart disease) in which case it becomes inaccurate. Kind of a downer though since blood pressure measurement is very important especially for this patient population.

      In the instance that it did use the capacitive touch screen for something I used a capacitive stylus pen and it gave me the same results as if I held the screen so the screen doesn’t really do anything.

      1. @toby

        I’ve been wondering how BP was done by those apps….

        Do you have a link to some reference on how to write code to do this

        e.g. What do you mean by

        “This data is converted into a weighted data series”


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s