Ronald Lee / Mbed 2 deprecated MLX90614

Dependencies:   mbed

Committer:
ronaldhklee
Date:
Tue Mar 21 07:29:14 2017 +0000
Revision:
0:599009dbb3e5
Child:
1:eb3bd21fba0b
MLX90614 Temp. sensor

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 0:599009dbb3e5 40 else return 0xff;
ronaldhklee 0:599009dbb3e5 41 }
ronaldhklee 0:599009dbb3e5 42
ronaldhklee 0:599009dbb3e5 43 float getTempC_Ambi(uint8_t SAddr)
ronaldhklee 0:599009dbb3e5 44 {
ronaldhklee 0:599009dbb3e5 45 char cmd[3] = { 0 };
ronaldhklee 0:599009dbb3e5 46 uint8_t crcbuf[6] = { 0 };
ronaldhklee 0:599009dbb3e5 47 uint8_t writeAddr, readAddr;
ronaldhklee 0:599009dbb3e5 48
ronaldhklee 0:599009dbb3e5 49 writeAddr = (SAddr << 1) + 0;
ronaldhklee 0:599009dbb3e5 50 readAddr = (SAddr << 1) + 1;
ronaldhklee 0:599009dbb3e5 51
ronaldhklee 0:599009dbb3e5 52 crcbuf[0] = writeAddr; //write Address
ronaldhklee 0:599009dbb3e5 53 crcbuf[1] = cmd[0] = OPCODE_RAM | RAM_TA;
ronaldhklee 0:599009dbb3e5 54 crcbuf[2] = readAddr; //read Address
ronaldhklee 0:599009dbb3e5 55
ronaldhklee 0:599009dbb3e5 56 MLX90614_I2C.write(writeAddr, cmd, 1, true);
ronaldhklee 0:599009dbb3e5 57 MLX90614_I2C.read(readAddr, cmd, 3);
ronaldhklee 0:599009dbb3e5 58
ronaldhklee 0:599009dbb3e5 59 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 0:599009dbb3e5 60
ronaldhklee 0:599009dbb3e5 61 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00)
ronaldhklee 0:599009dbb3e5 62 return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin
ronaldhklee 0:599009dbb3e5 63 -273.15 //C
ronaldhklee 0:599009dbb3e5 64 -0.18); //(3.3V-3)*0.6/V
ronaldhklee 0:599009dbb3e5 65 else return 0xffffffff; //Error
ronaldhklee 0:599009dbb3e5 66 }
ronaldhklee 0:599009dbb3e5 67
ronaldhklee 0:599009dbb3e5 68 float getTempC_Obj1(uint8_t SAddr)
ronaldhklee 0:599009dbb3e5 69 {
ronaldhklee 0:599009dbb3e5 70 char cmd[3] = { 0 };
ronaldhklee 0:599009dbb3e5 71 uint8_t crcbuf[6] = { 0 };
ronaldhklee 0:599009dbb3e5 72 uint8_t writeAddr, readAddr;
ronaldhklee 0:599009dbb3e5 73
ronaldhklee 0:599009dbb3e5 74 writeAddr = (SAddr << 1) + 0;
ronaldhklee 0:599009dbb3e5 75 readAddr = (SAddr << 1) + 1;
ronaldhklee 0:599009dbb3e5 76
ronaldhklee 0:599009dbb3e5 77 crcbuf[0] = writeAddr; //write Address
ronaldhklee 0:599009dbb3e5 78 crcbuf[1] = cmd[0] = OPCODE_RAM | RAM_TOBJ1;
ronaldhklee 0:599009dbb3e5 79 crcbuf[2] = readAddr; //read Address
ronaldhklee 0:599009dbb3e5 80
ronaldhklee 0:599009dbb3e5 81 MLX90614_I2C.write(writeAddr, cmd, 1, true);
ronaldhklee 0:599009dbb3e5 82 MLX90614_I2C.read(readAddr, cmd, 3);
ronaldhklee 0:599009dbb3e5 83
ronaldhklee 0:599009dbb3e5 84 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 0:599009dbb3e5 85
ronaldhklee 0:599009dbb3e5 86 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00)
ronaldhklee 0:599009dbb3e5 87 return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin
ronaldhklee 0:599009dbb3e5 88 -273.15 //C
ronaldhklee 0:599009dbb3e5 89 -0.18); //(3.3V-3)*0.6/V
ronaldhklee 0:599009dbb3e5 90 else return 0xffffffff; //Error
ronaldhklee 0:599009dbb3e5 91 }
ronaldhklee 0:599009dbb3e5 92
ronaldhklee 0:599009dbb3e5 93 float getTempC_Obj2(uint8_t SAddr)
ronaldhklee 0:599009dbb3e5 94 {
ronaldhklee 0:599009dbb3e5 95 char cmd[3] = { 0 };
ronaldhklee 0:599009dbb3e5 96 uint8_t crcbuf[6] = { 0 };
ronaldhklee 0:599009dbb3e5 97 uint8_t writeAddr, readAddr;
ronaldhklee 0:599009dbb3e5 98
ronaldhklee 0:599009dbb3e5 99 writeAddr = (SAddr << 1) + 0;
ronaldhklee 0:599009dbb3e5 100 readAddr = (SAddr << 1) + 1;
ronaldhklee 0:599009dbb3e5 101
ronaldhklee 0:599009dbb3e5 102 crcbuf[0] = writeAddr; //write Address
ronaldhklee 0:599009dbb3e5 103 crcbuf[1] = cmd[0] = OPCODE_RAM | RAM_TOBJ2;
ronaldhklee 0:599009dbb3e5 104 crcbuf[2] = readAddr; //read Address
ronaldhklee 0:599009dbb3e5 105
ronaldhklee 0:599009dbb3e5 106 MLX90614_I2C.write(writeAddr, cmd, 1, true);
ronaldhklee 0:599009dbb3e5 107 MLX90614_I2C.read(readAddr, cmd, 3);
ronaldhklee 0:599009dbb3e5 108
ronaldhklee 0:599009dbb3e5 109 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 0:599009dbb3e5 110
ronaldhklee 0:599009dbb3e5 111 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00)
ronaldhklee 0:599009dbb3e5 112 return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin
ronaldhklee 0:599009dbb3e5 113 -273.15 //C
ronaldhklee 0:599009dbb3e5 114 -0.18); //(3.3V-3)*0.6/V
ronaldhklee 0:599009dbb3e5 115 else return 0xffffffff; //Error
ronaldhklee 0:599009dbb3e5 116 }
ronaldhklee 0:599009dbb3e5 117
ronaldhklee 0:599009dbb3e5 118 float getTempC(uint8_t SAddr, uint8_t memAddr)
ronaldhklee 0:599009dbb3e5 119 {
ronaldhklee 0:599009dbb3e5 120 char cmd[3] = { 0 };
ronaldhklee 0:599009dbb3e5 121 uint8_t crcbuf[6] = { 0 };
ronaldhklee 0:599009dbb3e5 122
ronaldhklee 0:599009dbb3e5 123 cmd[0] = OPCODE_RAM | memAddr;
ronaldhklee 0:599009dbb3e5 124 crcbuf[0] = (SAddr << 1) + 0; //write Address
ronaldhklee 0:599009dbb3e5 125 crcbuf[1] = cmd[0];
ronaldhklee 0:599009dbb3e5 126 crcbuf[2] = (SAddr << 1) + 1; //read Address
ronaldhklee 0:599009dbb3e5 127
ronaldhklee 0:599009dbb3e5 128 MLX90614_I2C.write((SAddr<<1)+0, cmd, 1, true);
ronaldhklee 0:599009dbb3e5 129 MLX90614_I2C.read((SAddr<<1)+1, cmd, 3);
ronaldhklee 0:599009dbb3e5 130
ronaldhklee 0:599009dbb3e5 131 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 0:599009dbb3e5 132
ronaldhklee 0:599009dbb3e5 133 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00)
ronaldhklee 0:599009dbb3e5 134 return ((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin
ronaldhklee 0:599009dbb3e5 135 -273.15 //C
ronaldhklee 0:599009dbb3e5 136 -0.18); //(3.3V-3)*0.6/V
ronaldhklee 0:599009dbb3e5 137 else return 0xffffffff; //Error
ronaldhklee 0:599009dbb3e5 138 }
ronaldhklee 0:599009dbb3e5 139
ronaldhklee 0:599009dbb3e5 140 float getTempF(uint8_t SAddr, uint8_t memAddr)
ronaldhklee 0:599009dbb3e5 141 {
ronaldhklee 0:599009dbb3e5 142 char cmd[3] = { 0 };
ronaldhklee 0:599009dbb3e5 143 uint8_t crcbuf[6] = { 0 };
ronaldhklee 0:599009dbb3e5 144
ronaldhklee 0:599009dbb3e5 145 cmd[0] = OPCODE_RAM | memAddr;
ronaldhklee 0:599009dbb3e5 146 crcbuf[0] = (SAddr << 1) + 0; //write Address
ronaldhklee 0:599009dbb3e5 147 crcbuf[1] = cmd[0];
ronaldhklee 0:599009dbb3e5 148 crcbuf[2] = (SAddr << 1) + 1; //read Address
ronaldhklee 0:599009dbb3e5 149 MLX90614_I2C.write(SAddr, cmd, 1, true);
ronaldhklee 0:599009dbb3e5 150 MLX90614_I2C.read(SAddr, cmd, 3);
ronaldhklee 0:599009dbb3e5 151
ronaldhklee 0:599009dbb3e5 152 for (uint8_t cnt = 0; cnt < 3; cnt++) crcbuf[cnt+3] = (uint8_t)cmd[cnt];
ronaldhklee 0:599009dbb3e5 153
ronaldhklee 0:599009dbb3e5 154 if (MLX90614_CRC8(crcbuf, 6) == (uint8_t)0x00)
ronaldhklee 0:599009dbb3e5 155 return (((0.02*static_cast<float>((cmd[1]<<8)|cmd[0])) //Kelvin
ronaldhklee 0:599009dbb3e5 156 -273.15 //C
ronaldhklee 0:599009dbb3e5 157 -0.18) //(3.3V-3)*0.6/V
ronaldhklee 0:599009dbb3e5 158 *1.8+32); //F
ronaldhklee 0:599009dbb3e5 159 else return 0xffffffff; //Error
ronaldhklee 0:599009dbb3e5 160 }
ronaldhklee 0:599009dbb3e5 161
ronaldhklee 0:599009dbb3e5 162 uint8_t MLX90614_CRC8(uint8_t *data, int length)
ronaldhklee 0:599009dbb3e5 163 {
ronaldhklee 0:599009dbb3e5 164 uint8_t crc = 0;
ronaldhklee 0:599009dbb3e5 165
ronaldhklee 0:599009dbb3e5 166 while(length--) crc = MLX90614_crc8_table[crc ^ *data++];
ronaldhklee 0:599009dbb3e5 167
ronaldhklee 0:599009dbb3e5 168 return crc;
ronaldhklee 0:599009dbb3e5 169 }