shashank t s
Published © GPL3+


A lowcost multi-pressure, multi-speed massager with timer for Joint and muscular pain,

IntermediateFull instructions provided10 hours1,581

Things used in this project

Hardware components

Adafruit BMP180
Mini Air Pump Motor 6V
Solenoid Air Valve 6V
Micro USB Breakout Board(Female)
Pressure cuff
HC-05 Bluetooth Module
HC-05 Bluetooth Module
Arduino Nano R3
Arduino Nano R3

Software apps and online services
Arduino IDE
Arduino IDE

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
Hot glue gun (generic)
Hot glue gun (generic)


Read more

Custom parts and enclosures

BMP 180 sensor housing for pressure monitoring

This was designed using online CAD tool tinkerCAD. STL file was generated and sliced using CURA software and printed on a Creality Ender 3 3D printer

Schematics project file

This file can be imported on site

MenoMassager Schematic




  //Author: Shashank T S
  //Date: 10 May 2020
  // Arduino IDE 1.6.12
  //Code Version 1.0.1


#include <Wire.h> //Wire.h library required for I2C interfacing
#include <Adafruit_BMP085.h> //Adafruit library for interfacing BMP180
#include <ArduinoJson.h>

String incomingData = ""; //Create empty string called incomingData
long pressure_default = 95000; //Default Pressure set in Pascals
int time_def = 0; //flag to control status
long speed_default_on = 2000; //Inflate time
long speed_default_off = 1500; //Deflate time

int time_rec = 0; //Parse and extract time data
int pressure_rec = 0;  //Parse and extract pressure data
int speed_rec = 0;  //Parse and extract speed data

long previousMillis = 0;        // will store last time LED was updated
long interval = 0;
//Define pins on Arduino Nano
const int air_pump = 12; //Pin 12 for connecting Mini Air Pump via ULN2803A driver
const int solenoid = 11; //Pin 11 for connecting solenoid Air valve via ULN2803A driver

Adafruit_BMP085 bmp;

void setup() {
  //Initializing bmp.begin
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BMP180 sensor, check wiring!");
    while (1) {}
  // Set Pin 11 and 12 as OUTPUT
  pinMode(air_pump, OUTPUT);
  pinMode(solenoid, OUTPUT);


void loop() {
  if (Serial.available() > 0) { //When Serial data is avaiable on serial port enter this loop
    incomingData = Serial.readString(); // read the incoming byte:
    Serial.println(incomingData); //Print on serial moniotr(For debugging purpose)

    StaticJsonDocument<200> doc; // 200 is memory capacity in bytes
    DeserializationError error = deserializeJson(doc, incomingData);

    time_rec = doc["Time"]; //Parse and extract time data
    pressure_rec = doc["Pressure"];  //Parse and extract pressure data
    speed_rec = doc["Speed"];  //Parse and extract speed data

    //Print on serial monitor for debugging
    interval = time_rec * 60000; // interval in minutes
    time_def = 1; //Flag that will be checked in each loop and is set when valid data is receieved 
  //Non-Blocking delay
  unsigned long currentMillis = millis();//Deactivates after it elapses the interval set (For example If interval is 5 X 60000--> Then elapses after 5minutes)
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    time_def = 0;
    interval = 0;

  if (time_def > 0) //Enters this loop once activated and till the condition holds good
    //Read pressure data from BM180 sensor and print on Serial Monitor
    Serial.print("Pressure = ");
    Serial.println(" Pa");

    if (bmp.readPressure() > (pressure_default + (pressure_rec * 3000)))
      digitalWrite(air_pump, LOW); //Inflates pressure cuff
      digitalWrite(solenoid, LOW);
      delay(speed_default_on - (speed_rec * 500) ); //500 is multiplying factor(can be tweaked as per requirement)
    digitalWrite(air_pump, HIGH); //Deflates pressure cuff
    digitalWrite(solenoid, HIGH);
    delay(speed_default_off - (speed_rec * 500));  //500 is multiplying factor(can be tweaked as per requirement)


shashank t s

shashank t s

2 projects • 2 followers