DEV Community

張旭豐
張旭豐

Posted on • Edited on

5 FSR-400 Force Sensor Projects That Respond to Touch and Pressure

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

FSR-400 Force Sensor Hero

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
Enter fullscreen mode Exit fullscreen mode

Operating mechanism:

  1. FSR consists of conductive polymer thick film on a flexible substrate
  2. When force is applied, conductive particles make contact, reducing resistance
  3. Resistance ranges from ~1MΩ (no force) to ~1KΩ (high force)
  4. Use with a fixed 10KΩ pull-down resistor to create a voltage divider
  5. 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);
}
Enter fullscreen mode Exit fullscreen mode

Project 1: Touch-Responsive Desk Lamp

Goal: Turn on and adjust desk lamp brightness based on touch pressure intensity.

Touch-Responsive Desk Lamp

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
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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.

Pressure-Sensitive Musical Pad

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
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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.

Smart Door Handle Grip Sensor

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
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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.

Chair Occupancy Sensor

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
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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.

Interactive Pressure Art Installation

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
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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

  1. Calibrate your FSR sensors — Test each sensor individually to establish baseline readings for your specific application environment
  2. Add data logging — Wire an SD card module to log sensor events over time
  3. Implement smoothing — Use rolling average or exponential smoothing to reduce noise
  4. Consider wireless — Add ESP8266 or HC-05 Bluetooth for remote monitoring
  5. 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)