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.

AM2315.cpp

Committer:
pici
Date:
2014-09-25
Revision:
0:770879aaecd5

File content as of revision 0:770879aaecd5:

#include "AM2315.h"
#include "mbed.h"


AM2315::AM2315(PinName SDA = I2C_SDA , PinName SCL = I2C_SCL ):i2c(SDA, SCL)
{
}

// I2C Temperature and Humidity Sensor AM2315
//
bool AM2315::read( )
{

  char data_write[5];
  char data_read[10];
  int i =0;
  for(i=0; i<8; i++)
    data_read[i]=0;

  // Wake up the sensor
  // write single byte twice to wake up
  // single write is not enough
  data_write[0] = 0x00;
  i2c.write(AM2315_ADDR,data_write,1,0); 
  i2c.write(AM2315_ADDR,data_write,1,0);
  
  // Read temperature and humidity register
  // send request to AM2315
  data_write[0] = AM2315_REG_READ;
  data_write[1] = 0x00;  // read from adr 0x00
  data_write[2] = 0x04;  // read 4 bytes
  i2c.write(AM2315_ADDR, data_write, 3, 0); // with stop
  
  // wait 2ms before we start to read reg
  wait_ms(2); 
  
  i2c.read(AM2315_ADDR, data_read, 8, 1);

  if (data_read[0] != AM2315_REG_READ) 
    return false;
  // check numbers of bytes read
  if (data_read[1] != 4) 
    return false; 
    
  humidity = data_read[2];
  humidity *= 256;
  humidity += data_read[3];
  humidity /= 10;
  
  celsius = data_read[4] & 0x7F;
  celsius *= 256;
  celsius += data_read[5];
  celsius /= 10;

  if (data_read[4] >> 7) 
    celsius = -(celsius);

  return true;
}