Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
MLX90614.h
- Committer:
- mcm
- Date:
- 2017-12-26
- Revision:
- 2:1d6817048eb1
- Parent:
- 1:df258d25fd8a
- Child:
- 3:6a5b6fcff28e
File content as of revision 2:1d6817048eb1:
/**
* @brief MLX90614.h
* @details Single and Dual Zone Infra Red Thermometer.
* Header file.
*
*
* @return NA
*
* @author Manuel Caballero
* @date 26/December/2017
* @version 26/December/2017 The ORIGIN
* @pre NaN.
* @warning NaN
* @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
*/
#ifndef MLX90614_H
#define MLX90614_H
#include "mbed.h"
/**
Example:
[TODO]
*/
/*!
Library for the MLX90614 Single and Dual Zone Infra Red Thermometer.
*/
class MLX90614
{
public:
/**
* @brief DEFAULT ADDRESSES
*/
typedef enum {
MLX90614_ADDRESS = ( 0x5A << 1 ) /*!< MLX90614 I2C Address */
} MLX90614_address_t;
// COMMANDS
/**
* @brief COMMANDS
*/
typedef enum {
MLX90614_RAM_ACCESS = 0b00011111, /*!< Seconds. RANGE 00-59 */
MLX90614_EEPROM_ACCESS = 0b00100000, /*!< LSB of Temp */
MLX90614_FLAGS = 0b11110000, /*!< LSB of Temp */
MLX90614_SLEEP = 0b11111111 /*!< LSB of Temp */
} MLX90614_command_t;
// REGISTERS
/**
* @brief EEPROM REGISTERS
*/
typedef enum {
MLX90614_TO_MAX = ( MLX90614_EEPROM_ACCESS | 0x00 ), /*!< To max */
MLX90614_TO_MIN = ( MLX90614_EEPROM_ACCESS | 0x01 ), /*!< To min */
MLX90614_PWMCTRL = ( MLX90614_EEPROM_ACCESS | 0x02 ), /*!< PWMCTRL */
MLX90614_TA_RANGE = ( MLX90614_EEPROM_ACCESS | 0x03 ), /*!< Ta range */
MLX90614_EMISSIVITY_CORRECTION_COEFFICIENT = ( MLX90614_EEPROM_ACCESS | 0x04 ), /*!< Emissivity correction coefficient */
MLX90614_CONFIG_REGISTER_1 = ( MLX90614_EEPROM_ACCESS | 0x05 ), /*!< Config Register1 */
MLX90614_SMBUS_ADDRESS = ( MLX90614_EEPROM_ACCESS | 0x0E ), /*!< SMBus address (LSByte only) */
MLX90614_ID_NUMBER_0 = ( MLX90614_EEPROM_ACCESS | 0x0C ), /*!< ID number */
MLX90614_ID_NUMBER_1 = ( MLX90614_EEPROM_ACCESS | 0x0D ), /*!< ID number */
MLX90614_ID_NUMBER_2 = ( MLX90614_EEPROM_ACCESS | 0x0E ), /*!< ID number */
MLX90614_ID_NUMBER_3 = ( MLX90614_EEPROM_ACCESS | 0x0F ) /*!< ID number */
} MLX90614_eeprom_registers_t;
/**
* @brief RAM REGISTERS
*/
typedef enum {
MLX90614_RAW_DATA_IR_CHANNEL_1 = ( MLX90614_RAM_ACCESS & 0x04 ), /*!< Raw data IR channel 1 */
MLX90614_RAW_DATA_IR_CHANNEL_2 = ( MLX90614_RAM_ACCESS & 0x05 ), /*!< Raw data IR channel 2 */
MLX90614_TA = ( MLX90614_RAM_ACCESS & 0x06 ), /*!< TA */
MLX90614_TOBJ_1 = ( MLX90614_RAM_ACCESS & 0x07 ), /*!< TOBJ 1 */
MLX90614_TOBJ_2 = ( MLX90614_RAM_ACCESS & 0x08 ) /*!< TOBJ 2 */
} MLX90614_ram_registers_t;
// COMMANDS
/**
* @brief FLAGS
*/
typedef enum {
FLAG_EEBUSY_HIGH = ( 1 << 7 ), /*!< The previous write/erase EEPROM access is still in progress. High active */
FLAG_EEBUSY_LOW = ( 0 << 7 ), /*!< The previous write/erase EEPROM access is still in progress. LOW */
FLAG_EE_DEAD_HIGH = ( 1 << 5 ), /*!< EEPROM double error has occurred. High active */
FLAG_EE_DEAD_LOW = ( 0 << 5 ), /*!< EEPROM double error has occurred. LOW */
FLAG_INIT_LOW = ( 0 << 4 ), /*!< POR initialization routine is still ongoing. Low active */
FLAG_INIT_HIGH = ( 1 << 4 ) /*!< POR initialization routine is still ongoing. HIGH */
} MLX90614_flags_t;
/**
* @brief CONFIG REGISTER 1
*/
// IIR
typedef enum {
CONFIGREG1_IIR_MASK = ( 7 << 0 ), /*!< IIR Mask */
CONFIGREG1_IIR_100 = ( 4 << 0 ), /*!< IIR (100%) a1=1, b1=0 */
CONFIGREG1_IIR_80 = ( 5 << 0 ), /*!< IIR (80%) a1=0.8, b1=0.2 */
CONFIGREG1_IIR_67 = ( 6 << 0 ), /*!< IIR (67%) a1=0.666, b1=0.333 */
CONFIGREG1_IIR_57 = ( 7 << 0 ), /*!< IIR (57%) a1=0.571, b1=0.428 */
CONFIGREG1_IIR_50 = ( 0 << 0 ), /*!< IIR (50%) a1=0.5, b1=0.5 */
CONFIGREG1_IIR_25 = ( 1 << 0 ), /*!< IIR (25%) a1=0.25, b1=0.75 */
CONFIGREG1_IIR_17 = ( 2 << 0 ), /*!< IIR (17%) a1=0.166(6), b1=0.83(3) */
CONFIGREG1_IIR_13 = ( 3 << 0 ) /*!< IIR (13%) a1=0.125, b1=0.875 */
} MLX90614_configregister1_iir_t;
#ifndef MLX90614_VECTOR_STRUCT_H
#define MLX90614_VECTOR_STRUCT_H
typedef struct {
uint16_t RawTA;
uint16_t RawTObj1;
uint16_t RawTObj2;
uint8_t PEC;
float TA;
float TObj1;
float TObj2;
uint16_t ID[4];
float Emissivity;
MLX90614_configregister1_iir_t IIR;
MLX90614_flags_t Flags;
} MLX90614_vector_data_t;
#endif
/**
* @brief INTERNAL CONSTANTS
*/
#define MLX90614_KELVIN_TO_CELSIUS 273.15
#define MLX90614_KELVIN_CONVERSION 0.02
// MACRO: round function
#define _MYROUND( x ) ({ \
uint32_t aux_pre; \
float aux_x; \
\
aux_x = (x); \
aux_pre = (x); \
aux_x -= aux_pre; \
aux_x *= 10; \
\
if ( aux_x >= 5 ) \
aux_pre++; \
\
aux_pre; \
})
typedef enum {
MLX90614_SUCCESS = 0,
MLX90614_FAILURE = 1,
MLX90614_TIMEOUT = 2*65535,
MLX90614_FLAG_ERROR = 0x8000,
I2C_SUCCESS = 0, /*!< I2C communication was fine */
I2C_FAILURE = 1
} MLX90614_status_t;
/** Create an MLX90614 object connected to the specified I2C pins.
*
* @param sda I2C data pin
* @param scl I2C clock pin
* @param addr I2C slave address
* @param freq I2C frequency in Hz.
*/
MLX90614 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
/** Delete MLX90614 object.
*/
~MLX90614();
/** It gets the ID numbers.
*/
MLX90614_status_t MLX90614_GetID_Numbers ( MLX90614_vector_data_t* myID );
/** It reads the raw ambient temperature.
*/
MLX90614_status_t MLX90614_ReadRawTA ( MLX90614_vector_data_t* myRawTA );
/** It reads the ambient temperature in Celsius degrees.
*/
MLX90614_status_t MLX90614_ReadTA ( MLX90614_vector_data_t* myTA );
/** It reads the raw object 1 temperature.
*/
MLX90614_status_t MLX90614_ReadRawTObj1 ( MLX90614_vector_data_t* myRawTObj1 );
/** It reads the object 1 temperature.
*/
MLX90614_status_t MLX90614_ReadTObj1 ( MLX90614_vector_data_t* myObj1 );
/** It reads the raw object 2 temperature.
*/
MLX90614_status_t MLX90614_ReadRawTObj2 ( MLX90614_vector_data_t* myRawTObj2 );
/** It reads the object 2 temperature.
*/
MLX90614_status_t MLX90614_ReadTObj2 ( MLX90614_vector_data_t* myObj2 );
/** It gets the Emissivity correction coefficient.
*/
MLX90614_status_t MLX90614_GetEmissivity ( MLX90614_vector_data_t* myEmissivity );
/** It sets the Emissivity correction coefficient.
*/
MLX90614_status_t MLX90614_SetEmissivity ( MLX90614_vector_data_t myEmissivity );
/** It gets the IIR.
*/
MLX90614_status_t MLX90614_GetIIR ( MLX90614_vector_data_t* myIIR );
/** It sets the IIR.
*/
MLX90614_status_t MLX90614_SetIIR ( MLX90614_configregister1_iir_t myIIR );
/** It gets the FLAGS.
*/
MLX90614_status_t MLX90614_GetFLAGS ( MLX90614_vector_data_t* myFlags );
private:
I2C _i2c;
uint32_t _MLX90614_Addr;
};
#endif