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.cpp
- Committer:
- ronaldhklee
- Date:
- 2017-03-22
- Revision:
- 1:eb3bd21fba0b
- Parent:
- 0:599009dbb3e5
File content as of revision 1:eb3bd21fba0b:
#include "mbed.h" #include "mlx90614.h" I2C MLX90614_I2C(I2C_SDA, I2C_SCL); //PB_9, PB_8 Serial MLX90614_serial(SERIAL_TX, SERIAL_RX); //PA_2, PA_3 uint8_t MLX90614_SA_Scan(void) { int nofind; int addr = 0; char cmd = 0; for (int cnt = 1; cnt < 128; cnt++) { MLX90614_I2C.start(); nofind = MLX90614_I2C.write((cnt << 1), &cmd, 1); MLX90614_I2C.stop(); if (!nofind) { addr = cnt; break; } } return addr; } uint8_t MLX90614_SA_Read(uint8_t curAddr) { char cmd[3] = { 0 }; uint8_t crcbuf[6] = { 0 }; uint8_t writeAddr, readAddr; writeAddr = (curAddr << 1) + 0; readAddr = (curAddr << 1) + 1; crcbuf[0] = writeAddr; //write Address crcbuf[1] = cmd[0] = OPCODE_EEPROM | EEPROM_SMBUSADDR; crcbuf[2] = readAddr; //read Address MLX90614_I2C.write(writeAddr, cmd, 1, true); MLX90614_I2C.read(readAddr, cmd, 3); for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt]; if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00) return cmd[0]; else return ERROR_ADDR_CRC8; } int MLX90614_EEPROM_Erase(int8_t curAddr, uint8_t eepromcmd) { char cmd[4] = { 0 }; uint8_t crcbuf[4] = { 0 }; uint8_t writeAddr; writeAddr = (curAddr << 1) + 0; crcbuf[0] = writeAddr; //write Address crcbuf[1] = cmd[0] = OPCODE_EEPROM | eepromcmd; crcbuf[2] = cmd[1] = 0x00; crcbuf[3] = cmd[2] = 0x00; cmd[3] = MLX90614_CRC8(crcbuf, 4); return MLX90614_I2C.write(writeAddr, cmd, 4, true); } int MLX90614_EEPROM_Write(int8_t curAddr, uint8_t eepromcmd, uint16_t data) { char cmd[4] = { 0 }; uint8_t crcbuf[4] = { 0 }; uint8_t writeAddr; MLX90614_EEPROM_Erase(curAddr, eepromcmd); wait(0.1); writeAddr = (curAddr << 1) + 0; crcbuf[0] = writeAddr; //write Address crcbuf[1] = cmd[0] = OPCODE_EEPROM | eepromcmd; crcbuf[2] = cmd[1] = (uint8_t)(data & 0x00ff); crcbuf[3] = cmd[2] = (uint8_t)((data & 0xff00) >> 8); cmd[3] = MLX90614_CRC8(crcbuf, 4); MLX90614_I2C.write(writeAddr, cmd, 4, true); wait(0.1); return 1; } uint16_t MLX90614_EEPROM_Read(uint8_t curAddr, uint8_t eepromcmd) { char cmd[3] = { 0 }; uint8_t crcbuf[6] = { 0 }; uint8_t writeAddr, readAddr; writeAddr = (curAddr << 1) + 0; readAddr = (curAddr << 1) + 1; crcbuf[0] = writeAddr; //write Address crcbuf[1] = cmd[0] = OPCODE_EEPROM | eepromcmd; crcbuf[2] = readAddr; //read Address MLX90614_I2C.write(writeAddr, cmd, 1, true); MLX90614_I2C.read(readAddr, cmd, 3); for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt]; if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00) return (cmd[1]<<8)|cmd[0]; else return ERROR_ADDR_CRC8; } float getTempC_Ambi(uint8_t SAddr) { char cmd[3] = { 0 }; uint8_t crcbuf[6] = { 0 }; uint8_t writeAddr, readAddr; writeAddr = (SAddr << 1) + 0; readAddr = (SAddr << 1) + 1; crcbuf[0] = writeAddr; //write Address crcbuf[1] = cmd[0] = OPCODE_RAM | RAM_TA; crcbuf[2] = readAddr; //read Address MLX90614_I2C.write(writeAddr, cmd, 1, true); MLX90614_I2C.read(readAddr, cmd, 3); for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt]; if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00) return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin -273.15 //C -0.18); //(3.3V-3)*0.6/V else return ERROR_TEMP_CRC8; //Error } float getTempC_Obj1(uint8_t SAddr) { char cmd[3] = { 0 }; uint8_t crcbuf[6] = { 0 }; uint8_t writeAddr, readAddr; writeAddr = (SAddr << 1) + 0; readAddr = (SAddr << 1) + 1; crcbuf[0] = writeAddr; //write Address crcbuf[1] = cmd[0] = OPCODE_RAM | RAM_TOBJ1; crcbuf[2] = readAddr; //read Address MLX90614_I2C.write(writeAddr, cmd, 1, true); MLX90614_I2C.read(readAddr, cmd, 3); for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt]; if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00) return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin -273.15 //C -0.18); //(3.3V-3)*0.6/V else return ERROR_TEMP_CRC8; //Error } float getTempC_Obj2(uint8_t SAddr) { char cmd[3] = { 0 }; uint8_t crcbuf[6] = { 0 }; uint8_t writeAddr, readAddr; writeAddr = (SAddr << 1) + 0; readAddr = (SAddr << 1) + 1; crcbuf[0] = writeAddr; //write Address crcbuf[1] = cmd[0] = OPCODE_RAM | RAM_TOBJ2; crcbuf[2] = readAddr; //read Address MLX90614_I2C.write(writeAddr, cmd, 1, true); MLX90614_I2C.read(readAddr, cmd, 3); for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt]; if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00) return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin -273.15 //C -0.18); //(3.3V-3)*0.6/V else return ERROR_TEMP_CRC8; //Error } float getTempC(uint8_t SAddr, uint8_t memAddr) { char cmd[3] = { 0 }; uint8_t crcbuf[6] = { 0 }; cmd[0] = OPCODE_RAM | memAddr; crcbuf[0] = (SAddr << 1) + 0; //write Address crcbuf[1] = cmd[0]; crcbuf[2] = (SAddr << 1) + 1; //read Address MLX90614_I2C.write((SAddr<<1)+0, cmd, 1, true); MLX90614_I2C.read((SAddr<<1)+1, cmd, 3); for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt]; if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00) return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin -273.15 //C -0.18); //(3.3V-3)*0.6/V else return ERROR_TEMP_CRC8; //Error } float getTempF(uint8_t SAddr, uint8_t memAddr) { char cmd[3] = { 0 }; uint8_t crcbuf[6] = { 0 }; cmd[0] = OPCODE_RAM | memAddr; crcbuf[0] = (SAddr << 1) + 0; //write Address crcbuf[1] = cmd[0]; crcbuf[2] = (SAddr << 1) + 1; //read Address MLX90614_I2C.write(SAddr, cmd, 1, true); MLX90614_I2C.read(SAddr, cmd, 3); for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt]; if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00) return (((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin -273.15 //C -0.18) //(3.3V-3)*0.6/V *1.8+32); //F else return ERROR_TEMP_CRC8; //Error } uint8_t MLX90614_CRC8(uint8_t *data, int length) { uint8_t crc = 0; while(length--) crc = MLX90614_crc8_table[crc ^ *data++]; return crc; }