Ronald Lee / Mbed 2 deprecated MLX90614

Dependencies:   mbed

Committer:
ronaldhklee
Date:
Wed Mar 22 04:54:35 2017 +0000
Revision:
1:eb3bd21fba0b
Parent:
0:599009dbb3e5
Tobj_max = 60, Tobj_min = 0, Ta=50~0;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ronaldhklee 0:599009dbb3e5 1 #include "mbed.h"
ronaldhklee 0:599009dbb3e5 2 #include "mlx90614.h"
ronaldhklee 0:599009dbb3e5 3
ronaldhklee 0:599009dbb3e5 4 I2C MLX90614_I2C(I2C_SDA, I2C_SCL); //PB_9, PB_8
ronaldhklee 0:599009dbb3e5 5 Serial MLX90614_serial(SERIAL_TX, SERIAL_RX); //PA_2, PA_3
ronaldhklee 0:599009dbb3e5 6
ronaldhklee 0:599009dbb3e5 7 uint8_t MLX90614_SA_Scan(void)
ronaldhklee 0:599009dbb3e5 8 {
ronaldhklee 0:599009dbb3e5 9 int nofind;
ronaldhklee 0:599009dbb3e5 10 int addr = 0;
ronaldhklee 0:599009dbb3e5 11 char cmd = 0;
ronaldhklee 0:599009dbb3e5 12
ronaldhklee 0:599009dbb3e5 13 for (int cnt = 1; cnt < 128; cnt++)
ronaldhklee 0:599009dbb3e5 14 {
ronaldhklee 0:599009dbb3e5 15 MLX90614_I2C.start();
ronaldhklee 0:599009dbb3e5 16 nofind = MLX90614_I2C.write((cnt << 1), &cmd, 1);
ronaldhklee 0:599009dbb3e5 17 MLX90614_I2C.stop();
ronaldhklee 0:599009dbb3e5 18 if (!nofind) { addr = cnt; break; }
ronaldhklee 0:599009dbb3e5 19 }
ronaldhklee 0:599009dbb3e5 20 return addr;
ronaldhklee 0:599009dbb3e5 21 }
ronaldhklee 0:599009dbb3e5 22
ronaldhklee 0:599009dbb3e5 23 uint8_t MLX90614_SA_Read(uint8_t curAddr)
ronaldhklee 0:599009dbb3e5 24 {
ronaldhklee 0:599009dbb3e5 25 char cmd[3] = { 0 };
ronaldhklee 0:599009dbb3e5 26 uint8_t crcbuf[6] = { 0 };
ronaldhklee 0:599009dbb3e5 27 uint8_t writeAddr, readAddr;
ronaldhklee 0:599009dbb3e5 28
ronaldhklee 0:599009dbb3e5 29 writeAddr = (curAddr << 1) + 0;
ronaldhklee 0:599009dbb3e5 30 readAddr = (curAddr << 1) + 1;
ronaldhklee 0:599009dbb3e5 31
ronaldhklee 0:599009dbb3e5 32 crcbuf[0] = writeAddr; //write Address
ronaldhklee 0:599009dbb3e5 33 crcbuf[1] = cmd[0] = OPCODE_EEPROM | EEPROM_SMBUSADDR;
ronaldhklee 0:599009dbb3e5 34 crcbuf[2] = readAddr; //read Address
ronaldhklee 0:599009dbb3e5 35 MLX90614_I2C.write(writeAddr, cmd, 1, true);
ronaldhklee 0:599009dbb3e5 36 MLX90614_I2C.read(readAddr, cmd, 3);
ronaldhklee 0:599009dbb3e5 37 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 0:599009dbb3e5 38
ronaldhklee 0:599009dbb3e5 39 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00) return cmd[0];
ronaldhklee 1:eb3bd21fba0b 40 else return ERROR_ADDR_CRC8;
ronaldhklee 1:eb3bd21fba0b 41 }
ronaldhklee 1:eb3bd21fba0b 42
ronaldhklee 1:eb3bd21fba0b 43 int MLX90614_EEPROM_Erase(int8_t curAddr, uint8_t eepromcmd)
ronaldhklee 1:eb3bd21fba0b 44 {
ronaldhklee 1:eb3bd21fba0b 45 char cmd[4] = { 0 };
ronaldhklee 1:eb3bd21fba0b 46 uint8_t crcbuf[4] = { 0 };
ronaldhklee 1:eb3bd21fba0b 47 uint8_t writeAddr;
ronaldhklee 1:eb3bd21fba0b 48
ronaldhklee 1:eb3bd21fba0b 49 writeAddr = (curAddr << 1) + 0;
ronaldhklee 1:eb3bd21fba0b 50
ronaldhklee 1:eb3bd21fba0b 51 crcbuf[0] = writeAddr; //write Address
ronaldhklee 1:eb3bd21fba0b 52 crcbuf[1] = cmd[0] = OPCODE_EEPROM | eepromcmd;
ronaldhklee 1:eb3bd21fba0b 53 crcbuf[2] = cmd[1] = 0x00;
ronaldhklee 1:eb3bd21fba0b 54 crcbuf[3] = cmd[2] = 0x00;
ronaldhklee 1:eb3bd21fba0b 55 cmd[3] = MLX90614_CRC8(crcbuf, 4);
ronaldhklee 1:eb3bd21fba0b 56
ronaldhklee 1:eb3bd21fba0b 57 return MLX90614_I2C.write(writeAddr, cmd, 4, true);
ronaldhklee 1:eb3bd21fba0b 58 }
ronaldhklee 1:eb3bd21fba0b 59
ronaldhklee 1:eb3bd21fba0b 60 int MLX90614_EEPROM_Write(int8_t curAddr, uint8_t eepromcmd, uint16_t data)
ronaldhklee 1:eb3bd21fba0b 61 {
ronaldhklee 1:eb3bd21fba0b 62 char cmd[4] = { 0 };
ronaldhklee 1:eb3bd21fba0b 63 uint8_t crcbuf[4] = { 0 };
ronaldhklee 1:eb3bd21fba0b 64 uint8_t writeAddr;
ronaldhklee 1:eb3bd21fba0b 65
ronaldhklee 1:eb3bd21fba0b 66 MLX90614_EEPROM_Erase(curAddr, eepromcmd);
ronaldhklee 1:eb3bd21fba0b 67 wait(0.1);
ronaldhklee 1:eb3bd21fba0b 68
ronaldhklee 1:eb3bd21fba0b 69 writeAddr = (curAddr << 1) + 0;
ronaldhklee 1:eb3bd21fba0b 70
ronaldhklee 1:eb3bd21fba0b 71 crcbuf[0] = writeAddr; //write Address
ronaldhklee 1:eb3bd21fba0b 72 crcbuf[1] = cmd[0] = OPCODE_EEPROM | eepromcmd;
ronaldhklee 1:eb3bd21fba0b 73 crcbuf[2] = cmd[1] = (uint8_t)(data & 0x00ff);
ronaldhklee 1:eb3bd21fba0b 74 crcbuf[3] = cmd[2] = (uint8_t)((data & 0xff00) >> 8);
ronaldhklee 1:eb3bd21fba0b 75 cmd[3] = MLX90614_CRC8(crcbuf, 4);
ronaldhklee 1:eb3bd21fba0b 76
ronaldhklee 1:eb3bd21fba0b 77 MLX90614_I2C.write(writeAddr, cmd, 4, true);
ronaldhklee 1:eb3bd21fba0b 78 wait(0.1);
ronaldhklee 1:eb3bd21fba0b 79
ronaldhklee 1:eb3bd21fba0b 80 return 1;
ronaldhklee 1:eb3bd21fba0b 81 }
ronaldhklee 1:eb3bd21fba0b 82
ronaldhklee 1:eb3bd21fba0b 83 uint16_t MLX90614_EEPROM_Read(uint8_t curAddr, uint8_t eepromcmd)
ronaldhklee 1:eb3bd21fba0b 84 {
ronaldhklee 1:eb3bd21fba0b 85 char cmd[3] = { 0 };
ronaldhklee 1:eb3bd21fba0b 86 uint8_t crcbuf[6] = { 0 };
ronaldhklee 1:eb3bd21fba0b 87 uint8_t writeAddr, readAddr;
ronaldhklee 1:eb3bd21fba0b 88
ronaldhklee 1:eb3bd21fba0b 89 writeAddr = (curAddr << 1) + 0;
ronaldhklee 1:eb3bd21fba0b 90 readAddr = (curAddr << 1) + 1;
ronaldhklee 1:eb3bd21fba0b 91
ronaldhklee 1:eb3bd21fba0b 92 crcbuf[0] = writeAddr; //write Address
ronaldhklee 1:eb3bd21fba0b 93 crcbuf[1] = cmd[0] = OPCODE_EEPROM | eepromcmd;
ronaldhklee 1:eb3bd21fba0b 94 crcbuf[2] = readAddr; //read Address
ronaldhklee 1:eb3bd21fba0b 95 MLX90614_I2C.write(writeAddr, cmd, 1, true);
ronaldhklee 1:eb3bd21fba0b 96 MLX90614_I2C.read(readAddr, cmd, 3);
ronaldhklee 1:eb3bd21fba0b 97 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 1:eb3bd21fba0b 98
ronaldhklee 1:eb3bd21fba0b 99 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00) return (cmd[1]<<8)|cmd[0];
ronaldhklee 1:eb3bd21fba0b 100 else return ERROR_ADDR_CRC8;
ronaldhklee 0:599009dbb3e5 101 }
ronaldhklee 0:599009dbb3e5 102
ronaldhklee 0:599009dbb3e5 103 float getTempC_Ambi(uint8_t SAddr)
ronaldhklee 0:599009dbb3e5 104 {
ronaldhklee 0:599009dbb3e5 105 char cmd[3] = { 0 };
ronaldhklee 0:599009dbb3e5 106 uint8_t crcbuf[6] = { 0 };
ronaldhklee 0:599009dbb3e5 107 uint8_t writeAddr, readAddr;
ronaldhklee 0:599009dbb3e5 108
ronaldhklee 0:599009dbb3e5 109 writeAddr = (SAddr << 1) + 0;
ronaldhklee 0:599009dbb3e5 110 readAddr = (SAddr << 1) + 1;
ronaldhklee 0:599009dbb3e5 111
ronaldhklee 0:599009dbb3e5 112 crcbuf[0] = writeAddr; //write Address
ronaldhklee 0:599009dbb3e5 113 crcbuf[1] = cmd[0] = OPCODE_RAM | RAM_TA;
ronaldhklee 0:599009dbb3e5 114 crcbuf[2] = readAddr; //read Address
ronaldhklee 0:599009dbb3e5 115
ronaldhklee 0:599009dbb3e5 116 MLX90614_I2C.write(writeAddr, cmd, 1, true);
ronaldhklee 0:599009dbb3e5 117 MLX90614_I2C.read(readAddr, cmd, 3);
ronaldhklee 0:599009dbb3e5 118
ronaldhklee 0:599009dbb3e5 119 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 0:599009dbb3e5 120
ronaldhklee 0:599009dbb3e5 121 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00)
ronaldhklee 0:599009dbb3e5 122 return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin
ronaldhklee 0:599009dbb3e5 123 -273.15 //C
ronaldhklee 0:599009dbb3e5 124 -0.18); //(3.3V-3)*0.6/V
ronaldhklee 1:eb3bd21fba0b 125 else return ERROR_TEMP_CRC8; //Error
ronaldhklee 0:599009dbb3e5 126 }
ronaldhklee 0:599009dbb3e5 127
ronaldhklee 0:599009dbb3e5 128 float getTempC_Obj1(uint8_t SAddr)
ronaldhklee 0:599009dbb3e5 129 {
ronaldhklee 0:599009dbb3e5 130 char cmd[3] = { 0 };
ronaldhklee 0:599009dbb3e5 131 uint8_t crcbuf[6] = { 0 };
ronaldhklee 0:599009dbb3e5 132 uint8_t writeAddr, readAddr;
ronaldhklee 0:599009dbb3e5 133
ronaldhklee 0:599009dbb3e5 134 writeAddr = (SAddr << 1) + 0;
ronaldhklee 0:599009dbb3e5 135 readAddr = (SAddr << 1) + 1;
ronaldhklee 0:599009dbb3e5 136
ronaldhklee 0:599009dbb3e5 137 crcbuf[0] = writeAddr; //write Address
ronaldhklee 0:599009dbb3e5 138 crcbuf[1] = cmd[0] = OPCODE_RAM | RAM_TOBJ1;
ronaldhklee 0:599009dbb3e5 139 crcbuf[2] = readAddr; //read Address
ronaldhklee 0:599009dbb3e5 140
ronaldhklee 0:599009dbb3e5 141 MLX90614_I2C.write(writeAddr, cmd, 1, true);
ronaldhklee 0:599009dbb3e5 142 MLX90614_I2C.read(readAddr, cmd, 3);
ronaldhklee 0:599009dbb3e5 143
ronaldhklee 0:599009dbb3e5 144 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 0:599009dbb3e5 145
ronaldhklee 0:599009dbb3e5 146 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00)
ronaldhklee 0:599009dbb3e5 147 return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin
ronaldhklee 0:599009dbb3e5 148 -273.15 //C
ronaldhklee 0:599009dbb3e5 149 -0.18); //(3.3V-3)*0.6/V
ronaldhklee 1:eb3bd21fba0b 150 else return ERROR_TEMP_CRC8; //Error
ronaldhklee 0:599009dbb3e5 151 }
ronaldhklee 0:599009dbb3e5 152
ronaldhklee 0:599009dbb3e5 153 float getTempC_Obj2(uint8_t SAddr)
ronaldhklee 0:599009dbb3e5 154 {
ronaldhklee 0:599009dbb3e5 155 char cmd[3] = { 0 };
ronaldhklee 0:599009dbb3e5 156 uint8_t crcbuf[6] = { 0 };
ronaldhklee 0:599009dbb3e5 157 uint8_t writeAddr, readAddr;
ronaldhklee 0:599009dbb3e5 158
ronaldhklee 0:599009dbb3e5 159 writeAddr = (SAddr << 1) + 0;
ronaldhklee 0:599009dbb3e5 160 readAddr = (SAddr << 1) + 1;
ronaldhklee 0:599009dbb3e5 161
ronaldhklee 0:599009dbb3e5 162 crcbuf[0] = writeAddr; //write Address
ronaldhklee 0:599009dbb3e5 163 crcbuf[1] = cmd[0] = OPCODE_RAM | RAM_TOBJ2;
ronaldhklee 0:599009dbb3e5 164 crcbuf[2] = readAddr; //read Address
ronaldhklee 0:599009dbb3e5 165
ronaldhklee 0:599009dbb3e5 166 MLX90614_I2C.write(writeAddr, cmd, 1, true);
ronaldhklee 0:599009dbb3e5 167 MLX90614_I2C.read(readAddr, cmd, 3);
ronaldhklee 0:599009dbb3e5 168
ronaldhklee 0:599009dbb3e5 169 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 0:599009dbb3e5 170
ronaldhklee 0:599009dbb3e5 171 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00)
ronaldhklee 0:599009dbb3e5 172 return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin
ronaldhklee 0:599009dbb3e5 173 -273.15 //C
ronaldhklee 0:599009dbb3e5 174 -0.18); //(3.3V-3)*0.6/V
ronaldhklee 1:eb3bd21fba0b 175 else return ERROR_TEMP_CRC8; //Error
ronaldhklee 0:599009dbb3e5 176 }
ronaldhklee 0:599009dbb3e5 177
ronaldhklee 0:599009dbb3e5 178 float getTempC(uint8_t SAddr, uint8_t memAddr)
ronaldhklee 0:599009dbb3e5 179 {
ronaldhklee 0:599009dbb3e5 180 char cmd[3] = { 0 };
ronaldhklee 0:599009dbb3e5 181 uint8_t crcbuf[6] = { 0 };
ronaldhklee 0:599009dbb3e5 182
ronaldhklee 0:599009dbb3e5 183 cmd[0] = OPCODE_RAM | memAddr;
ronaldhklee 0:599009dbb3e5 184 crcbuf[0] = (SAddr << 1) + 0; //write Address
ronaldhklee 0:599009dbb3e5 185 crcbuf[1] = cmd[0];
ronaldhklee 0:599009dbb3e5 186 crcbuf[2] = (SAddr << 1) + 1; //read Address
ronaldhklee 0:599009dbb3e5 187
ronaldhklee 0:599009dbb3e5 188 MLX90614_I2C.write((SAddr<<1)+0, cmd, 1, true);
ronaldhklee 0:599009dbb3e5 189 MLX90614_I2C.read((SAddr<<1)+1, cmd, 3);
ronaldhklee 0:599009dbb3e5 190
ronaldhklee 0:599009dbb3e5 191 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 0:599009dbb3e5 192
ronaldhklee 0:599009dbb3e5 193 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00)
ronaldhklee 0:599009dbb3e5 194 return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin
ronaldhklee 0:599009dbb3e5 195 -273.15 //C
ronaldhklee 0:599009dbb3e5 196 -0.18); //(3.3V-3)*0.6/V
ronaldhklee 1:eb3bd21fba0b 197 else return ERROR_TEMP_CRC8; //Error
ronaldhklee 0:599009dbb3e5 198 }
ronaldhklee 0:599009dbb3e5 199
ronaldhklee 0:599009dbb3e5 200 float getTempF(uint8_t SAddr, uint8_t memAddr)
ronaldhklee 0:599009dbb3e5 201 {
ronaldhklee 0:599009dbb3e5 202 char cmd[3] = { 0 };
ronaldhklee 0:599009dbb3e5 203 uint8_t crcbuf[6] = { 0 };
ronaldhklee 0:599009dbb3e5 204
ronaldhklee 0:599009dbb3e5 205 cmd[0] = OPCODE_RAM | memAddr;
ronaldhklee 0:599009dbb3e5 206 crcbuf[0] = (SAddr << 1) + 0; //write Address
ronaldhklee 0:599009dbb3e5 207 crcbuf[1] = cmd[0];
ronaldhklee 0:599009dbb3e5 208 crcbuf[2] = (SAddr << 1) + 1; //read Address
ronaldhklee 0:599009dbb3e5 209 MLX90614_I2C.write(SAddr, cmd, 1, true);
ronaldhklee 0:599009dbb3e5 210 MLX90614_I2C.read(SAddr, cmd, 3);
ronaldhklee 0:599009dbb3e5 211
ronaldhklee 0:599009dbb3e5 212 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 0:599009dbb3e5 213
ronaldhklee 0:599009dbb3e5 214 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00)
ronaldhklee 0:599009dbb3e5 215 return (((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin
ronaldhklee 0:599009dbb3e5 216 -273.15 //C
ronaldhklee 0:599009dbb3e5 217 -0.18) //(3.3V-3)*0.6/V
ronaldhklee 0:599009dbb3e5 218 *1.8+32); //F
ronaldhklee 1:eb3bd21fba0b 219 else return ERROR_TEMP_CRC8; //Error
ronaldhklee 0:599009dbb3e5 220 }
ronaldhklee 0:599009dbb3e5 221
ronaldhklee 0:599009dbb3e5 222 uint8_t MLX90614_CRC8(uint8_t *data, int length)
ronaldhklee 0:599009dbb3e5 223 {
ronaldhklee 0:599009dbb3e5 224 uint8_t crc = 0;
ronaldhklee 0:599009dbb3e5 225
ronaldhklee 0:599009dbb3e5 226 while(length--) crc = MLX90614_crc8_table[crc ^ *data++];
ronaldhklee 0:599009dbb3e5 227
ronaldhklee 0:599009dbb3e5 228 return crc;
ronaldhklee 0:599009dbb3e5 229 }