My first assignment in Physical Computing was to create something along the lines of a “love-o-meter,” aka, one of those games that “measures” your sexiness (from ‘Cold Fish’ to ‘Hot Stuff!’, or something similar) using analog input from variable resistors. Riffing on this idea, I came up with the concept of a “massage feedback shirt.” I placed two force-sensitive resistors in the shoulders, and a row of LEDs in the front of the t-shirt. The number of LEDs that light up provide feedback on the pressure being applied by the masseuse.
Obviously it’s a pretty simple premise. One thing I will definitely do differently in future when working with this many LEDs is to use a common ground (i.e. – single lead attached to the ground side of each LED), which will mean fewer wires running from the LEDs to the breadboard (this got really cumbersome – see below).
The value of the resistors that I used to get a good range of numbers (0 – high 900s) out of the FSRs was something weird (4.7 Kohms, I think – thanks to Alex Kauffmann for pointing this out). Other that, the code was super basic:
int fsrLpin = 0; //Input pin for left FSR int fsrLvalue = 0; //Value of left FSR int fsrRpin = 1; //Input pin for right FSR int fsrRvalue = 0; //Value of right FSR int fsrTotal = 0; //Value f left and right FSRs combined int green1 = 2; //Output pins for green LEDS int green2 = 3; int green3 = 4; int green4 = 5; int yellow1 = 6; // Output pins for yellow LEDS int yellow2 = 7; int yellow3 = 8; int red1 = 9; // Output pins for red LEDS int red2 = 10; int red3 = 11;
void setup() {
//Initialize serial communications at 9600 bits/second
Serial.begin(9600);
//Set LED pins as outputs
pinMode(green1, OUTPUT);
pinMode(green2, OUTPUT);
pinMode(green3, OUTPUT);
pinMode(green4, OUTPUT);
pinMode(yellow1, OUTPUT);
pinMode(yellow2, OUTPUT);
pinMode(yellow3, OUTPUT);
pinMode(red1, OUTPUT);
pinMode(red2, OUTPUT);
pinMode(red3, OUTPUT);
}
void loop () {
fsrLvalue = analogRead(fsrLpin);//Read values from the pins to which the fsrs are connected
fsrRvalue = analogRead(fsrRpin);
fsrTotal = fsrLvalue + fsrRvalue; // Sum left and right values
Serial.println(fsrTotal); //Print fsr values
delay(100);
// Check fsrValue range and print corresponding threshold values
if (fsrTotal <= 9) { // Light none
digitalWrite(green1, LOW);
digitalWrite(green2, LOW);
digitalWrite(green3, LOW);
digitalWrite(green4, LOW);
digitalWrite(yellow1, LOW);
digitalWrite(yellow2, LOW);
digitalWrite(yellow3, LOW);
digitalWrite(red1, LOW);
digitalWrite(red2, LOW);
digitalWrite(red3, LOW);
Serial.println("Not touched");
}
if (fsrTotal >= 10 && fsrTotal <= 199) { // Light green1
digitalWrite(green1, HIGH);
digitalWrite(green2, LOW);
digitalWrite(green3, LOW);
digitalWrite(green4, LOW);
digitalWrite(yellow1, LOW);
digitalWrite(yellow2, LOW);
digitalWrite(yellow3, LOW);
digitalWrite(red1, LOW);
digitalWrite(red2, LOW);
digitalWrite(red3, LOW);
Serial.println("green1");
}
if (fsrTotal >= 200 && fsrTotal <= 399) { // Light green2
digitalWrite(green1, HIGH);
digitalWrite(green2, HIGH);
digitalWrite(green3, LOW);
digitalWrite(green4, LOW);
digitalWrite(yellow1, LOW);
digitalWrite(yellow2, LOW);
digitalWrite(yellow3, LOW);
digitalWrite(red1, LOW);
digitalWrite(red2, LOW);
digitalWrite(red3, LOW);
}
if (fsrTotal >= 400 && fsrTotal <= 599) { // Light green3
digitalWrite(green1, HIGH);
digitalWrite(green2, HIGH);
digitalWrite(green3, HIGH);
digitalWrite(green4, LOW);
digitalWrite(yellow1, LOW);
digitalWrite(yellow2, LOW);
digitalWrite(yellow3, LOW);
digitalWrite(red1, LOW);
digitalWrite(red2, LOW);
digitalWrite(red3, LOW);
}
if (fsrTotal >= 600 && fsrTotal <= 799) { // Light green4
digitalWrite(green1, HIGH);
digitalWrite(green2, HIGH);
digitalWrite(green3, HIGH);
digitalWrite(green4, HIGH);
digitalWrite(yellow1, LOW);
digitalWrite(yellow2, LOW);
digitalWrite(yellow3, LOW);
digitalWrite(red1, LOW);
digitalWrite(red2, LOW);
digitalWrite(red3, LOW);
}
if (fsrTotal >= 800 && fsrTotal <= 999) { // Light yellow1
digitalWrite(green1, HIGH);
digitalWrite(green2, HIGH);
digitalWrite(green3, HIGH);
digitalWrite(green4, HIGH);
digitalWrite(yellow1, HIGH);
digitalWrite(yellow2, LOW);
digitalWrite(yellow3, LOW);
digitalWrite(red1, LOW);
digitalWrite(red2, LOW);
digitalWrite(red3, LOW);
}
if (fsrTotal >= 1000 && fsrTotal <= 1199) { // Light yellow2
digitalWrite(green1, HIGH);
digitalWrite(green2, HIGH);
digitalWrite(green3, HIGH);
digitalWrite(green4, HIGH);
digitalWrite(yellow1, HIGH);
digitalWrite(yellow2, HIGH);
digitalWrite(yellow3, LOW);
digitalWrite(red1, LOW);
digitalWrite(red2, LOW);
digitalWrite(red3, LOW);
}
if (fsrTotal >= 1200 && fsrTotal <= 1399) { // Light yellow3
digitalWrite(green1, HIGH);
digitalWrite(green2, HIGH);
digitalWrite(green3, HIGH);
digitalWrite(green4, HIGH);
digitalWrite(yellow1, HIGH);
digitalWrite(yellow2, HIGH);
digitalWrite(yellow3, HIGH);
digitalWrite(red1, LOW);
digitalWrite(red2, LOW);
digitalWrite(red3, LOW);
}
if (fsrTotal >= 1400 && fsrTotal <= 1599) { // Light red1
digitalWrite(green1, HIGH);
digitalWrite(green2, HIGH);
digitalWrite(green3, HIGH);
digitalWrite(green4, HIGH);
digitalWrite(yellow1, HIGH);
digitalWrite(yellow2, HIGH);
digitalWrite(yellow3, HIGH);
digitalWrite(red1, HIGH);
digitalWrite(red2, LOW);
digitalWrite(red3, LOW);
}
if (fsrTotal >= 1600 && fsrTotal <= 1799) { // Light red2
digitalWrite(green1, HIGH);
digitalWrite(green2, HIGH);
digitalWrite(green3, HIGH);
digitalWrite(green4, HIGH);
digitalWrite(yellow1, HIGH);
digitalWrite(yellow2, HIGH);
digitalWrite(yellow3, HIGH);
digitalWrite(red1, HIGH);
digitalWrite(red2, HIGH);
digitalWrite(red3, LOW);
}
if (fsrTotal >= 1800 && fsrTotal <= 1999) { // Light red3
digitalWrite(green1, HIGH);
digitalWrite(green2, HIGH);
digitalWrite(green3, HIGH);
digitalWrite(green4, HIGH);
digitalWrite(yellow1, HIGH);
digitalWrite(yellow2, HIGH);
digitalWrite(yellow3, HIGH);
digitalWrite(red1, HIGH);
digitalWrite(red2, HIGH);
digitalWrite(red3, HIGH);
}
}
It’s rather long and should probably be re-factored using a for loop and/or switch statements, but for my first pass at writing Arduino code, it will do.


