Working Principle
A Galvanic Skin Response (GSR) sensor measures electrodermal activity (EDA) — the variation in skin electrical conductance caused by sweat gland activity. When you experience emotional arousal, stress, or surprise, the sympathetic nervous system triggers eccrine sweat glands on the fingertips and palms, increasing skin moisture and reducing electrical resistance by 10–50%.
The sensor simply measures the conductance between two finger electrodes by applying a small constant voltage (~0.5 V DC) and measuring the resulting current. Higher conductance = more sweating = greater emotional arousal.
Electrical Characteristics
| Parameter | Typical (Grove GSR Module) |
|---|---|
| Measurement | Skin conductance (micro-Siemens, µS) |
| Typical Range | 1–20 µS (0.05–1.0 MΩ) |
| Supply Voltage | 3.3–5 V |
| Output | Analog voltage (0–VCC) |
| Electrode Type | Finger straps or Ag/AgCl adhesive |
| Finger Placement | Index and middle fingertips (medial phalanges) |
| Response Time | 1–3 seconds (skin conductance response latency) |
| Applied Voltage | <0.5 V DC (safe for skin) |
Interfacing with an MCU
Most GSR modules (Grove, SparkFun) output an analog voltage: connect VCC, GND, and SIG to an ADC pin. The module includes a voltage divider circuit and gain amplifier. Directly connecting two electrodes to an ADC also works with a known reference resistor.
Calibration
- Baseline: Record 60 seconds of resting data; average as the individual’s baseline conductance
- SCR detection: Skin conductance responses (SCRs) are transient increases >0.05 µS above baseline within 1–3 seconds of a stimulus
- Individual variation: Baseline conductance varies widely between individuals; always work with relative changes, not absolute values
Code Example
/*
* GSR (Galvanic Skin Response) Sensor — Arduino
* Module: Grove GSR or 2-finger electrode setup
* Wiring: VCC → 5V, GND → GND, SIG → A0
*/
#define GSR_PIN A0
int baseline = 0;
void setup() {
Serial.begin(9600);
Serial.println("GSR Sensor — calibrating baseline (5s)...");
/* Measure baseline (average of 50 readings) */
long sum = 0;
for (int i = 0; i < 50; i++) {
sum += analogRead(GSR_PIN);
delay(100);
}
baseline = sum / 50;
Serial.print("Baseline ADC: ");
Serial.println(baseline);
Serial.println("Ready — try counting backwards from 100 by 7s");
}
void loop() {
int raw = analogRead(GSR_PIN);
float conductance = 1.0 / (float)raw; /* Relative */
/* Detect arousal: significant deviation from baseline */
int delta = raw - baseline;
Serial.print("GSR: ");
Serial.print(raw);
Serial.print(" Delta: ");
Serial.print(delta);
if (abs(delta) > baseline * 0.10) {
Serial.print(" ** AROUSAL DETECTED **");
}
Serial.println();
delay(200);
}
Real-World Applications
Lie Detection, Stress Monitoring & UX Research
GSR is a core component of polygraph (lie detector) systems, measuring autonomic arousal during questioning. In UX research, it quantifies emotional engagement with product interfaces. Biofeedback therapy uses GSR to train relaxation techniques. Wearables like the Empatica E4 use EDA for stress tracking and seizure detection.
Limitations
- Not emotion-specific: GSR indicates arousal level, not the type of emotion (excitement and fear both increase conductance).
- Individual variability: Some people have naturally dry or sweaty hands; absolute values are meaningless between subjects.
- Slow response: 1–3 seconds latency; not suitable for real-time event-locked analysis.
- Temperature sensitivity: Ambient temperature and humidity affect sweat rate and baseline conductance.