Galvanic Skin Response sensor

I promised Heidi some info about making a Galvanic Skin Response sensor, like the one I used to measure skin conductivity in the Greetometer Glove to test the sweatiness of the wearer’s hands.

I used the instructions and code on this blog post:
http://cwwang.com/2008/04/13/gsr-reader/
If you don’t want to use processing, you can just do a simple Serial.println() in the Arduino serial monitor.

And I made my own electrodes out of coins, like in the example:

In the final project I soldered crimping beads onto the coins.  They need to be polished now and then.

The cool thing about skin conductivity is that it indicates more than just humidity on the skin.  If you try the example in the link above and breathe in sharply (as if surprised) while testing, you’ll see a change in the readings.  Combined with other measurements (movements, heart-rate, etc) you can start to detect stress levels.

One thought on “Galvanic Skin Response sensor

  1. I wrote a simple arduino code for the Gsr, because I thought the one in the link might be little confusing as it uses bytes. Works pretty well.
    /*
    Galvanic skin resistor sensor

    This is a simple setup for Galvanic skin resistor. It uses 2 copper coins, other is
    connected 2 5volts and other is connected to ground through 10k resistor. To reduce
    the noise it also has 0,22uF capacitor between resistor and ground.
    Reading is read from the coin connected to ground. (Before the resistor).
    The read value is then smoothed and outputted as pwm to pin 9, which lights led.

    Code actually combines 2 arduino examples with little editing: AnalaogInputOutput & Smoothing
    */

    const int analogInPin = A0; // Analog input pin that the Gnd Coin is attached to
    const int analogOutPin = 9; // Analog output pin that the LED is attached to

    int outputValue = 0; // value output to the PWM (analog out)
    const int numReadings = 10; //setups the array for 10 readings

    int readings[numReadings]; // the readings from the analog input
    int index = 0; // the index of the current reading
    int total = 0; // the running total
    int average = 0; // the average

    void setup() {
    // initialize serial communications at 9600 bps:
    Serial.begin(9600);
    // initialize all the readings to 0:
    for (int thisReading = 0; thisReading = numReadings)
    // …wrap around to the beginning:
    index = 0;

    // calculate the average:
    average = total / numReadings;

    // map the average value to the pwm output value. You might have to test what values you
    // get from the GSR sensor
    outputValue = map(average, 0, 150, 0, 255);
    // change the analog out value:
    analogWrite(analogOutPin, outputValue);

    // print the results to the serial monitor:

    Serial.print(“output = “);
    Serial.println(average, DEC);

    // wait 30 milliseconds before the next loop
    // for the analog-to-digital converter to settle
    // after the last reading:
    delay(30);
    }

Comments are closed.