Ronald Lee / Mbed 2 deprecated MLX90614

Dependencies:   mbed

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