Ronald Lee / Mbed 2 deprecated MLX90614

Dependencies:   mbed

Files at this revision

API Documentation at this revision

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

main.cpp Show annotated file Show diff for this revision Revisions of this file
mlx90614.cpp Show annotated file Show diff for this revision Revisions of this file
mlx90614.h Show annotated file Show diff for this revision Revisions of this file
--- 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);