MLX90640 (Qwiic) range issue

I have SparkFun IR Array Breakout - 110 Degree FOV, MLX90640 (Qwiic). https://www.sparkfun.com/products/14843

It is giving temperature values but what I am concerned about is that it only detects when you are close to the sensor like 10 feet, but when you go a little far from there it does not detect any human presence at all (same temperature).

I am working on people detection application using this device to control lighting and fans in the room, so if it is not detecting the right temperature beyond very short range or unable to differentiate, how can i work with it. What I am trying to is, if it detects temperature above 30 degree C from any of the 768 pixels(even if one), it should turn lights on, otherwise keep all off.

Can you please provide guidance.

Hi engr_snhf,

You should be able to detect heat from a person beyond 10 feet. I just tested both versions and we were able to see a person up to ~15 feet using the [Output To Processing Example. Can you test using that example and see if you are able to get similar results? Also, do you have anything in front of the sensor like a pane of glass or plastic? Finally, to get a better idea of your setup, can you please take a few photos of your circuit and how you have the sensor oriented in your testing and attach them to your response? Please do your best to make sure they are clear and well-lit.](Qwiic_IR_Array_MLX90640/Firmware/Example2_OutputToProcessing at master · sparkfun/Qwiic_IR_Array_MLX90640 · GitHub)

Hello,

Thanks for writing. I don`t have anything in front of sensor. Also, for some reason Output To Processing Example is not working for me, trying to figure out what is wrong.

I don`t have the sensor board with me rn, but i am definitely going to post picture of it. What i am doing is, i am setting up the temperature value in code, that is if the measured temperature is above 28C (that is greater than room temperature and indicator of human body present because of greater heat) from ANY(even if one) of the 768 pixels, turn the ligth on, otherwise keep it off. So when the distance increseas, like more than 7 feet between the person and sensor, the temperature values I am getting are all below 26C though there is human presence in the field of view, as a result light stays off regardless.

That makes me understand that the sensor is not giving the body temperature accurately, once the person goes distant (beyond 5 feet).

So this link got picture of my circuit and the results i got from Processing.

https://www.flickr.com/photos/185272653@N07/?

If you see here, as the distance increase the temperature of human body is dropping. What I am trying to do here is if temperature of any pixel out of the 768 pixels is above 30C (that indicates human presence) turn the lights on, otherwise keep it all off.

But the problem i am facing is, as the same body goes far from sensor, the temperature is dropping down to the room temperature, so how can you differentiate and perform people detection then.

Hmm, I am not sure what else to suggest here since from your photos it looks like the MLX90640 is seeing the body up until a point. The range really depends on the intensity of the heat source so any interference with that (eg. heavy clothing, etc.) can reduce the range at which the MLX90640 will detect that source. Our example code is only using basic commands from the [MLX90640 I2C Driver so you may want to play around with the settings in there to see if you can optimize your results.](Qwiic_IR_Array_MLX90640/Firmware/Example1_BasicReadings/MLX90640_I2C_Driver.cpp at master · sparkfun/Qwiic_IR_Array_MLX90640 · GitHub)

Did you see on the display that temperature is dropping for the same person when going distant? This is what bothering me when working on people detection because it is dropping to almost room temperature, so then how can i differentiate.

I figured out why it is happening. So, each pixel is not just showing the temperature it is measuring, infact it is showing temperature that is based on what all other pixels are seeing. In short, the pixel is giving the average temperature from based on its field of view (based on what all other pixels are seeing in the FOV).

Now is it how the sensor is? or how you developed the code? Is there any way to get exact temperature from pixel instead of it averaging out?