DIY-Thermocam V2: A do-it-yourself thermal imager

DIY-Thermocam V2: A do-it-yourself thermal imager

After some time of research I want to share with you my latest project called "DIY-Thermocam".

The DIY-Thermocam is a do-it-yourself, low-cost thermographic camera based upon the famous Teensy 3.6 mikrocontroller. It uses a long-wave infrared sensor from FLIR to provide high quality thermal images.

The aim of this project is to offer a cheap, open-source thermal plattform for private persons, educational institutes or small companies. There are various applications like finding heat leaks in the insulation of buildings including windows, the analysis of electric components, as well as exploring at night.

The large firmware written in Arduino compatible C++ code can be used as it is or modified / extended to your own needs. That allows the DIY-Thermocam to be used as a versatile basis for various, different thermal applications.

For more information about the project, check out the website:

www.diy-thermocam.net

What sort of information you get out from the device? That is so simple idea, but it never crossed my mind.

Cheers,
Kari

GaryP:
What sort of information you get out from the device? That is so simple idea, but it never crossed my mind.

Cheers,
Kari

The Arduino transmits the measured temperature of each point via the usb serial port to the JAVA programm, where they are all saved and processed.
It would also be possible to save them on a SD Card to make the device independent from the PC while measuring (plus adding a lipo or so for energy supply), but that makes the whole project more expensive.

I like the idea and could be quite fun to play with.

I would be interested to read more :slight_smile:

maxbot:
The Arduino transmits the measured temperature of each point via the usb serial port to the JAVA programm, where they are all saved and processed.
It would also be possible to save them on a SD Card to make the device independent from the PC while measuring (plus adding a lipo or so for energy supply), but that makes the whole project more expensive.

Heh, what I ment, is it serial data, analog or something else?
I formatted my question badly.

Cheers,
Kari

Hugely impressed!
Congratulations!
I used to work with very expensive military thermal imagers and had a good deal of fun with them.
You've inspired me...

Thanks to Groove & Targettio for the positive feedback.
It's my first project withh the arduino or any other microcontroller at all, so it wasn't easy for me to learn all the required skills.

GaryP:

maxbot:
The Arduino transmits the measured temperature of each point via the usb serial port to the JAVA programm, where they are all saved and processed.
It would also be possible to save them on a SD Card to make the device independent from the PC while measuring (plus adding a lipo or so for energy supply), but that makes the whole project more expensive.

Heh, what I ment, is it serial data, analog or something else?
I formatted my question badly.

Cheers,
Kari

The sensor is a MLX90614 from Melexis (a special version with a teduced field of view), so I used one of the already existing code examples (http://interface.khm.de/index.php/lab/experiments/infrared-thermometer-mlx90614/) as a basis to talk to this ir sensor.

The homepage is now online !

-> www.cheap-thermocam.tk

Homemade IRST, that's pretty cool.
Did you consider scanning a mirror rather than the infra-red sensor?

halabut:
Homemade IRST, that's pretty cool.
Did you consider scanning a mirror rather than the infra-red sensor?

Excellent point, very small mirror will do the job!

Cheers,
Kari

GaryP:

halabut:
Homemade IRST, that's pretty cool.
Did you consider scanning a mirror rather than the infra-red sensor?

Excellent point, very small mirror will do the job!

Cheers,
Kari

Do you mean i should focus the sensor on a movable mirror instead of moving the whole sensor ?

The child in me would turn it into a heat seeking foam missile launcher XD

Awesome project.

Your homepage is annoying, all those pop-ups...
Here's the direct youtube-link for the video: - YouTube

I don't know if there's more advantages for moving the mirror only, but the fact that there less mass to be moved for servos. Your version moves softly, and it doesn't seem to suffering about the device on it.

Cheers,
Kari

GaryP:
Your homepage is annoying, all those pop-ups...
Here's the direct youtube-link for the video: - YouTube

I don't know if there's more advantages for moving the mirror only, but the fact that there less mass to be moved for servos. Your version moves softly, and it doesn't seem to suffering about the device on it.

Cheers,
Kari

Annoying ? I don't get popups and I haven't implemented any, maybe they come from the hoster .tk and I can't see them because of Adblock..
I tried the mirror version but however, it's not working with my infrared sensor at all... Otherwise it would have been a good idea.

maxbot:
I tried the mirror version but however, it's not working with my infrared sensor at all... Otherwise it would have been a good idea.

I was going to tell you to avoid this, because it wouldn't work; ordinary glass mirrors don't reflect heat (long IR). The infrared sensor you are using is a heat sensor, not a light sensor (short IR - otherwise you could use an ordinary digital camera with an IR filter - but this won't work, because it doesn't see into long IR - and is also why a real thermal imaging camera is so darn expensive).

Ah, well.

I've been trying to think how you could speed up the scan rate, and I thought about the scanning mirror idea, but because you can't find such mirrors (ok, they do exist, but they're not very cheap), that idea was out the door...

:slight_smile:

because it wouldn't work; ordinary glass mirrors don't reflect heat (long IR).

What about surface-coated mirrors?
Glass doesn't transmit the IR well, but if it comes off the metal layer directly?
Old laser printers and scanners can be a good source of these.

@cr0sh: thanks for the good explanation :slight_smile:
i dont think that moving the servo is a real problem because the limitation at speed at the moment comes from the infrared sensor. faster ones are more expensive and thats not the goal.
i use the mlx90614 with a response time of 100ms which is at the standard configuration minimum.
today i found out that you can reduce the settle time to 37ms by adjusing some settings in eeprom of the mlx90614. that would make the whole process almost three times faster.
here is the document: Error - Melexis
my problem is that i dont know how to configure the sensor without this evaluation board (it costs about 250 dollar -.-)
can somebody help ?

Well, it says it uses a 2-wire interface, so you could probably use the Wire library on the Arduino to program it; page 6 details how to set ConfigRegister1, you basically send 11 bits of data (0-10) to address 0x05, which I guess is the address of the device on the 2-wire bus. The directions are a little vague; it sounds like you are -not- supposed to change bits 3-7, only bits 0-2 and bits 8-10, in order to change the settings. So you have to read the register, make the alterations, then write the register value back, preserving the value in bits 3-7.

cr0sh:
Well, it says it uses a 2-wire interface, so you could probably use the Wire library on the Arduino to program it; page 6 details how to set ConfigRegister1, you basically send 11 bits of data (0-10) to address 0x05, which I guess is the address of the device on the 2-wire bus. The directions are a little vague; it sounds like you are -not- supposed to change bits 3-7, only bits 0-2 and bits 8-10, in order to change the settings. So you have to read the register, make the alterations, then write the register value back, preserving the value in bits 3-7.

Ok thanks. I understand this but code realisation is to difficult for me :~
I found this sketch that modifies the emission rate, i think this is very close to what I need:

/Simple program to read/write to the EEPROM (or read RAM) of the MLX90614 IR Sensor (in my case
//the MLX90614ESF-AAA). Example below erases the emissivity coefficient and then writes E = 1.
//Written be a total beginner, probably includes errors, and can definitely be
//improved on in many ways... /Lo-fi, 2011.

#include <i2cmaster.h>

void setup()
{
Serial.begin(9600);
Serial.println("----------Let's begin!----------");
i2c_init();                             //Initialise i2c bus
PORTC = (1 << PORTC4) | (1 << PORTC5);  //enable pullups
}

void loop()
{
int dev = 0x00; // I use the general address. If I specify the address
                //(0x05<<1), the code doesn't work, don't know why... yet.
unsigned int data_l = 0;
unsigned int data_h = 0;
int pec = 0;

float data_t = 0;
float emissivity = 0;

//READ EEPROM/RAM

Serial.println("*1: Read EEPROM address:");
i2c_start_wait(dev+I2C_WRITE);
i2c_write(0x24);  //0x004 and 0x04 etc reads the same address in the RAM,
                  //add 2(0) for EEPROM, eg. 0x24 (emissivity correction
                  //coefficient in EEPROM).

i2c_rep_start(dev+I2C_READ);
data_l = i2c_readAck(); //Read 1 byte and then send ack
data_h = i2c_readAck(); //Read 1 byte and then send ack
pec = i2c_readNak();
i2c_stop();

Serial.print("Data Low: ");
Serial.println(data_l);

Serial.print("Data High: ");
Serial.println(data_h);

Serial.print("Data combined: ");
data_t = (((data_h) << 8) + data_l);
Serial.println(data_t);

Serial.print("Emissivity: ");
emissivity = ((data_t) / 65535);
Serial.println(emissivity);

delay(5000);

//WRITE TO EEPROM, FIRST: ERASE OLD STUFF

i2c_start_wait(dev+I2C_WRITE);
i2c_write(0x24); //Register Address to write to

i2c_write(0x00); //Erase low byte (write 0)
i2c_write(0x00); //Erase high byte (write 0)
i2c_write(0xE8); //Send PEC
i2c_stop();

Serial.println("*2: Erasing old emissivity factor (writing 0).");
delay(5000);

//CHECK IF THE EEPROM VALUE HAS BEEN ERASED

Serial.println("*3: Check if the old emissivity coefficient was erased:");
i2c_start_wait(dev+I2C_WRITE);
i2c_write(0x24);  //See above comment.

i2c_rep_start(dev+I2C_READ);
data_l = i2c_readAck(); //Read 1 byte and then send ack
data_h = i2c_readAck(); //Read 1 byte and then send ack
pec = i2c_readNak();
i2c_stop();

Serial.print("Data Low: ");
Serial.println(data_l);

Serial.print("Data High: ");
Serial.println(data_h);

Serial.print("Data combined: ");
data_t = (((data_h) << 8) + data_l);
Serial.println(data_t);

Serial.print("Emissivity: ");
emissivity = ((data_t) / 65535);
Serial.println(emissivity);
delay(5000);

//WRITE TO EEPROM, THE NEW STUFF!

i2c_start_wait(dev+I2C_WRITE);
i2c_write(0x24); //Register Address to write to

i2c_write(0xFF); //New emissivity factor, Ef=1
i2c_write(0xFF); //New emissivity factor, Ef=1
i2c_write(0xCC); //Send PEC
i2c_stop();

Serial.println("*4: Write new E to EEPROM (E = 1.0).");
delay(5000);
Serial.println("----------The process starts over again----------");
delay(5000);
}

The only thing I know so far (after 2 hours of research..) is that I have to change i2c_write(0x24); to i2c_write(0x25); and that I need to send the following 16 Bits to this register:
1;0;0;R;R;R;R;R;1;0;0;R;R;R;R;R
R stands for read, so that the sketch first reads whats the existing value and then uses it.

Can anybody please help me with the adaption of the code ? Thanks a lot in advantage :slight_smile:

Cool!

Is this sensitive enough to see any stars in the sky (other than our sun)?

Is this sensitive enough to see any stars in the sky (other than our sun) in the daytime?