/* Read the temperature pixels from the MLX90640 IR array By: Nathan Seidle SparkFun Electronics Date: May 22nd, 2018 License: MIT. See license file for more information but you can basically do whatever you want with this code. Feel like supporting open source hardware? Buy a board from SparkFun! https://www.sparkfun.com/products/14769 This example initializes the MLX90640 and outputs the 768 temperature values from the 768 pixels. This example will work with a Teensy 3.1 and above. The MLX90640 requires some hefty calculations and larger arrays. You will need a microcontroller with 20,000 bytes or more of RAM. This relies on the driver written by Melexis and can be found at: https://github.com/melexis/mlx90640-library Hardware Connections: Connect the SparkFun Qwiic Breadboard Jumper (https://www.sparkfun.com/products/14425) to the Qwiic board Connect the male pins to the Teensy. The pinouts can be found here: https://www.pjrc.com/teensy/pinout.html Open the serial monitor at 9600 baud to see the output */ #include #include "MLX90640_API.h" #include "MLX90640_I2C_Driver.h" const byte MLX90640_address = 0x33; //Default 7-bit unshifted address of the MLX90640 #define TA_SHIFT 8 //Default shift for MLX90640 in open air static float mlx90640To[768]; paramsMLX90640 mlx90640; void setup() { Wire.begin(); Wire.setClock(100000); //Increase I2C clock speed to 400kHz Serial.begin(9600); while (!Serial); //Wait for user to open terminal Serial.println("MLX90640 IR Array Example"); if (isConnected() == false) { Serial.println("MLX90640 not detected at default I2C address. Please check wiring. Freezing."); while (1); } Serial.println("MLX90640 online!"); //Get device parameters - We only have to do this once int status; uint16_t eeMLX90640[832]; status = MLX90640_DumpEE(MLX90640_address, eeMLX90640); if (status != 0) Serial.println("Failed to load system parameters"); status = MLX90640_ExtractParameters(eeMLX90640, &mlx90640); if (status != 0) Serial.println("Parameter extraction failed"); //Once params are extracted, we can release eeMLX90640 array } void loop() { for (byte x = 0 ; x < 2 ; x++) //Read both subpages { uint16_t mlx90640Frame[834]; int status = MLX90640_GetFrameData(MLX90640_address, mlx90640Frame); if (status < 0) { Serial.print("GetFrame Error: "); Serial.println(status); } float vdd = MLX90640_GetVdd(mlx90640Frame, &mlx90640); float Ta = MLX90640_GetTa(mlx90640Frame, &mlx90640); float tr = Ta - TA_SHIFT; //Reflected temperature based on the sensor ambient temperature float emissivity = 0.95; MLX90640_CalculateTo(mlx90640Frame, &mlx90640, emissivity, tr, mlx90640To); } for (int x = 0 ; x < 10 ; x++) { Serial.print("Pixel "); Serial.print(x); Serial.print(": "); Serial.print(mlx90640To[x], 2); Serial.print("C"); Serial.println(); } delay(1000); } //Returns true if the MLX90640 is detected on the I2C bus boolean isConnected() { Wire.beginTransmission((uint8_t)MLX90640_address); if (Wire.endTransmission() != 0) return (false); //Sensor did not ACK return (true); }