Gabriel Silva
/
mlx90615_lpc1768
program for temperature reading with mlx90615
Mlx90615.cpp@2:c4552b8c47c0, 2020-07-16 (annotated)
- Committer:
- glsfacom
- Date:
- Thu Jul 16 10:58:18 2020 -0400
- Revision:
- 2:c4552b8c47c0
- Parent:
- 0:db513e91a2c9
One MLX setup
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
glsfacom | 0:db513e91a2c9 | 1 | #include "Mlx90615.h" |
glsfacom | 2:c4552b8c47c0 | 2 | #include "crc8.h" |
glsfacom | 0:db513e91a2c9 | 3 | |
glsfacom | 2:c4552b8c47c0 | 4 | extern Serial pc; |
glsfacom | 0:db513e91a2c9 | 5 | I2C i2c(p28, p27);//I2C_SDA, I2C_SCL |
glsfacom | 2:c4552b8c47c0 | 6 | |
glsfacom | 2:c4552b8c47c0 | 7 | inline void |
glsfacom | 2:c4552b8c47c0 | 8 | Mlx90615::wake() |
glsfacom | 0:db513e91a2c9 | 9 | { |
glsfacom | 0:db513e91a2c9 | 10 | /*SCL = 0; |
glsfacom | 0:db513e91a2c9 | 11 | wait_ms(50); |
glsfacom | 0:db513e91a2c9 | 12 | SCL = 1;*/ |
glsfacom | 0:db513e91a2c9 | 13 | MLX_VCC = 1; |
glsfacom | 2:c4552b8c47c0 | 14 | ThisThread::sleep_for(301);//Waiting for valid data as datasheet says |
glsfacom | 0:db513e91a2c9 | 15 | } |
glsfacom | 0:db513e91a2c9 | 16 | |
glsfacom | 2:c4552b8c47c0 | 17 | inline void |
glsfacom | 2:c4552b8c47c0 | 18 | Mlx90615::sleep(){ |
glsfacom | 0:db513e91a2c9 | 19 | MLX_VCC = 0; |
glsfacom | 0:db513e91a2c9 | 20 | } |
glsfacom | 0:db513e91a2c9 | 21 | |
glsfacom | 2:c4552b8c47c0 | 22 | float |
glsfacom | 2:c4552b8c47c0 | 23 | Mlx90615::read(unsigned char memory, unsigned char address){ |
glsfacom | 0:db513e91a2c9 | 24 | unsigned char crc, addr, status = 0; |
glsfacom | 2:c4552b8c47c0 | 25 | char read[2]; |
glsfacom | 2:c4552b8c47c0 | 26 | int ACK = 0; |
glsfacom | 0:db513e91a2c9 | 27 | |
glsfacom | 0:db513e91a2c9 | 28 | addr = memory + address; |
glsfacom | 2:c4552b8c47c0 | 29 | |
glsfacom | 2:c4552b8c47c0 | 30 | read[0] = 0x01; |
glsfacom | 2:c4552b8c47c0 | 31 | read[1] = 0x00; |
glsfacom | 0:db513e91a2c9 | 32 | |
glsfacom | 2:c4552b8c47c0 | 33 | char cmd = 0x27; |
glsfacom | 0:db513e91a2c9 | 34 | i2c.start(); |
glsfacom | 2:c4552b8c47c0 | 35 | ACK = i2c.write(0x5b<<1); |
glsfacom | 2:c4552b8c47c0 | 36 | if(!ACK) return -1; |
glsfacom | 2:c4552b8c47c0 | 37 | ACK = i2c.write(addr); |
glsfacom | 2:c4552b8c47c0 | 38 | if(!ACK) return -1; |
glsfacom | 2:c4552b8c47c0 | 39 | i2c.start(); |
glsfacom | 2:c4552b8c47c0 | 40 | ACK = i2c.write((0x5b<<1)|1); |
glsfacom | 2:c4552b8c47c0 | 41 | if(!ACK) return -1; |
glsfacom | 2:c4552b8c47c0 | 42 | read[0] = i2c.read(ACK); |
glsfacom | 2:c4552b8c47c0 | 43 | if(!ACK) return -1; |
glsfacom | 2:c4552b8c47c0 | 44 | read[1] = i2c.read(ACK); |
glsfacom | 2:c4552b8c47c0 | 45 | i2c.read(ACK); |
glsfacom | 2:c4552b8c47c0 | 46 | float temp = (float((read[1] << 8) | read[0])); |
glsfacom | 2:c4552b8c47c0 | 47 | return temp*0.02-273.15; |
glsfacom | 0:db513e91a2c9 | 48 | } |
glsfacom | 0:db513e91a2c9 | 49 | |
glsfacom | 2:c4552b8c47c0 | 50 | float |
glsfacom | 2:c4552b8c47c0 | 51 | Mlx90615::read_temperature(){ |
glsfacom | 2:c4552b8c47c0 | 52 | float temp = read(RAM, 0x07); |
glsfacom | 2:c4552b8c47c0 | 53 | int cont = 0; |
glsfacom | 0:db513e91a2c9 | 54 | while(temp == 0) |
glsfacom | 0:db513e91a2c9 | 55 | { |
glsfacom | 2:c4552b8c47c0 | 56 | if(cont == 100) |
glsfacom | 2:c4552b8c47c0 | 57 | { |
glsfacom | 2:c4552b8c47c0 | 58 | pc.printf("got 100 times 0\n"); |
glsfacom | 2:c4552b8c47c0 | 59 | cont = 0; |
glsfacom | 2:c4552b8c47c0 | 60 | } |
glsfacom | 0:db513e91a2c9 | 61 | wait_us(5000); |
glsfacom | 0:db513e91a2c9 | 62 | temp = read(RAM, 0x07); |
glsfacom | 2:c4552b8c47c0 | 63 | cont++; |
glsfacom | 0:db513e91a2c9 | 64 | } |
glsfacom | 0:db513e91a2c9 | 65 | return temp; |
glsfacom | 0:db513e91a2c9 | 66 | } |
glsfacom | 0:db513e91a2c9 | 67 | |
glsfacom | 2:c4552b8c47c0 | 68 | void |
glsfacom | 2:c4552b8c47c0 | 69 | Mlx90615::write(unsigned char address, unsigned int value){ |
glsfacom | 0:db513e91a2c9 | 70 | unsigned char addr = EEPROM + address; |
glsfacom | 2:c4552b8c47c0 | 71 | char *bytes; |
glsfacom | 2:c4552b8c47c0 | 72 | unsigned char crc, vh, vl; |
glsfacom | 0:db513e91a2c9 | 73 | vh = value >> 8; |
glsfacom | 0:db513e91a2c9 | 74 | vl = value; |
glsfacom | 0:db513e91a2c9 | 75 | bytes[0] = 0xB6; |
glsfacom | 0:db513e91a2c9 | 76 | bytes[1] = addr; |
glsfacom | 0:db513e91a2c9 | 77 | bytes[2] = vl; |
glsfacom | 0:db513e91a2c9 | 78 | bytes[3] = vh; |
glsfacom | 2:c4552b8c47c0 | 79 | crc = crc8(bytes, 4); |
glsfacom | 0:db513e91a2c9 | 80 | |
glsfacom | 2:c4552b8c47c0 | 81 | i2c.start(); |
glsfacom | 2:c4552b8c47c0 | 82 | i2c.write(0x5b<<1); |
glsfacom | 2:c4552b8c47c0 | 83 | i2c.write(addr); |
glsfacom | 2:c4552b8c47c0 | 84 | i2c.write(vl); |
glsfacom | 2:c4552b8c47c0 | 85 | i2c.write(vh); |
glsfacom | 2:c4552b8c47c0 | 86 | i2c.write(crc); |
glsfacom | 2:c4552b8c47c0 | 87 | i2c.stop(); |
glsfacom | 0:db513e91a2c9 | 88 | } |
glsfacom | 0:db513e91a2c9 | 89 | |
glsfacom | 2:c4552b8c47c0 | 90 | inline void |
glsfacom | 2:c4552b8c47c0 | 91 | Mlx90615::erase_eeprom_address(unsigned char address){ |
glsfacom | 2:c4552b8c47c0 | 92 | Mlx90615::write(address, 0x0000); |
glsfacom | 0:db513e91a2c9 | 93 | } |
glsfacom | 0:db513e91a2c9 | 94 | |
glsfacom | 2:c4552b8c47c0 | 95 | void |
glsfacom | 2:c4552b8c47c0 | 96 | Mlx90615::set_emissivity(float e){ |
glsfacom | 0:db513e91a2c9 | 97 | unsigned int emissivity; |
glsfacom | 0:db513e91a2c9 | 98 | emissivity = 16384 * e; |
glsfacom | 0:db513e91a2c9 | 99 | erase_eeprom_address(0x03); |
glsfacom | 2:c4552b8c47c0 | 100 | ThisThread::sleep_for(5); |
glsfacom | 2:c4552b8c47c0 | 101 | Mlx90615::write(0x03, emissivity); |
glsfacom | 0:db513e91a2c9 | 102 | } |