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: https://drive.google.com/file/d/1ynT0niDqBbBioUs-JuklcV1FvNpeHiIn/view?usp=sharing
Demo video: https://drive.google.com/file/d/18wtBSU3APmGJdT1yotgQdTB6aySNxs1L/view?usp=sharing
Schematics:
Code:
#include <Wire.h> #include <LiquidCrystal.h> LiquidCrystal lcd(13, 12, 5, 4, 3, 2); #include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #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: Serial.begin(9600); lcd.begin(16,2); pixels.begin();pixels.begin(); 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 pixels.show(); // This sends the updated pixel color to the hardware. delay(delayval); // Delay for a period of time (in milliseconds). lcd.setCursor(0,0); lcd.print("INHALE "); lcd.setCursor(0,2); // lcd.print(" "); } for(int k=NUMPIXELS;k>0;k--){ pixels.setPixelColor(k, pixels.Color(0,0,0)); pixels.show(); delay(delayval); lcd.setCursor(0,0); lcd.print("EXHALE "); } if (analogRead(A0)>700){ for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(235,64,52)); pixels.show(); delay(delayval); lcd.setCursor(0,2); lcd.print("CALM DOWN "); } for(int k=NUMPIXELS;k>0;k--){ pixels.setPixelColor(k, pixels.Color(235,64,52)); pixels.show(); delay(delayval); lcd.setCursor(0,2); lcd.print("CALM DOWN "); } } if(analogRead(zpin)>300){ lcd.setCursor(0,2); lcd.print("BACK STRAIGHT"); } if((digitalRead(10) == 1)||(digitalRead(11) == 1)){ Serial.println('!'); } else{ // send the value of analog input 0: Serial.println(analogRead(A0)); } //Wait for a bit to keep serial data from saturating delay(10); }