5 FSR-400 Force Sensor Projects That Respond to Touch and Pressure
Build pressure-sensitive projects: touch desk lamp, musical pad, smart door handle, chair occupancy sensor, and interactive art installation
The FSR-400 force sensitive resistor is a compact, affordable polymer thick film device that reduces its resistance as force increases on its active area. It's perfect for detecting touch, weight, and pressure in interactive projects. In this guide, we'll build five complete touch/pressure-triggered projects using this versatile sensor — from a pressure-responsive desk lamp to an interactive floor art installation.
Topics covered: Arduino programming, FSR integration, analog reading, threshold calibration, pressure mapping, relay and PWM control, event-driven automation, physical build tips.
Affiliate disclosure: As an Amazon Associate, I earn from qualifying purchases.
Affiliate links: FSR-400 (5-pack) on Amazon | Arduino Nano on Amazon | Jumper wires on Amazon
What You'll Need
- FSR-400 sensors (×5 for complete builds, or ×1 for sequential testing)
- Arduino Nano or Uno (×1)
- USB cable for programming
- Breadboard and jumper wires
- 5V relay module (for desk lamp project)
- PWM-capable LED dimmer or MOSFET module (for brightness control)
- Desk lamp with variable brightness (or LED strip)
- Piezo buzzer module (for musical pad)
- Servo motor (for door handle project)
- 16×2 LCD I2C display (for chair occupancy display)
- Power supply (5V 2A for LED applications)
How the FSR-400 Works
Before diving into the projects, let's understand the sensor's operation:
Arduino FSR-400
A0 ────── Terminal 1 (one side)
A0 ────── Terminal 2 (other side via 10K pull-down to GND)
Alternative wiring with dedicated analog pin:
A0 ────── One FSR terminal
GND ────── 10K resistor ─── Other FSR terminal
Operating mechanism:
- FSR consists of conductive polymer thick film on a flexible substrate
- When force is applied, conductive particles make contact, reducing resistance
- Resistance ranges from ~1MΩ (no force) to ~1KΩ (high force)
- Use with a fixed 10KΩ pull-down resistor to create a voltage divider
- Read voltage with Arduino ADC — higher force = higher voltage = higher ADC value
// Basic FSR read with calibration
const int FSR_PIN = A0;
const int FSR_THRESHOLD = 100; // Calibrate based on your application
void setup() {
pinMode(FSR_PIN, INPUT);
Serial.begin(115200);
}
void loop() {
int fsrReading = analogRead(FSR_PIN);
if (fsrReading > FSR_THRESHOLD) {
int forceLevel = map(fsrReading, 100, 1023, 1, 10);
Serial.print(&tag=hfchang-20"Force level: ");
Serial.println(forceLevel);
} else {
Serial.println("No pressure detected.");
}
delay(100);
}
Project 1: Touch-Responsive Desk Lamp
Goal: Turn on and adjust desk lamp brightness based on touch pressure intensity.
Hardware
- FSR-400 force sensor
- Arduino Nano
- 5V PWM dimmer module or MOSFET (IRF540N)
- Desk lamp with dimmable LED bulb
- 5V 2A power supply
- Jumper wires
Wiring
FSR-400: Terminal 1 → A0, Terminal 2 → 10K resistor → GND
(also wire Terminal 2 directly to A0 via second wire for voltage divider)
FSR Wiring: FSR one terminal → A0
FSR other terminal → 10K resistor → GND
Junction point also → A0
PWM Dimmer: Signal→Pin 6, VCC→5V, GND→GND
Dimmer controls desk lamp power
Code
// WF1 Run #036 - Project 1: Touch-Responsive Desk Lamp
// FSR-400 + PWM Dimmable LED Lamp
#define FSR_PIN A0
#define PWM_PIN 6
#define OFF_THRESHOLD 50
#define MIN_BRIGHT 50
#define MAX_BRIGHT 255
void setup() {
pinMode(FSR_PIN, INPUT);
pinMode(PWM_PIN, OUTPUT);
Serial.begin(115200);
analogWrite(PWM_PIN, 0); // Start with lamp off
}
void loop() {
int fsrReading = analogRead(FSR_PIN);
if (fsrReading > OFF_THRESHOLD) {
// Map force to PWM brightness (inverted: more force = more brightness)
int brightness = map(fsrReading, OFF_THRESHOLD, 900, MIN_BRIGHT, MAX_BRIGHT);
brightness = constrain(brightness, MIN_BRIGHT, MAX_BRIGHT);
analogWrite(PWM_PIN, brightness);
Serial.print("FSR: ");
Serial.print(fsrReading);
Serial.print(" → Brightness: ");
Serial.println(brightness);
} else {
analogWrite(PWM_PIN, 0); // Turn off lamp
}
delay(50);
}
Looking for help customizing your desk lamp project? I offer freelance Arduino programming services on Fiverr — from sensor integration to custom lighting effects.
Project 2: Pressure-Sensitive Musical Pad
Goal: Create a musical instrument pad where pressing different areas produces different tones based on applied pressure.
Hardware
- FSR-400 force sensors (×4 for a 2×2 pad grid)
- Arduino Nano
- Piezo buzzer module
- Optional: 4×4 matrix keypad plate for mounting
- Jumper wires
Wiring
FSR-400 sensors (4-zone grid):
Zone 1: A0 (via voltage divider 10K to GND)
Zone 2: A1 (via voltage divider 10K to GND)
Zone 3: A2 (via voltage divider 10K to GND)
Zone 4: A3 (via voltage divider 10K to GND)
Piezo Buzzer: Signal→Pin 8, VCC→5V, GND→GND
Code
// WF1 Run #036 - Project 2: Pressure-Sensitive Musical Pad
// FSR-400 4-zone grid + Piezo Buzzer
#define BUZZER_PIN 8
#define NUM_ZONES 4
const int fsrPins[NUM_ZONES] = {A0, A1, A2, A3};
// Frequency map for 4 zones (C4, E4, G4, C5)
const int tones[NUM_ZONES] = {261, 329, 392, 523};
void setup() {
for (int i = 0; i < NUM_ZONES; i++) {
pinMode(fsrPins[i], INPUT);
}
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(115200);
}
void playTone(int frequency, int pressure) {
// Map pressure (0-1023) to volume envelope (higher pressure = louder, longer sustain)
int duration = map(pressure, 100, 900, 100, 500);
int volume = map(pressure, 100, 900, 50, 255);
tone(BUZZER_PIN, frequency);
delay(duration);
noTone(BUZZER_PIN);
}
void loop() {
for (int i = 0; i < NUM_ZONES; i++) {
int pressure = analogRead(fsrPins[i]);
if (pressure > 100) {
playTone(tones[i], pressure);
Serial.print("Zone ");
Serial.print(i + 1);
Serial.print(" → Freq: ");
Serial.print(tones[i]);
Serial.print("Hz, Pressure: ");
Serial.println(pressure);
}
}
delay(50);
}
Need help designing a custom musical instrument interface? I offer freelance hardware integration services on Fiverr — from sensor arrays to MIDI conversion.
Project 3: Smart Door Handle Grip Sensor
Goal: Detect grip pressure on a door handle to distinguish between casual holding and intentional unlock attempts, triggering a smart lock mechanism.
Hardware
- FSR-400 force sensor (thin profile for mounting under handle grip)
- Arduino Nano
- Servo motor (MG995 or SG90) for physical lock mechanism
- Status LED (green for unlock ready, red for locked)
- 5V power supply
- Jumper wires
Wiring
FSR-400: Terminal 1 → A0, Terminal 2 → 10K resistor → GND
(A0 also connects to junction of FSR and resistor)
Servo Motor: Signal→Pin 9, VCC→5V, GND→GND
Status LED: Green→Pin 12 (via 220Ω resistor), Red→Pin 13 (via 220Ω resistor)
LED cathodes → GND
Code
// WF1 Run #036 - Project 3: Smart Door Handle Grip Sensor
// FSR-400 + Servo Lock Mechanism
#include <Servo.h>
#define FSR_PIN A0
#define SERVO_PIN 9
#define LED_GREEN 12
#define LED_RED 13
#define GRIP_THRESH 200 // Light touch
#define UNLOCK_THRESH 600 // Firm grip for unlock
Servo lockServo;
void setup() {
pinMode(FSR_PIN, INPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_RED, OUTPUT);
lockServo.attach(SERVO_PIN);
// Default: locked position (0°)
lockServo.write(0);
digitalWrite(LED_RED, HIGH); // Red = locked
Serial.begin(115200);
}
void loop() {
int gripPressure = analogRead(FSR_PIN);
if (gripPressure > UNLOCK_THRESH) {
// Firm grip = unlock
lockServo.write(90); // 90° = unlocked
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_RED, LOW);
Serial.println("UNLOCKED - Firm grip detected");
} else if (gripPressure > GRIP_THRESH) {
// Light touch = lock ready
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, HIGH);
Serial.print("HOLDING - Grip level: ");
Serial.println(gripPressure);
} else {
// No grip = lock
lockServo.write(0);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, HIGH);
}
delay(100);
}
Want to add biometric verification or smartphone integration to your smart lock? I offer freelance IoT security projects on Fiverr — from fingerprint sensors to BLE unlock.
Project 4: Chair Occupancy Sensor
Goal: Detect when someone sits in a chair using a concealed FSR under the cushion, displaying occupancy status on an LCD.
Hardware
- FSR-400 force sensor (thin, flexible for under-cushion mounting)
- Arduino Nano
- 16×2 LCD I2C display
- Status LED (green for occupied, blue for vacant)
- 5V power supply or USB power bank
- Jumper wires
Wiring
FSR-400: Terminal 1 → A0, Terminal 2 → 10K resistor → GND
(A0 also at junction for voltage divider)
LCD I2C: SDA→A4, SCL→A5, VCC→5V, GND→GND
Status LED: Green→Pin 11, Blue→Pin 10 (via 220Ω resistors)
LED cathodes → GND
Code
// WF1 Run #036 - Project 4: Chair Occupancy Sensor
// FSR-400 + 16x2 LCD I2C Display
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define FSR_PIN A0
#define LED_GREEN 11
#define LED_BLUE 10
#define OCCUPY_THRESH 150
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool isOccupied = false;
void setup() {
pinMode(FSR_PIN, INPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Chair Monitor");
updateDisplay(false);
Serial.begin(115200);
}
void updateDisplay(bool occupied) {
if (occupied) {
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, LOW);
lcd.setCursor(0, 1);
lcd.print("OCCUPIED ");
} else {
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, HIGH);
lcd.setCursor(0, 1);
lcd.print("VACANT ");
}
}
void loop() {
int pressure = analogRead(FSR_PIN);
if (pressure > OCCUPY_THRESH && !isOccupied) {
isOccupied = true;
updateDisplay(true);
Serial.println("Chair is now OCCUPIED");
} else if (pressure <= OCCUPY_THRESH && isOccupied) {
isOccupied = false;
updateDisplay(false);
Serial.println("Chair is now VACANT");
}
delay(200);
}
Need help designing a multi-chair monitoring system or data logging solution? I offer freelance Arduino automation services on Fiverr — from sensor networks to cloud dashboards.
Project 5: Interactive Pressure Art Installation
Goal: Create an interactive floor or wall art piece where visitor footsteps or touches trigger visual patterns and effects.
Hardware
- FSR-400 force sensors (×9 arranged in 3×3 grid under a transparent platform)
- Arduino Nano
- RGB LED matrix (NeoPixel 8×8 or similar)
- 5V 3A power supply (for LED matrix)
- Protective transparent platform (acrylic or glass)
- Jumper wires
Wiring
FSR-400 Grid (3x3 = 9 sensors):
Row 1: A0, A1, A2 (each via 10K voltage divider to GND)
Row 2: A3, A4, A5 (each via 10K voltage divider to GND)
Row 3: A6, A7, A8 (each via 10K voltage divider to GND)
NeoPixel Matrix: Data→Pin 6, VCC→5V, GND→GND
Code
// WF1 Run #036 - Project 5: Interactive Pressure Art Installation
// FSR-400 3x3 Grid + NeoPixel 8x8 Matrix
#include <Adafruit_NeoPixel.h>
#define NUM_SENSORS 9
const int fsrPins[NUM_SENSORS] = {A0, A1, A2, A3, A4, A5, A6, A7, A8};
#define PIXEL_PIN 6
#define NUM_PIXELS 64
#define PRESS_THRESH 100
Adafruit_NeoPixel pixels(NUM_PIXELS, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
// Color palette for pressure levels
uint32_t colors[4] = {
pixels.Color(0, 50, 0), // Low: dim green
pixels.Color(50, 150, 0), // Medium-low: bright green
pixels.Color(150, 200, 0), // Medium-high: yellow-green
pixels.Color(255, 100, 0) // High: orange
};
void setup() {
for (int i = 0; i < NUM_SENSORS; i++) {
pinMode(fsrPins[i], INPUT);
}
pixels.begin();
pixels.show(); // Initialize all pixels to off
Serial.begin(115200);
}
void updatePattern() {
for (int i = 0; i < NUM_SENSORS; i++) {
int pressure = analogRead(fsrPins[i]);
int intensity = constrain(map(pressure, 0, 900, 0, 3), 0, 3);
// Map 3x3 sensor grid to 8x8 LED matrix (approximate zones)
int row = i / 3;
int col = i % 3;
int basePixel = row * 8 + col * 2;
// Light up zone with appropriate color
for (int dx = 0; dx < 2; dx++) {
for (int dy = 0; dy < 2; dy++) {
int pixelIdx = basePixel + dy * 8 + dx;
if (pixelIdx < NUM_PIXELS) {
pixels.setPixelColor(pixelIdx, colors[intensity]);
}
}
}
}
pixels.show();
}
void loop() {
bool anyPressed = false;
for (int i = 0; i < NUM_SENSORS; i++) {
int pressure = analogRead(fsrPins[i]);
if (pressure > PRESS_THRESH) {
anyPressed = true;
Serial.print("Zone ");
Serial.print(i + 1);
Serial.print(": Pressure ");
Serial.println(pressure);
}
}
if (anyPressed) {
updatePattern();
} else {
// Fade out when no pressure
pixels.clear();
pixels.show();
}
delay(50);
}
Interested in building a large-scale interactive installation or multi-zone art project? I offer freelance physical computing and lighting design services on Fiverr — from sensor calibration to custom animation programming.
Troubleshooting Table
| Problem | Cause | Solution |
|---|---|---|
| FSR reading stuck at 0 or 1023 | Wiring issue or bad connection | Check voltage divider wiring; ensure 10KΩ resistor to GND |
| False triggers in musical pad | FSR sensitivity too high | Increase threshold value or add smoothing via software averaging |
| Servo jittering in door lock | Insufficient power | Use separate 5V 2A supply for servo; add capacitor across power rails |
| LCD not displaying | I2C address mismatch | Run I2C scanner to find correct address; common addresses: 0x27, 0x3F |
| LED matrix flickering | Power supply insufficient | Upgrade to 5V 3A+ supply; add 1000µF capacitor across VCC/GND |
| Art installation zone not responding | Loose sensor connection | Secure FSR with hot glue or silicone; check all solder joints |
Complete Shopping List
| Component | Quantity | Amazon Affiliate Link |
|---|---|---|
| FSR-400 (5-pack) | 1 | Buy on Amazon |
| Arduino Nano | 1 | Buy on Amazon |
| Jumper wires | 1 | Buy on Amazon |
| Breadboard | 1 | Buy on Amazon |
| 5V relay module | 1 | Buy on Amazon |
| Servo MG995 | 1 | Buy on Amazon |
| NeoPixel 8×8 matrix | 1 | Buy on Amazon |
| 16×2 LCD I2C | 1 | Buy on Amazon |
| Piezo buzzer | 1 | Buy on Amazon |
| 10KΩ resistors (100-pack) | 1 | Buy on Amazon |
| 220Ω resistors (100-pack) | 1 | Buy on Amazon |
| 5V 2A power supply | 1 | Buy on Amazon |
Next Steps
- Calibrate your FSR sensors — Test each sensor individually to establish baseline readings for your specific application environment
- Add data logging — Wire an SD card module to log sensor events over time
- Implement smoothing — Use rolling average or exponential smoothing to reduce noise
- Consider wireless — Add ESP8266 or HC-05 Bluetooth for remote monitoring
- Scale up — Expand from single-sensor projects to full 3×3 or 4×4 grids
Need help with your force sensor project build or troubleshooting? Find freelance Arduino and physical computing experts on Fiverr — from sensor integration to complete prototype development.
Related Technologies
Looking to expand beyond basic force sensing? These complementary technologies pair well with FSR-400 projects:
- HC-SR501 PIR Motion Sensor — Add presence detection alongside touch sensing
- DHT22 Temperature Sensor — Environmental data for smart home integration
- MQ-2 Gas Sensor — Safety monitoring for enclosed spaces
- Soil Moisture Sensor — Expand into smart agriculture projects
Next Step: From Scene to Sensor, Without Writing Code
If this guide gave you ideas for your own setup — but you're not sure which sensors and outputs work best for your specific space — I can help you map that out.
I offer a personalized interactive device design guide at Fiverr:
👉 https://www.fiverr.com/phd_hfchang/generate-an-arduino-interactive-prototypef
What you get:
- A custom guide based on your actual scene (not generic recommendations)
- Sensor selection matched to user behavior and physical constraints
- Interaction logic without needing to write code from scratch
- Testing methodology with pass/fail criteria for each output
This article was built as part of WF1 Run #036 — a hands-on guide to force-sensitive resistor projects for makers and IoT enthusiasts.






Top comments (0)