Final Project: Chill buddy



How to wear it: red pad on right wrist, green on left, yellow on your foot, and an accelerometer attached to your shirt.

When it comes to exercises like pilates and yoga that requires constant attention to breathing and posture, which can be hard for people to follow while exercising.

The other key part of these types of exercises is that the user should have a good balance of the reflection of their state and maintaining the focus on their body. To assist them, they should be able to know how they are breathing and how they are holding up the posture, yet also they should not be interfered from being zen.

Therefore, I came up with a device that assists people with both breathing and posture.

The main problem with designing a device for this was that it has to be light and intimate to the body. If it is too heavy, it is uneasy for the user to focus on inner peace. If the user has to carry/hold on to the device, that would hinder the user from holding up a posture.

Component diagram:

The device consists of three parts: an ECG sensor, a LED neopixel, and an accelerometer. The neopixel lights up in an ideal breathing tempo, and the ECG sensor monitors your heartbeat and your breathing.

The ECG sensor solved the problem of the lightness and closeness to the body. The ECG sensor comes with three attachable pads. They are light and thin, which made it easier for me as a user to focus on myself.

Explanation video:

Demo video:

default state; inhale according to the tempo of LED neopixel
default state; exhale according to the tempo of LED neopixel
when the heartbeat rises, the light changes to pink and tells you to calm down.
when the back is not straight, the LCD tells you to straighten your back.



#include <Wire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(13, 12, 5, 4, 3, 2);

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>

#define PIN 8
#define NUMPIXELS 8

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int delayval = 500; // delay for half a second
int zpin = A1;

void setup() {
// initialize the serial communication:

pinMode(10, INPUT); // Setup for leads off detection LO +
pinMode(11, INPUT); // Setup for leads off detection LO -
pinMode(zpin, INPUT);

void loop() {

for(int i=0;i<NUMPIXELS;i++){

// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, pixels.Color(0,150,0)); //green; // This sends the updated pixel color to the hardware.

delay(delayval); // Delay for a period of time (in milliseconds).

lcd.print("INHALE ");
// lcd.print(" ");


for(int k=NUMPIXELS;k>0;k--){

pixels.setPixelColor(k, pixels.Color(0,0,0));;


lcd.print("EXHALE ");

if (analogRead(A0)>700){
for(int i=0;i<NUMPIXELS;i++){

pixels.setPixelColor(i, pixels.Color(235,64,52));;


lcd.print("CALM DOWN ");


for(int k=NUMPIXELS;k>0;k--){

pixels.setPixelColor(k, pixels.Color(235,64,52));;


lcd.print("CALM DOWN ");


lcd.print("BACK STRAIGHT");

if((digitalRead(10) == 1)||(digitalRead(11) == 1)){
// send the value of analog input 0:
//Wait for a bit to keep serial data from saturating



Junior in Art, trying to minor in physical computing.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.