Introduction: Breathing Sensor: Pneumograph Strelnikov-Stepanova

Breath as a form of interaction

Breathing can be used for a simple and intuitive biofeedback based interactive system. Our breathing rhythm effects our nervous system and can be indicative of affective experiences. Breathing regulation exercises are used to mitigate anxiety and panic attacks, as well as for a practice of mindful awareness by paying attention to our body. Breathing, while often happening without our explicit awareness, can be fairly easily controlled consciously thus granting it a unique place in interactive bioresponsive systems. Indeed, breath-responsive systems allow for more a direct interaction than biofeedback based on heartrate, EEG or galvanic skin response.

Types of breathing / respiration sensors

There are many different approaches used for measuring breathing, with some sensors capturing an airflow from mouths or nostrils, some measuring oxygen concentration in blood (as in smartwatches) and sometimes also head movement (e.g. as in Muse 2), and some capturing the expansion of chest or diaphragm. The expansion-based sensors allow to not only capture exhales and inhales, but also record the specific breathing pattern and encourage a particular type of breathing, for example a deep diaphragmic breathing. This allows for a richer and more precise interaction that can be used to teach a specific breathing technique valuable, for example, for yogic or mediation-based practice or singing.

The expansion based sensors can also use different mechanisms for detecting the expansion. There are some approaches based on radar technologies as well as attempts to use cameras such as Kinect to detect breathing from a distance without any wearables. While these approaches have a strong benefit of being least obtrusive for user experience, they require very well controlled conditions and a prone to error and noise. The large majority of respiration sensors are designed to be placed on the user's body, around their chest or diagphragm. The most common mechanism is using a stretch sensor (e.g. using a conductive material). For example this DIY friendly approach is described in this instructable or is also used in a commercial product by Thought Technologies. Another approach uses a movement sensor such as an accelerometer e.g. as in Spire Stone or as in Breeze prototype. Similar to stretch sensor, there are sensors that measure expansion through displacement inside sensor, e.g. PZT sensors as in Bioplux.

Evaluation of the existing sensors

While the most common approach uses stretch sensors, the main practical difficulty of their use comes from the effectiveness of contraction of the sensor on exhale, which is especially challenging when using a knitted sensor as there is a lot of friction that can emerge between the wool and the clothes that a user is wearing. Moreover, the contraction can be unequally distributed through different parts of the sensor due to the different tensions in the knitted belt, thus introducing delay and noise into the data. These sensors also require calibration before each use as the data as dependent on placement and tightness of the sensor and has to be normalized.

PZT sensor avoid calibration problem as they only capture the change in displacement, thus they are in some sense self-calibrating. When the PZT sensor is placed and the program is initialized the signal starts from zero and would return to zero whenever there is no change of displacement. However, PZT sensors are very sensitive to placement on a user's body as described in this paper on JeL system. For example. sometimes the expansion of the diaphragm can move the whole sensor forward and back without introducing a bent and causing displacement. This happens especially often when you are fitting the sensor on users with a large circumference of diaphragm or abdomen and when using a stretchy-belt for connecting the sensor, which could accomodate the full expansion. PZT sensors also are difficult to use when hoping to detect a shallow breathing, as they require perfect tightness, that's not too loose for the breathing action to effect the bent on the sensor, but also not too tight so that the expansion indeed results in the bent in the sensor instead of going around the belt, as the sensor itself doesn't have any elasticity. Because PZT sensors capture only the change in bent of the sensors, these sensors are not able to record pauses in breathing, as sensor value will return to 0 when there is no movement applied. Depending on a use case this may become an important issue.

Moreover, commercial respiration sensors can cost hundreds of dollars, and are often still challenging to use and do not guarantee clean data. Thus, in this instructable I am presenting you alow-cost pressure-based breathing sensor created with Arduino - Pneumograph Strelnikov-Stepanova. This sensor was designed by my phenomenal grandfather, Valeriy Strelnikov, and I am using it in my PhD research on bio-responsive immersive interactive systems. The sensor described in this instructable is designed to be used by two individuals to measure the level of breathing synchrony between them. However, this sensor can also be used for single or multi-user applications with additional sensors.

I want to note that this Strelnikov-Stepanova breathing sensor while overcoming some of the problems I have experienced with other sensor designs, still suffers from some general challenges typical of respiration sensors, that I am outlining below. The main advantage of this sensor is that it is very low cost comparing to most commercial alternative, while having a good level of sensitivity to capture a variety of breathing types on variety of body types with a fairly clean resulting data.

Challenges of breathing sensors

As any physiological sensor, breathings sensors, including this one, are sensitive to movement, as the pressure placed on the sensor can happen not only from the expansion of the diaphragm but also from a change in the position of a user. Thus, in general breathing sensors are most reliable when the user remains still, or nearly still. Another challenge can come from different breathing types of users, as some users may be breathing more with their chest, while others may rely more heavily on the diaphragm - thus a different user may require different placement of the sensor. Also, baggy clothes may result in folds and wrinkles that may change the way the pressure gets applied on the sensor from the expansion.

Applications for this sensor

The sensor can be placed like a belt around user's diaphragm, abdoment or chest (as shown on the picture), depending on individuals breathing type and what type of breathing you want to capture or encourage in your application. You can place multiple belts on one user for a more complex interaction and most precise data. When the user is inhaling, their diaphragm expands, which applies pressure onto the sensor's tube. These changes in pressure are captured by the pressure gauge and recorded through Arduino. This allows to record inhales-exhales, and measure breathing rate and amplitude of the user, creating a sensitive and intuitive interaction, for example such as this one:

This sensor is fairly forgiving to placement, as it can capture even small changes in pressure with high sensitivity. Similar to stretch sensors it requires calibration, and for the best results it may need to be recalibrated throughout the interaction, especially if the user is moving or changes the position of the sensor, as the signal recorded is the value of current air pressure in the tube of the sensor.


Arduino UNO x1

Air tube with sole D10mm 30cm.

Corrugated rubber tube D10mm. x1

Latex connecting tube 4.2 / 1.8mm. x2m

Plugs D10mm. + X4

Plastic case 80x80x30mm. X1

Differential pressure gauge MPXV7002DP

Step 1: Assembly of the Physical Sensor

The first step is to create the main sensor part - the elastic tube with air that would be placed on user's diaphragm and detect the change in pressure applied by diaphragm expansion. This can be achieved through various materials. Here, for a pneumatic signal sensor, we used a 30cm cut off of a rubber tube such as ones used as a car rubber gasket. The tube is sealed at the ends with plugs. One of the plugs contains a smaller (4.2 mm diameter) transition tube. Another yellow latex connecting tube (1.8mm diameter) is fitted tightly inside the transition tube and and ran up to the pressure sensor on Arduino. This way the air contained inside the rubber tube is connected through two narrow sealed tubes to the analog differential pressure sensor.

The working volume in our prototype is 23.4 cm^3. A rigid tape 30 mm wide is glued to the sole of the tube and used to connect a rope (or a different material) to form a belt that can be placed around user's diaphragm.

Step 2: Wire and Connect Arduino

The connecting latex tube is then attached to the differential pressure sensor, for example such as this one. The sensor is then connected to the Arduino Uno board. It's important that all tubes are fitting tightly not to loose any air pressure.

The Arduino board is placed in a plastic box and the sensors glued on the outside of the box for convenience of use .

The assembly of the device is not difficult. With proper connection of all nodes and reliable sealing of the pneumatic elements of the connections, the device does not require additional adjustment. However, when fitting the pneumosensors on a person’s chest, it is necessary to adhere to the following rules:

  • the sensor must be held and deformed freely during a person’s respiratory movements in the entire range (visually controlled). The tension of the fixing cord is about 150 g.
  • It is advisable to avoid soft and thick clothes that limit the freedom of deformation of the sensor, dampen respiratory movements and reduce sensitivity.

Step 3: Load the Program Onto the Arduino

void setup ( ){
   Serial.begin(9600);  //Define the serial port
void loop() {  
   Serial.print (analogRead (A0)); //print signal from the first breahting sensor
   Serial.print (","); // add delimiter for plotting two signals
   Serial.println (analogRead (A1)); //print signal from the second breahting sensor
   delay (50);

Here is a most basic bare-bones program you can use in the Arduino editor to test the data you are receiving from the breathing sensor. This data will be printed into your Serial Monitor or can be visualized with a Serial Plotter. In this example we have two breathing sensors attached to the Arduino board, hence we are reading input from A0 and A1.

Now, that the signal is capture through a serial input, you can read it from Unity 3D or another program related to your application, to create a breath-responsive interaction!

Step 4: The Sensor in Use

A user puts on the belt around their chest or diaphragm. The sensor is comfortably pressed against user's body. When the user inhales, their chest of diaphragm expands leading to the tube's deforming in the transverse direction, its working volume changes and, accordingly, the pressure in the tube changes. This change in pressure is captures by the gauge and recorded through Arduino. On exhale, the tube restores its shape due to its own rubber elasticity. It's best to tighten the sensor on a full exhale, but otherwise it will still settle in a working position under its own weight.

You can place the sensor on different areas depending on your goal and individual breathing type. For most people and purposes placing the sensor around the diaphragm would work best, but you can experiment with placing the sensor around chest or abdomen as shown on the pictures.

The sensor tests showed satisfactory and reproducible results on a number of test subjects.

Good luck exploring breath-based interactions and let me know your thoughts and how it worked out for you!

Here is an overview video of some possible applications of the sensor

Breathing Sensor Applications Overview