Example code provided by the seller or manufacturer of a sensor shows you a "proper" way to use it, and Adafruit have a good reputation, so I would say yes.
Oh, that one above is the source code I modified. Let me add the comments for the lines I added (has "...code added by me" comment):
#include <Adafruit_MLX90640.h>
Adafruit_MLX90640 mlx;
float frame[32*24]; // buffer for full frame of temperatures
// uncomment *one* of the below
// #define PRINT_TEMPERATURES
// #define PRINT_ASCIIART
// Variables for max and min temperature - code added by me
float mintemp ;
float maxtemp ;
void setup() {
while (!Serial) delay(10);
Serial.begin(115200);
delay(100);
Serial.println("Adafruit MLX90640 Simple Test");
if (! mlx.begin(MLX90640_I2CADDR_DEFAULT, &Wire)) {
Serial.println("MLX90640 not found!");
while (1) delay(10);
}
Serial.println("Found Adafruit MLX90640");
Serial.print("Serial number: ");
Serial.print(mlx.serialNumber[0], HEX);
Serial.print(mlx.serialNumber[1], HEX);
Serial.println(mlx.serialNumber[2], HEX);
// mlx.setMode(MLX90640_INTERLEAVED);
mlx.setMode(MLX90640_CHESS);
Serial.print("Current mode: ");
if (mlx.getMode() == MLX90640_CHESS) {
Serial.println("Chess");
} else {
Serial.println("Interleave");
}
mlx.setResolution(MLX90640_ADC_18BIT);
Serial.print("Current resolution: ");
mlx90640_resolution_t res = mlx.getResolution();
switch (res) {
case MLX90640_ADC_16BIT: Serial.println("16 bit"); break;
case MLX90640_ADC_17BIT: Serial.println("17 bit"); break;
case MLX90640_ADC_18BIT: Serial.println("18 bit"); break;
case MLX90640_ADC_19BIT: Serial.println("19 bit"); break;
}
mlx.setRefreshRate(MLX90640_2_HZ);
// mlx.setRefreshRate(MLX90640_4_HZ);
Serial.print("Current frame rate: ");
mlx90640_refreshrate_t rate = mlx.getRefreshRate();
switch (rate) {
case MLX90640_0_5_HZ: Serial.println("0.5 Hz"); break;
case MLX90640_1_HZ: Serial.println("1 Hz"); break;
case MLX90640_2_HZ: Serial.println("2 Hz"); break;
case MLX90640_4_HZ: Serial.println("4 Hz"); break;
case MLX90640_8_HZ: Serial.println("8 Hz"); break;
case MLX90640_16_HZ: Serial.println("16 Hz"); break;
case MLX90640_32_HZ: Serial.println("32 Hz"); break;
case MLX90640_64_HZ: Serial.println("64 Hz"); break;
}
}
void loop() {
delay(500);
mintemp = frame[0];
maxtemp = frame[0];
if (mlx.getFrame(frame) != 0) {
Serial.println("Failed");
return;
}
Serial.println("===================================");
Serial.print("Ambient temperature = ");
Serial.print(mlx.getTa(false)); // false = no new frame capture
Serial.println(" degC");
Serial.println();
Serial.println();
for (uint8_t h=0; h<24; h++) {
for (uint8_t w=0; w<32; w++) {
float t = frame[h*32 + w];
// If condition for minimum temperature - code added by me
if (t<mintemp) {
mintemp = t;
}
// If condition for maximum temperature - code added by me
if (t>maxtemp) {
maxtemp = t;
}
#ifdef PRINT_TEMPERATURES
Serial.print(t, 1);
Serial.print(", ");
#endif
#ifdef PRINT_ASCIIART
char c = '&';
if (t < 20) c = ' ';
else if (t < 23) c = '.';
else if (t < 25) c = '-';
else if (t < 27) c = '*';
else if (t < 29) c = '+';
else if (t < 31) c = 'x';
else if (t < 33) c = '%';
else if (t < 35) c = '#';
else if (t < 37) c = 'X';
Serial.print(c);
#endif
}
Serial.println();
}
// Added Serial output for max and min temperature - code added by me
Serial.print("Minimum temperature: ");Serial.println(mintemp);
Serial.print("Maximum temperature: ");Serial.println(maxtemp);
}
I want to know if that's the right way of doing it or would there be a better approach.
I guess I would say it's not a good idea to use the value frame[0] here because the frame array will contain unknown data at this point. Those values could be anything and could be higher or lower than any value that would be found in a valid frame, and that would mess up finding the max or min.
I made it default to use the first data available but you are correct that while highly unlikely, the data could be unknown or not work. I'd change the values to what you suggested.
Let me know if there are something else to change or maybe my approach to min and max temperature can be better.