program for temperature reading with mlx90615

Dependencies:   crc8

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?

UserRevisionLine numberNew 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 }