HeartWave (Final Documentation)

HeartWave visualizes your pulse, turning heartbeats into waves.

One or two people can activate HeartWave. To begin, users hold their hands against sensors on the side of the tank. Each heartbeat briefly powers a magnet, pulling a fin and generating a wave. This simple interaction quickly becomes mesmerizing as ripples emanate, override, clash and dissipate. Variations in liquid and lighting allow for a range of unique HeartWave experiences.

The HeartWave team includes Engin Ayaz, Tak Cheung and Doug Kanter. Our assignment was to produce a media controller for our Intro to Physical Computing class at ITP. Design, coding and construction was both painstaking and fun. After a week of brainstorming, we defined our product and began three weeks of production.

This post documents construction and testing as well as lessons learned along the way. We do not cover details of our first prototype, which are well documented here. For additional information on the construction process, see Tak’s blog entry.

The two essential components for this project were the Polar heartbeat sensor and the electromagnet.

Polar board


This is a full component list for the final design:



  • 2 x Electromagnet ($25 each w/ discount)
  • 2 x TIP120 transistors ($1.60 each)
  • 2 x small metal pieces for magnet attraction (free)
  • 2 x black flourescent lights ($17 each)
  • 2 x soft white LED strips, 18″ ($ 9 each)


Circuit Diagram

Box Construction & Lighting
Here are documentation photos from the build:

This slideshow requires JavaScript.

Lessons Learned

Buying Sensors: We began by trying to build our own pulse oximeters to sense each heart beat. After two frustrating weeks, we were still getting inconsistent and noisy readings (detailed here). We certainly gained a lot of good experience with circuits and hardware. But in the end, this new found knowledge did not translate into good input data. Our input problem was holding up progress on the rest of project. Fortunately, ITP Chair Dan O’Sullivan rescued us with an off-the-shelf Polar heart rate circuit board. Unlike our homemade devices, which gave us analog information, the Polar solution registered pulse in digital form. Since our output was going to be digital anyway, this was a simpler and more effective solution. With the input side sorted, and we could attend to other parts of the project.

Lesson learned: You need to keep perspective on getting the whole project built. If one aspect of the build is not working, you need to consider other solutions to keep things moving forward.

Virtual Model before Physical Model: From past experience, we have learned that it saves time and money to first iterate and modify in the world of bits before moving on atoms. This HeartWave project proves this point. We developed a reasonably detailed SketchUp model for the tank and made multiple design decisions based on that model. It was great for determining all the technical and aesthetic issues throughout the rest of the physical build. It allowed us to determine how to cut the majority of the components (minus the bottom plexi layer and the fins).  Even so, using SketchUp we failed to consider later details including where to hide the Arduinos, place the lights and put a label for the project.

Lesson learned: The devil is in the details. Taking an hour to think through the final presentation can save you many hours later.

Dimensions:  We used a laser cutter for most of the large plexi sheets that form the box. Our tank design was too big for ITP’s laser cutter, so we had to use the one at Canal Plastics. They did a great job, though not at a bargain price. If we had kept our design within the constraints of ITP’s laser cutter, we could have saved money.

Lesson learned: Ambitious designs are expensive.

Laser Cutter > Craftsmanship: There is really no reason to go with manual cutting for most parts. The time saved and higher quality of laser cutter parts beyond compare.

Lesson learned: We could have saved even more time cutting the fins and small plexi components using the laser cutter.

12V != 5V (or how to fry an expensive chip): Pay attention when you are using multiple power sources! I mistakenly wired the Polar board with 12V, which fried the chip ($70 loss!).

Lesson learned: Create a system to distinguish power lines of varying voltages.

Future Work / Wishlist

  • Lighting: The Polar board takes 8 seconds to capture and report your heartbeat. A lighting effect could improve the experience by letting the user see that a countdown has begun after they touch the sensor.
  • Interaction: Thinking through all the assumptions of the users is key. What may seem intuitive to you might not be intuitive for others. For this project, subtle explanations for the user could allow them to understand what the device does and where to put their hands.
  • Code: Refine the code (see comments in Arduino section below).
  • Two lighting setups: Create two scenarios, playing with shifting light from below/above, the associated ripple shadow and the mirror effect.

Reference Projects / Inspirations
We found several projects that deal with heartbeat, though none incorporated water as a design element. In this way, it was nice to explore uncharted territory.

Arduino Code 
We went through dozens of code variations for the original pulse oximeter (analog), Polar board (digital) and an if-all-else-fails fake heartbeat generator using RandomWalk (analog).  In the end, we went with the following relatively simple code. In future iterations, it would be nice to replace the delay() function with AttachInterrupt(), add more functionality for lighting and sound output, and perhaps add start/reset buttons.

const int polarTouch_Pin = 2;
int polarTouch = 0;

const int magnet_Pin = 9;

const int led_Pin = 8;

const int LED_Array = 5;
int brightness_high = 255;

// the duration between the high and low pulse for the magnet
const int magnetMoveDelay = 150;

void setup(){
  pinMode(polarTouch_Pin, INPUT);
  pinMode(magnet_Pin, OUTPUT);
  pinMode(led_Pin, OUTPUT);
  pinMode(LED_Array, OUTPUT);
  analogWrite(LED_Array, brightness_high);

void loop(){
  //digitalWrite(LED_Array, HIGH);
   polarTouch = digitalRead(polarTouch_Pin);

    digitalWrite(magnet_Pin, HIGH);  // send current to the magnet
    digitalWrite(magnet_Pin, LOW);
    digitalWrite(led_Pin, HIGH);
    digitalWrite(magnet_Pin, LOW);
    digitalWrite(led_Pin, LOW);


  1. Pingback: HeartWave : Visualiser les battements de votre coeur avec des vagues | Semageek
  2. Pingback: HeartWave Converts Your Pulse into Water Ripples | dev.SquareCows.com
  3. Pingback: 하트웨이브(HeartWave), 심장 박동을 물결의 흔들림으로 바꾸다 | Make: Korea
  4. Isabelle

    I would like to know what did you use for touch handle (what are those “touch sensors” on the diagram and how they connect to the Polar chip?) and were can I buy the Polar heartbeat sensor? I’m working on a similar project and it would really help me.
    Thank you!