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.
Revision 1:eb3bd21fba0b, committed 2017-03-22
- Comitter:
- ronaldhklee
- Date:
- Wed Mar 22 04:54:35 2017 +0000
- Parent:
- 0:599009dbb3e5
- Commit message:
- Tobj_max = 60, Tobj_min = 0, Ta=50~0;
Changed in this revision
--- a/main.cpp Tue Mar 21 07:29:14 2017 +0000 +++ b/main.cpp Wed Mar 22 04:54:35 2017 +0000 @@ -3,30 +3,60 @@ DigitalOut myled(LED1); -int SAddr = 0; +int SAddr = DEFAULT_SADDR; float temp = 0; +char c; +//uint16_t pwmreg; int main() { + if (MLX90614_EEPROM_Read(SAddr,EEPROM_T0MAX) != TOBJ_P60) + MLX90614_EEPROM_Write(SAddr, EEPROM_T0MAX, TOBJ_P60); + if (MLX90614_EEPROM_Read(SAddr,EEPROM_T0MIN) != TOBJ_PM0) + MLX90614_EEPROM_Write(SAddr, EEPROM_T0MIN, TOBJ_PM0); + if (MLX90614_EEPROM_Read(SAddr,EEPROM_PWMCTRL) != DEFAULT_PWMCTRL) + MLX90614_EEPROM_Write(SAddr, EEPROM_PWMCTRL, DEFAULT_PWMCTRL); + if (MLX90614_EEPROM_Read(SAddr,EEPROM_TARANGE) != (uint16_t)(TAMB_P50 << 8 | TAMB_PM0)) + MLX90614_EEPROM_Write(SAddr, EEPROM_TARANGE, (uint16_t)(TAMB_P50 << 8 | TAMB_PM0)); + if (MLX90614_EEPROM_Read(SAddr,EEPROM_CONFIGREG1) != DEFAULT_CONFIGREG1) + MLX90614_EEPROM_Write(SAddr, EEPROM_CONFIGREG1, DEFAULT_CONFIGREG1); + //wait(5); + printf(" EEPROM_T0MAX = 0x%X\r\n", MLX90614_EEPROM_Read(SAddr,EEPROM_T0MAX)); + printf(" EEPROM_T0MIN = 0x%X\r\n", MLX90614_EEPROM_Read(SAddr,EEPROM_T0MIN)); + printf(" EEPROM_PWMCTRL = 0x%X\r\n", MLX90614_EEPROM_Read(SAddr,EEPROM_PWMCTRL)); + printf(" EEPROM_TARANGE = 0x%X\r\n", MLX90614_EEPROM_Read(SAddr,EEPROM_TARANGE)); + printf(" EEPROM_ECCOEF = 0x%X\r\n", MLX90614_EEPROM_Read(SAddr,EEPROM_ECCOEF)); + printf(" EEPROM_CONFIGREG1 = 0x%X\r\n", MLX90614_EEPROM_Read(SAddr,EEPROM_CONFIGREG1)); SAddr = MLX90614_SA_Read(); - printf(" MLX90614 Slave Address Read = 0x%X. \n\r", SAddr); - if (SAddr == 0xff) + printf(" EEPROM_SMBUSADDR = 0x%X. \n\r", SAddr); + if (SAddr == ERROR_ADDR_CRC8) { SAddr = MLX90614_SA_Scan(); printf(" MLX90614 Slave Address Find = 0x%X. \n\r", SAddr); } - - wait(0.1); - do temp = getTempC_Ambi(SAddr); while(temp == 0xffffffff); + do temp = getTempC_Ambi(SAddr); while(temp == ERROR_TEMP_CRC8); printf(" Ambient temperature = %.2f\r\n", temp); - do temp = getTempC_Obj1(SAddr); while(temp == 0xffffffff); + do temp = getTempC_Obj1(SAddr); while(temp == ERROR_TEMP_CRC8); printf(" Object 1 temperature = %.2f\r\n", temp); - do temp = getTempC_Obj2(SAddr); while(temp == 0xffffffff); + do temp = getTempC_Obj2(SAddr); while(temp == ERROR_TEMP_CRC8); printf(" Object 2 temperature = %.2f\r\n", temp); + + + fflush(stdin); printf(" Press any Key......"); + scanf("%c", &c); while(1) { + printf("\033[2J\033[1;1H"); fflush(stdout); + do temp = getTempC_Ambi(SAddr); while(temp == ERROR_TEMP_CRC8); + printf(" Ambient temperature = %.2f\r\n", temp); + do temp = getTempC_Obj1(SAddr); while(temp == ERROR_TEMP_CRC8); + printf(" Object 1 temperature = %.2f\r\n", temp); + do temp = getTempC_Obj2(SAddr); while(temp == ERROR_TEMP_CRC8); + printf(" Object 2 temperature = %.2f\r\n", temp); + myled = 1; // LED is ON - wait(1.0); // 1000 ms + wait(0.5); // 1000 ms + myled = 0; // LED is OFF - wait(1.0); // 1 sec + wait(0.5); // 1 sec } }
--- a/mlx90614.cpp Tue Mar 21 07:29:14 2017 +0000 +++ b/mlx90614.cpp Wed Mar 22 04:54:35 2017 +0000 @@ -37,7 +37,67 @@ 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; + 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) @@ -62,7 +122,7 @@ 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 + else return ERROR_TEMP_CRC8; //Error } float getTempC_Obj1(uint8_t SAddr) @@ -87,7 +147,7 @@ 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 + else return ERROR_TEMP_CRC8; //Error } float getTempC_Obj2(uint8_t SAddr) @@ -112,7 +172,7 @@ 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 + else return ERROR_TEMP_CRC8; //Error } float getTempC(uint8_t SAddr, uint8_t memAddr) @@ -134,7 +194,7 @@ 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 + else return ERROR_TEMP_CRC8; //Error } float getTempF(uint8_t SAddr, uint8_t memAddr) @@ -156,7 +216,7 @@ -273.15 //C -0.18) //(3.3V-3)*0.6/V *1.8+32); //F - else return 0xffffffff; //Error + else return ERROR_TEMP_CRC8; //Error } uint8_t MLX90614_CRC8(uint8_t *data, int length)
--- a/mlx90614.h Tue Mar 21 07:29:14 2017 +0000 +++ b/mlx90614.h Wed Mar 22 04:54:35 2017 +0000 @@ -16,6 +16,35 @@ #define RAM_TA 0x06 #define RAM_TOBJ1 0x07 #define RAM_TOBJ2 0x08 +#define ERROR_ADDR_CRC8 0xFF +#define ERROR_TEMP_CRC8 0xFFFFFFFF + +#define DEFAULT_PWMCTRL 0x0201 +#define DEFAULT_CONFIGREG1 0x1FB3 + +// Tobj = (T + 273.15) * 100 +#define TOBJ_P120 0x9993 //+120 +#define TOBJ_P100 0x91C3 +#define TOBJ_P80 0x89F3 +#define TOBJ_P70 0x860B +#define TOBJ_P60 0x8223 +#define TOBJ_P50 0x7E3B +#define TOBJ_PM0 0x6AB3 +#define TOBJ_M10 0x66CB +#define TOBJ_M20 0x62E3 //-20 + +//Tamb = ((T + 38.2) / 64) * 100 +//Ta = (Ta_max << 8) | Ta_min +#define TAMB_P120 0xF7 //+120 +#define TAMB_P100 0xD8 +#define TAMB_P80 0xB9 +#define TAMB_P70 0xA9 +#define TAMB_P60 0x99 +#define TAMB_P50 0x8A +#define TAMB_PM0 0x3C +#define TAMB_M10 0x2C +#define TAMB_M20 0x1C //-20 + const uint8_t MLX90614_crc8_table[] = { @@ -39,7 +68,10 @@ uint8_t MLX90614_SA_Scan(void); uint8_t MLX90614_SA_Read(uint8_t curAddr = DEFAULT_SADDR); -bool SA_Change(uint8_t curAddr, uint8_t newAddr); +int MLX90614_EEPROM_Erase(int8_t curAddr, uint8_t eepromcmd); +int MLX90614_EEPROM_Write(int8_t curAddr, uint8_t eepromcmd, uint16_t data); +uint16_t MLX90614_EEPROM_Read(uint8_t curAddr, uint8_t eepromcmd); + float getTempC_Ambi(uint8_t SAddr = DEFAULT_SADDR); float getTempC_Obj1(uint8_t SAddr = DEFAULT_SADDR); float getTempC_Obj2(uint8_t SAddr = DEFAULT_SADDR);