AM2315 I2C Temperature and Humidity Sensor. Tested on Nucleo STM32 F103RB with 3.3V supply and no pullup resistors and I2C level converter with 5V supply and pullup resistors as well.

Committer:
pici
Date:
Thu Sep 25 18:39:45 2014 +0000
Revision:
0:770879aaecd5
First Revision AM2315 I2C Temperature and Humidity Sensor.; Tested on Nucleo STM32 F103RB.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pici 0:770879aaecd5 1 #include "AM2315.h"
pici 0:770879aaecd5 2 #include "mbed.h"
pici 0:770879aaecd5 3
pici 0:770879aaecd5 4
pici 0:770879aaecd5 5 AM2315::AM2315(PinName SDA = I2C_SDA , PinName SCL = I2C_SCL ):i2c(SDA, SCL)
pici 0:770879aaecd5 6 {
pici 0:770879aaecd5 7 }
pici 0:770879aaecd5 8
pici 0:770879aaecd5 9 // I2C Temperature and Humidity Sensor AM2315
pici 0:770879aaecd5 10 //
pici 0:770879aaecd5 11 bool AM2315::read( )
pici 0:770879aaecd5 12 {
pici 0:770879aaecd5 13
pici 0:770879aaecd5 14 char data_write[5];
pici 0:770879aaecd5 15 char data_read[10];
pici 0:770879aaecd5 16 int i =0;
pici 0:770879aaecd5 17 for(i=0; i<8; i++)
pici 0:770879aaecd5 18 data_read[i]=0;
pici 0:770879aaecd5 19
pici 0:770879aaecd5 20 // Wake up the sensor
pici 0:770879aaecd5 21 // write single byte twice to wake up
pici 0:770879aaecd5 22 // single write is not enough
pici 0:770879aaecd5 23 data_write[0] = 0x00;
pici 0:770879aaecd5 24 i2c.write(AM2315_ADDR,data_write,1,0);
pici 0:770879aaecd5 25 i2c.write(AM2315_ADDR,data_write,1,0);
pici 0:770879aaecd5 26
pici 0:770879aaecd5 27 // Read temperature and humidity register
pici 0:770879aaecd5 28 // send request to AM2315
pici 0:770879aaecd5 29 data_write[0] = AM2315_REG_READ;
pici 0:770879aaecd5 30 data_write[1] = 0x00; // read from adr 0x00
pici 0:770879aaecd5 31 data_write[2] = 0x04; // read 4 bytes
pici 0:770879aaecd5 32 i2c.write(AM2315_ADDR, data_write, 3, 0); // with stop
pici 0:770879aaecd5 33
pici 0:770879aaecd5 34 // wait 2ms before we start to read reg
pici 0:770879aaecd5 35 wait_ms(2);
pici 0:770879aaecd5 36
pici 0:770879aaecd5 37 i2c.read(AM2315_ADDR, data_read, 8, 1);
pici 0:770879aaecd5 38
pici 0:770879aaecd5 39 if (data_read[0] != AM2315_REG_READ)
pici 0:770879aaecd5 40 return false;
pici 0:770879aaecd5 41 // check numbers of bytes read
pici 0:770879aaecd5 42 if (data_read[1] != 4)
pici 0:770879aaecd5 43 return false;
pici 0:770879aaecd5 44
pici 0:770879aaecd5 45 humidity = data_read[2];
pici 0:770879aaecd5 46 humidity *= 256;
pici 0:770879aaecd5 47 humidity += data_read[3];
pici 0:770879aaecd5 48 humidity /= 10;
pici 0:770879aaecd5 49
pici 0:770879aaecd5 50 celsius = data_read[4] & 0x7F;
pici 0:770879aaecd5 51 celsius *= 256;
pici 0:770879aaecd5 52 celsius += data_read[5];
pici 0:770879aaecd5 53 celsius /= 10;
pici 0:770879aaecd5 54
pici 0:770879aaecd5 55 if (data_read[4] >> 7)
pici 0:770879aaecd5 56 celsius = -(celsius);
pici 0:770879aaecd5 57
pici 0:770879aaecd5 58 return true;
pici 0:770879aaecd5 59 }
pici 0:770879aaecd5 60