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.
Diff: mlx90614.cpp
- Revision:
- 0:599009dbb3e5
- Child:
- 1:eb3bd21fba0b
diff -r 000000000000 -r 599009dbb3e5 mlx90614.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mlx90614.cpp Tue Mar 21 07:29:14 2017 +0000 @@ -0,0 +1,169 @@ +#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 0xff; +} + +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 0xffffffff; //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 0xffffffff; //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 0xffffffff; //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 0xffffffff; //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 0xffffffff; //Error +} + +uint8_t MLX90614_CRC8(uint8_t *data, int length) +{ + uint8_t crc = 0; + + while(length--) crc = MLX90614_crc8_table[crc ^ *data++]; + + return crc; +} \ No newline at end of file