Amplifying thermopile + reading with Arduino


I’m quite new in electronics, so forgive any newbie mistakes I make.

For a project in Uni I’m trying to measure IR radiation using a thermopile detector (small bandwidth at 4.26microns).

Since the bandwidth is so small (and it being an unamplified sensor) the signal is very weak (I can just read it using a multimeter, so only a couple of mV). Since I want to read the signal with the Arduino (Uno) I’m trying to amplify it using an op-amp.
The one I found here in our lab is a CA3130.

The circuit I use for it is attached.

The code I first used didn’t work properly:

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  int sensorValue = 0;
  float Voltage = 0;

// the loop routine runs over and over again forever:
void loop() {
  for(int x = 0; x<100;x++){
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  float Voltage = sensorValue / 1023 * 5;
  // print out the value you read:
  Serial.print(sensorValue);Serial.print("  ");Serial.println(Voltage);
  delay(1000);        // delay in between reads for stability

Then I used this which did give non-zero values. (but they didn’t react as wildly to IR pulses as when tested with a multimeter)

void setup() {


int var = 0;

void loop() {

    // TPO is the measured signal
  int TPO = analogRead(A0);
  float V = TPO * (5.0 / 1023.0);

 Serial.print(Vref);Serial.print(" ");Serial.println(V);

So my questions are: Is my circuit right? Will it work properly? I’ve been trying to figure out what could be wrong.
I also already tried with a 9V battery since the op amp’s lower limit is 5V but it should work normally… I don’t quite get it :cold_sweat:

Any help / experience would be welcome!


Have you looked at the input or output of the op-amp with a scope or meter? To verify the circuit, you should be able to supply a variable voltage to the positive input and see a voltage gain of about 100.


Thanks for the idea.

To make things simpler (and safer, I don't want to wreck my thermopile) I'm using a normal photodiode now just to check the system. When measuring straight with a multimeter I measure a potential around 350mV in daylight. So with the setup I have (could you see the drawing attached?) I should be able to amplify it. However it doensn't really work. It gets even worse when I try to send it to the Arduino, cause then he just reads 0.00 values...

I've been going through some posts and was wondering... is it possible to let the Arduino amplify the signal? (see,164799.0.html or am I getting it wrong?

Another thing I tried is making an inverting amplifier. Since the photodiode (or the thermopile) can be seen as a 'battery' and if connected in 'reverse' then it would be okay (see But the readings I got with this on the multimeter are just the same as without the op amp... I'm so confused...

Thanks for any help or tips!

How do you have the photodiode hooked up. You should have the anode connected to the op-amp + input and the cathode connected to +5V (reverse biased so that current doesn't flow normally). You also should try a 100k resistor from the op-amp + pin to ground to create a current to voltage convertor. You should be able to hold a remote control near the photodiode and see the pulses on the output of the op-amp.

If you are feeding 350mV into the + input right now, you should be seeing basically 5V at the output of the op-amp, because it should be in saturation since the gain is ~100.

If you want to use the inverting amplifier, you will need to bias the + input to something above ground, such as 5V. Then your "amplified" signal should be inverted. The higher the input, the lower the output by a factor of ~100. In single polarity voltage circuits, op-amps are often biased at 1/2 Vcc using a two resistor voltage divider. This is called a "virtual ground".

Okay Great! Thanks…
I indeed get 5V readings now - even with the Thermopile (TP)

I didn’t know that you had to reverse bias the cathode… (now I just had it connected to GND).

I hope this isn’t a stupid question, but since it’s a Inverting amplifier, if I just switch the cathode and the anode of the diode (it’s like a song) will I then read positive values? Or doesn’t that really matter for the Arduino.

What formula do you use to calculate the gain? I found for the Inverting Amp: Gain = Rf/Rin according to the circuit drawn here:

But I using a 10k and a 330 Ohm resistor this gives a gain of 31. So that would give an expected voltage of 10.85 with the photodiode… (Vout=-G*Vin) but for the TP only one of 37mV… (if Vin=1.2mV). How come do I also read 5V in that situation?

Thanks a lot for the help, I’m such a newbie with electronics, but it’s so much fun learning from it!

There are 2 ways how to connect a photodiode: a) for highest sensitivity use the photodiode in a “photovoltaic mode” b) fastest response and greatest bandwidth are obtained in the “photoconductive mode”.

G..le "photodiode amplifier" - you'll get a lot of information how to proceed.

You can't get a higher voltage out than the supply rail in, so 5V would be the limit. It can't go below ground either, so with an inverting amp wired like your picture (with + input connect to circuit ground), it can't drive the output lower than ground but it wants to go negative when the - input receives a voltage above ground. This is why you create a virtual ground on the + input. This lets the output swing either way in response to the input. With no input, the output rides at the bias voltage being applied to the + input.

Keep in mind that the op-amp has one goal in life. It "assumes" that the output feeds back to the - input. It is always trying to drive the output to a level that causes the - input to match the + input voltage.

This sounds like an application for a good instrumentation amplifier - the CA3130 has a typical input voltage offset of 8mV and temperature drift of 10uV/C which will limit its utility for small signals. Something like an INA126 would be a modern choice (typical offset voltage 0.1mV, offset drift 0.5uV/deg C)