I've messed up the calibration of a cheap Chinese pyrometer
GM320. By accident (read on)! The device is available on AliExpress described as "
Infrared Thermometer C/F Non Contact Pyrometer GM320 Industrial Digital IR Temperature Meter -50~380 degree Celsius", various sellers (
general search link), price ~6..8 USD (shipping included).
Before scrapping it for parts I've decided to launch a little investigation on how to calibrate this device. I have ordered another unit (from a different seller, but it looks exactly the same), so there is something to compare against. Here are my findings.
1. CaseFirst remove the black part where the buttons and the screen are seated. Next,
carefully, remove the front piece where the laser diode is mounted (medium force is required, don't damage the laser diode's cables, they are not very long). Lastly remove the battery cover.
The case is held by two screws. One near the trigger button, the other one in the battery door hinge - you have to remove the black battery cover to access that screw.
2. PCBCaution: The +/- markings on the solder mask (near the button and the buzzer) on the side with the COB are swapped - red wire is the actual "+" and black wire is the "-"! At the other side of the PCB (with contacts for push-buttons), the +/- markings are correct.
The device uses an unknown COB (secured with a blob of black epoxy) to process the data, two transistors marked J3Y (probably: S8050, NPN ,5A 50V 625mW SOT23) for switching the laser diode and back-light, several passives... and a
24C02S EEPROM chip in 5-lead SOT23 case.
I've soldered some mod wires: red - battery plus, blue - battery minus, violet - WP (write protect), green - SCL (Serial Clock Input), orange - SDA (Serial Data). VCC and GND pins are connected directly to the battery.
The other end of the wires I've soldered to a DIP-8 socket, to create a makeshift adapter for EZP2019 programmer (settings: 24_EEPROM/ATMEL/AT24C02). I was able to read&write to the EEPROM in circuit, without external power.
3. EEPROMI've dumped EEPROMs from both the messed-up device and the functioning one. Only the first 8 bytes are used. Other bytes are set to 0xFF.
Good: 14 BA 16 76 2D C6 00 06
Messed up: 13 9A 00 00 2D C6 FF EBThere are 4 groups of bytes:
[1]st (red) - calibration point (?)
[2]nd (green) - slope (?)
[3]rd (black) - unknown, but the same in both dumps.
Presumably the initial C/F degrees mode, default state of laser and backlight? I've changed this value to 0x000, 0xFFFF and some random values - no effects on the measurements or device functions (backlight, C/F, laser pointer) observed. It might me a... serial number?
[4]th (blue) - calibration offset (?)
Groups [1], [2], [4] are stored as big-endian words (most significant byte first). Group [3] - unknown
I didn't experiment with this group. - no effects observed.
After copying the data from a good unit into the one I've
misaligned, the reading made much more sense, but were still far from the readings presented by the good meter.
More details on the meaning of those group later.
4. Manual calibrationWarning! Entering the calibration mode may modify or clear all existing calibration data, rendering your device useless. Backup the EEPROM before performing any experiments. Proceed on your own risk.
- Partially remove one battery
- Hold down the trigger and C/F button (red)
- Insert the battery
- Observe "CAL" being displayed. Release the C/F button and the trigger (in that order)
- The "CAL" string disappears. Now a temperature is being displayed (no other markings). On my device: 22.3.
(
Side note: that's how the accident happened. I was measuring the temperature, holding down the trigger button. I pressed the C/F several times to get the reading in Celsius and Fahrenheit. Then the battery broke contact for a second. The battery holder is not the best - it happened before. Voilà... the manual calibration mode is activated!)
4.1. Manual calibration functions and relation to EEPROMLet start just after activating the CAL mode. The displayed value doesn't change when pointing the device on various surface. Let's call this the "CALIBRATION POINT mode".
- Press "laser pointer button" to increase the value by 0.1 (actually: between 0.1C and 0.4C - it depends on the value!). Press "backlight button" to decrease the value by 0.1 (~0.1..0.4). You can also hold one of that button to make faster changes.
- Pressing both laser&backlight button causes the value to blink. It seems to be only a side effect.
- Pressing the trigger in this mode does nothing.
- Each change is instantly written to the EEPROM, group [1] (red)
- The same hex value sometimes show +/-0.1..0.5 deg upon power on. I have no idea why? (Does it take into account current ambient temperature?)
- On the factory-calibrated meter this value reads 0x14BA (28.6). After pressing the +/- buttons several times, changing to other value and immediately changing back to 28.6 the stored value are: 0x14F0 0x1502, 0x155c. The displays shows 28.6 in each case. Strange.
- Here's a list of values being displayed and the value stored in EEPROM:
00.0 minus some clicks (still shows up as 0.0) 0x0637
00.0 0x06EB
00.2 0x07d5
00.3 0x07e7
00.6 0x07F9
00.9 0x080B
01.2 0x081D
05.2 0x092b
10.1 0x0ac9
15.1 0x0c9d
20.0 0x0eef
25.0 0x11d1
30.0 0x1555
35.0 0x197b
40.0 0x1e8b
45.0 0x2485
50.0 0x2CE3
50.0 plus some clicks (still shows up as 50.0) 0x3031
- Press C/F (red). The SCAN symbol shows up. The temperature changes as you point the device in different directions. (Press C/F again to return to the CALIBRATION POINT mode).
- In the SCAN mode you have two options (apart from returning to the CALIBRATION POINT mode)
- Press (and hold for a second) the "laser pointer button" to store a value in group [4] (blue). The device beeps. Pressing that button multiple times updates the value. After the update is made the currently measured temperature is updated to the value set in the CALIBRATION POINT mode. Other measurements are shifted relative to this change.
- Press (and hold for a second) the trigger. The value in group [2] (green) is modified and the the device turns off (calibration procedure is complete (?)). The stored value depends on the current reading. Maybe I should point the device to the 300°C calibration target as suggested in another post?
5. ExperimentsTo get a clue on the meaning of numerical parameters I've modified each of them, individually, and took several measurements. Unfortunately I don't have any temperature reference. I also didn't want to play with ice-water baths and boiling water (along with matt black surfaces) to get somehow stable 0°C and 100°C references. I've chosen 3 points: A=15.4 (1L of cold water), B=24.9 (a point on my desk), C=42.5 (heated mouse pad). Those temperatures were stable +/-2°C during the measurements (I guess...). I was interested only in the shape of the graph, so the (lack of) accuracy shouldn't be an issue.
My findings:
Suppose that the measurements are calculated from f(x; A, B, C)=A*exp(B*x) + C, where x is the value from the IR sensor.
group 1 (red) - shifts the exponential (?) curve up&down. I have only 3 points from the middle of the curve, so that shifting may be caused by slight modifications to the exponent [coefficient B].
group 2 (green) - modifies the high point of the curve, with little to none effect on the lower end. Maybe it's the scaling factor [A]?
group 4 (blue) - shifts the curve up and down, similarly to group 1. Seems to be a little more linear(?). So maybe it's [C] from the equation above.
I have absolutely no experience or any knowledge regarding calibrating IR temperature sensors. Maybe my experiments will be enough for a more experienced user to draw some more conclusions.
6. ResultsI've used an iron set to MAX (iron for ironing) to get a mildly stable high temperature source. It read ~230°C on the factory-calibrated IR thermometer. I suppose the rather shining metal surface is not an issue in this case - I'm interested in calibrating the "broken" IR thermometer to the good one, not to the absolute temperature value.
I've used my good (factory-calibrated) meter to take the reading, than measured the same spot with the un-calibrated meter. Next, I modified the EEPROM group 2 (on the un-calibrated meter of course) to match the readings - just guess the initial hex value, around 0x1676! If the measured value was too high I
increased the value stored in the EEPROM. If the measured value was too low I
decreased the value stored in the EEPROM. After some tries and errors (using binary search) I was able to get both readings ~0.5°C apart.
To get the low point, I've located a spot on my desk near the heated mouse-pad (28.6°C, measured with good device) and used the manual calibration procedure to set the CALIBRATION POINT to 28.6°C point the device at the spot and store the correction by pressing the "laser pointer" button. Next - I removed the battery to skip the "trigger" measurement.
I had to repeat the procedure (from beginning, with the iron) 2 or 3 times to get consistent readings. My final calibration produced a ~2°C offset on lower temperature values (in range ~16..30°C) so I used the CALIBRATION POINT mode to slightly modify the set value. I made no measurements and simply removed the battery after changing the value.
Using the above procedure I was able to get a rather sensible readings in the range 5°C..230°C. Both devices now agree in +/-0.5°C... I think. Update: I froze a "Hot&Cold gel pack" over night to -26°C. Both devices agree on that temperature +/-1°C.
There may be an issue with low end (-30°C ... -50°C). I've tested both devices pointing them at an open freezer, and got even 10..15°C difference in some cases. But producing repeatable readings of such low temperature was a big challenge...
The final EEPROM:
My calibration: 14 18 0F FA 2D C6 00 04These values are not very different from the factory-calibrated values read from the good device.
That was fun!
Do you have any ideas how to improve the calibration process?