Manufacturer: TANITA http://www.tanita.com/
Cost:$30
Report by Roger TSAI


DESCRIPTION

Body fat monitor is a well developed application, used to measure one's weight and body fat. It often uses a technology called "Bioelectrical Impedance Analysis"(BIA) which measures the impedance to an electrical signal in your body which might be seen as the level of obesity. Actually it shots an non-harmful electron into one side or your body(e.g. your left foot) and receive it from the other side(e.g. your right foot). It measures how much the loss of electron is between the start point and the end, and then translate this number of loss into degree or percentage of body fat degree and show it on the screen.

How to use a body fat monitor: Before using the scale for the first time you enter your age, gender, height. Weight is displayed on the LCD screen and five seconds later your percentage of body fat appears. Usually you will get higher body fat value in the morning than evening because after a sleep the food you consumed at daytime already transform into body fat.

  • Basic function of this body fat monitor:
    1. Measuring weight
    2. Measuring body fat
    3. Two user memory set
    4. Unit: Lb or kg



diagram of Women's Body Fat Standard
diagram of Men's Body Fat Standard
Attach:Mens BodyFat Standard.jpg Δ
http://itp.nyu.edu/physcomp/uploads/Reports/Mens%20BodyFat%20Standard.jpg

THEORY OF OPERATION

The theory of electron loss is a hypothesis that while electron travels through the water found in muscle and fat, the more muscle a person has, the more water their body can hold. The greater the amount of water in a person's body, the easier it is for the current to pass through it. In contrast, the more fat, the more resistance to the current. The factors that go into determining the percentage of body fat include a person's weight, height, age, gender and body type.

WORKING MECHANISM

There are two things it senses: weight and impedance

AVAILABILITY AND PRICING:

The average price range is between $30 ~ $100, depends on extra function and material.
You can buy one in these places:

  • Domestic merchandise, e.g. Bed, Bath, and Beyond
  • Pharmacy, e.g. Duane Read
  • Internet, e.g. eBay, Amazon

EXTENDING APPLICATION

This body fat monitor only shows the number of your body fat percentage, which doesn't really give user a clear idea whether he or she has too much obesity or not. To clarify the level of obesity, I designed a simple animation that clearly indicate one is normal or too thin, or too fat. I use Arduino micro-controller to read the value send and receive by footpad, and then send these value to my laptop's serial port. Once Processing(An interactive programming language that good at graphical creation) read these value, it would generate the animation to show user's body fat level on a diagram of body fat standard.

Boy & Girl Animation
The Arduino code is here:

/***  Detecting two different value and make a deduction, the result will be
      send to Processing
      Written by Roger TSAI 05/02/2007
***/


int sensorPin1 = 2;    // select the input pin for sensor
int sensorPin2 = 3;    // select the input pin for other sensor
int ledPin = 13;   // select the pin for the LED
int val1 = 0;       // variable to store the value coming from the sensor
int val2 = 0;       // variable to store the value coming from the sensor
int valFinal = 0;

void setup() {
  pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT
  pinMode(sensorPin1, OUTPUT);  // declare the ledPin as an OUTPUT
  pinMode(sensorPin2, OUTPUT);  // declare the ledPin as an OUTPUT

  Serial.begin(9600);	// opens serial port, sets data rate to 9600 bps
}

void loop() {

  digitalWrite(ledPin, HIGH);    // sets the LED on

  val1 = analogRead(sensorPin1)*100;    // read the value from the sensor
  val2 = analogRead(sensorPin2)*100;    // read the value from the sensor
  valFinal = val1 - val2;

  //Serial.print("A");  //header variable, so we know which sensor value is which
  //Serial.print(val1, DEC);  
 // Serial.print(10, BYTE);  //terminating character

  //Serial.print("B");  //header variable, so we know which sensor value is which
  //Serial.print(val2, DEC);  
  Serial.print(valFinal, DEC);
  Serial.print(10, BYTE);  //terminating character


  delay(10);
}


And Processing Code:


/***
  Create Animation for Body Fat Monitor, 
  to clearly visualize the percentage by 
  diagram of body fat percentage.
  Created by Roger TSAI 05/03/2007
***/

import processing.serial.*;

Serial myPort;  // The serial port
PFont myFont;     // The display font 
int val = 0;
int i = 40;           // counter
float j = 0.0;
float k = 380.0;
int opacity = 50;
float valueA = 0.15;
float valNormA, valNormB;     // normalized values of A and B

void setup () {
  size(500, 500);        // window size
  frameRate(60);

  myFont = loadFont("Courier-Bold-12.vlw"); 
  textFont(myFont, 16); 
  fill(#E9FF5B, 200);
  smooth(); 

  background(#000000, 200);
  strokeCap(ROUND);
  ellipseMode(CENTER);
  strokeWeight(3);
  println(Serial.list());   // List all serial ports
  myPort = new Serial(this, Serial.list()[1], 9600);
}

void draw()
{

   drawPoint();

  fill(0,1);
  rect(0,0, width, height); 
  noStroke();
  fill(140,140,220);// blue
  rect(50,60,((width-50)/50*8),50);
  rect(50,140,((width-50)/50*11),50);
  rect(50,300,((width-50)/50*21),50);
  rect(50,380,((width-50)/50*23),50);


  fill(50,120,50);// green
  rect(50+((width-50)/50*8),60,((width-50)/50*12), 50);
  rect(50+((width-50)/50*11),140,((width-50)/50*11), 50);
  rect(50+((width-50)/50*21),300,((width-50)/50*12), 50);
  rect(50+((width-50)/50*23),380,((width-50)/50*11), 50);

  fill(240,240,60);// yellow
  rect(50+((width-50)/50*20),60,((width-50)/50*5), 50);
  rect(50+((width-50)/50*22),140,((width-50)/50*6), 50);
  rect(50+((width-50)/50*33),300,((width-50)/50*6), 50);
  rect(50+((width-50)/50*34),380,((width-50)/50*6), 50);

  fill(240,60,60);// red
  rect(50+((width-50)/50*25),60,((width-50)/50*25), 50);
  rect(50+((width-50)/50*28),140,((width-50)/50*22), 50);
  rect(50+((width-50)/50*39),300,((width-50)/50*11), 50);
  rect(50+((width-50)/50*40),380,((width-50)/50*10), 50);

  fill(100,100,255);
  textFont(myFont, 36);  
  text("MALE", width/2-40, 40);
  text("FEMALE",width/2-20, 282);

  fill(255,255,255);  
  textFont(myFont, 14); 
  text("20~", 5, 82);
  text("39", 5, 102);
  text("above", 5, 162);
  text("39", 5, 182);
  text("20~", 5, 322);
  text("39", 5, 342);
  text("above", 5, 402);
  text("39", 5, 422);

  text("UNDER", 52, 82);
  text("FAT", 52, 102);
  text("UNDER", 52, 162);
  text("FAT", 52, 182);
  text("UNDER", 52, 322);
  text("FAT", 52, 342);
  text("UNDER", 52, 402);
  text("FAT", 52, 422);

  text("HEALTHY", 128, 82);
  text("8% - 20%", 128, 102);
  text("HEALTHY", 160, 162);
  text("11% - 22%", 160, 182);
  text("HEALTHY", 250, 322);
  text("21% - 33%", 250, 342);
  text("HEALTHY", 270, 402);
  text("23% - 34%", 270, 422);

  text("OVER", 233, 82);
  text("FAT", 233, 102);
  text("OVER", 255, 162);
  text("FAT", 255, 182);
  text("OVER", 350, 322);
  text("FAT", 350, 342);
  text("OVER", 360, 402);
  text("FAT", 360, 422);

  text("OBESE", 380, 92);
  text("OBESE", 380, 172);
  text("OBESE", 435, 332);
  text("OBESE", 440, 412);



  println("myPort.available()" + myPort.available());
  while (myPort.available() > 0) {
    serialEvent(myPort.read());
    }
    i++;


}

void drawPoint(){

    int p = i/20;
    if( (p%2 ==0) ){
        opacity = 10;
        background(0);
      }
    noStroke();
    fill(230,230,230,opacity);
    rect (valueA*2*(width-50)+50, 0, 5, height);
    text(valueA*100 + "%", valueA*2*(width-50)+50, height/2);
   /* rect (valueA, 60, 5, 50);
    rect (valueA, 140, 5, 50);
    rect (valueA, 300, 5, 50);   
    rect (valueA, 380, 5, 50);             
    */
    }

//Serial parsing stuff to get the raw values from 
//the serial event
void serialEvent(int serial){
  if(serial > 0){ valueA = serial;
    }
}

Another animation I made by Processing is inspired by the idea of impedance. I translate the idea of body impedance into social resistance, especially romance resistance. By simply creating two icons indicate boy and girl, the animation show your resistance of love. The more fat you got, the more love resistance grow.
Boy & Girl Animation
Processing Code:


/***
  Create Animation for Body Fat Monitor, 
  to enhance the meaning behind the number 
  of body fat percentage,
  which give user more visual strike, 
  to remind the importance of controling body fat.
  Created by Roger TSAI 05/03/2007
***/

import processing.serial.*;

Serial myPort;  // The serial port
PFont myFont;     // The display font 
String buff = "";
int val = 0;
int NEWLINE = 10;
int i = 40;           // counter
float j = 0.0;
float k = 380.0;
int valueA = 200;
int valueB;   // the serial port data

int[] valuesA = new int[10];
int[] valuesB = new int[10];

float valNormA, valNormB;     // normalized values of A and B

void setup () {
  size(500, 500);        // window size
  frameRate(60);

  myFont = loadFont("Courier-Bold-12.vlw"); 
  textFont(myFont, 16); 
  fill(#E9FF5B, 200);
  smooth(); 

  background(#000000, 200);
  strokeCap(ROUND);
  ellipseMode(CENTER);
  strokeWeight(3);

  println(Serial.list());   // List all serial ports
  myPort = new Serial(this, Serial.list()[1], 9600);

}

void draw()
{
  fill(0,1);
  rect(0,0, width, height); 
  println("myPort.available()" + myPort.available());
  while (myPort.available() > 0) {
    serialEvent(myPort.read());
    }

  // Boy
  noStroke();
  fill(153,196,233);
  ellipse(140, 120, 60, 60);//head
  rect(90, 150, 100, 100);//body
  rect(100,250,30,60);
  rect(150,250,30,60);
  ellipse(114, 310, 29, 29);
  ellipse(164, 310, 29, 29);


  // Girl
  noStroke();
  fill(239,152,193);
  ellipse(380, 120, 60, 60);//head
  quad(340, 150, 420, 150, 440, 250, 320, 250);//body
  rect(340,250,30,60);
  rect(390,250,30,60);
  ellipse(354, 310, 29, 29);
  ellipse(404, 310, 29, 29);

  i++;
  j++;
  if(i%20 == 19){
  drawText();
  drawPulse();
    }

}

void drawText(){
  fill(30,200,200);
  textFont(myFont, 32); 
  text("LOVE RESISTANCE", 120, 40);

  fill(200,30,200);
  textFont(myFont, 24); 

  if (valueA < 100){
  text("low impedence", 150, 70);
  fill(255,100,100);
  /*beginShape();
  vertex(30, 20);
  bezierVertex(80, 0, 80, 75, 30, 80);
  bezierVertex(50, 80, 60, 25, 30, 20);
  endShape();*/
    }
  else if (valueA > 100 || valueA < 200){
  text("mid impedence", 150, 70);    
    }
  else if(valueA >200){
  text("high impedence", 150, 70);    
    }


  }

  void drawPulse(){
    noStroke();
    fill(255,100,200);
    ellipse(j,k ,3,3);
    if(j > width){
      j = 0;
      background(#000000, 200);
      }
    if(j < (width/2+60) && j >(width/2-60)){
      k= valueA;
      }
    else{
       k = 380.0;}
    }

//Serial parsing stuff to get the raw values from 
//the serial event
void serialEvent(int serial){
  if(serial > 0){ valueA = serial;
    }
}