Ok

Dependencies:   mbed_rtos_types Mutex mbed_rtos_storage mbed Semaphore

Committer:
daniwestside
Date:
Wed Nov 27 11:16:17 2019 +0000
Branch:
Sinthreads
Revision:
1:c9ef27da97b5
Parent:
0:85df64b421a8
Ok

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniwestside 0:85df64b421a8 1 #ifndef SI7021_H
daniwestside 0:85df64b421a8 2 #define SI7021_H
daniwestside 0:85df64b421a8 3
daniwestside 0:85df64b421a8 4 #include "mbed.h"
daniwestside 0:85df64b421a8 5
daniwestside 0:85df64b421a8 6 /** Si7012 Read Temperature Command */
daniwestside 0:85df64b421a8 7 #define READ_TEMP 0xE0 /* Read previous T data from RH measurement command*/
daniwestside 0:85df64b421a8 8 /** Si7012 Read RH Command */
daniwestside 0:85df64b421a8 9 #define READ_RH 0xE5 /* Perform RH (and T) measurement. */
daniwestside 0:85df64b421a8 10
daniwestside 0:85df64b421a8 11 /** Si7012 Read ID */
daniwestside 0:85df64b421a8 12 #define READ_ID1_1 0xFA
daniwestside 0:85df64b421a8 13 #define READ_ID1_2 0x0F
daniwestside 0:85df64b421a8 14 #define READ_ID2_1 0xFC
daniwestside 0:85df64b421a8 15 #define READ_ID2_2 0xC9
daniwestside 0:85df64b421a8 16
daniwestside 0:85df64b421a8 17 /** Si7012 Read Firmware Revision */
daniwestside 0:85df64b421a8 18 #define READ_FWREV_1 0x84
daniwestside 0:85df64b421a8 19 #define READ_FWREV_2 0xB8
daniwestside 0:85df64b421a8 20
daniwestside 0:85df64b421a8 21 /** I2C device address for Si7021 */
daniwestside 0:85df64b421a8 22 #define ADDR 0x80
daniwestside 0:85df64b421a8 23
daniwestside 0:85df64b421a8 24 /** I2C device frequency for Si7021 */
daniwestside 0:85df64b421a8 25 #define FREQ 100000
daniwestside 0:85df64b421a8 26
daniwestside 0:85df64b421a8 27 /** Device ID value for Si7021 */
daniwestside 0:85df64b421a8 28 #define DEVICE_ID 0x15
daniwestside 0:85df64b421a8 29
daniwestside 0:85df64b421a8 30 class Si7021
daniwestside 0:85df64b421a8 31 {
daniwestside 0:85df64b421a8 32 public:
daniwestside 0:85df64b421a8 33 Si7021(PinName sda, PinName scl);
daniwestside 0:85df64b421a8 34 ~Si7021();
daniwestside 0:85df64b421a8 35
daniwestside 0:85df64b421a8 36 /*
daniwestside 0:85df64b421a8 37 * Get last measured temperature data
daniwestside 0:85df64b421a8 38 * return: int32_t = temperature in millidegrees centigrade
daniwestside 0:85df64b421a8 39 */
daniwestside 0:85df64b421a8 40 int32_t get_temperature();
daniwestside 0:85df64b421a8 41
daniwestside 0:85df64b421a8 42 /*
daniwestside 0:85df64b421a8 43 * Get last measured relative humidity data
daniwestside 0:85df64b421a8 44 * return: uint32_t = relative humidity value in milli-percent
daniwestside 0:85df64b421a8 45 */
daniwestside 0:85df64b421a8 46 uint32_t get_humidity();
daniwestside 0:85df64b421a8 47
daniwestside 0:85df64b421a8 48 /*
daniwestside 0:85df64b421a8 49 * Perform measurement.
daniwestside 0:85df64b421a8 50 * Asynchronous callback can be provided (type void (*)(void)).
daniwestside 0:85df64b421a8 51 * return: 0 if successful, else one of the defined error codes.
daniwestside 0:85df64b421a8 52 */
daniwestside 0:85df64b421a8 53 bool measure();
daniwestside 0:85df64b421a8 54
daniwestside 0:85df64b421a8 55 /*
daniwestside 0:85df64b421a8 56 * Check if the sensor is active and responding. This will update the get_active value.
daniwestside 0:85df64b421a8 57 * Asynchronous callback can be provided (type void (*)(void)).
daniwestside 0:85df64b421a8 58 * return: 0 if successful, else one of the defined error codes.
daniwestside 0:85df64b421a8 59 */
daniwestside 0:85df64b421a8 60 bool check();
daniwestside 0:85df64b421a8 61
daniwestside 0:85df64b421a8 62 private:
daniwestside 0:85df64b421a8 63 I2C i2c;
daniwestside 0:85df64b421a8 64
daniwestside 0:85df64b421a8 65 uint8_t rx_buff[8];
daniwestside 0:85df64b421a8 66 uint8_t tx_buff[2];
daniwestside 0:85df64b421a8 67
daniwestside 0:85df64b421a8 68 uint32_t rhData;
daniwestside 0:85df64b421a8 69 int32_t tData;
daniwestside 0:85df64b421a8 70 };
daniwestside 0:85df64b421a8 71
daniwestside 0:85df64b421a8 72 #endif
daniwestside 0:85df64b421a8 73 Si7021::Si7021(PinName sda, PinName scl):i2c(sda, scl)
daniwestside 0:85df64b421a8 74 {
daniwestside 0:85df64b421a8 75 i2c.frequency(FREQ);
daniwestside 0:85df64b421a8 76 }
daniwestside 0:85df64b421a8 77
daniwestside 0:85df64b421a8 78 Si7021::~Si7021()
daniwestside 0:85df64b421a8 79 {
daniwestside 0:85df64b421a8 80
daniwestside 0:85df64b421a8 81 }
daniwestside 0:85df64b421a8 82
daniwestside 0:85df64b421a8 83 int32_t Si7021::get_temperature()
daniwestside 0:85df64b421a8 84 {
daniwestside 0:85df64b421a8 85 return tData;
daniwestside 0:85df64b421a8 86 }
daniwestside 0:85df64b421a8 87
daniwestside 0:85df64b421a8 88 uint32_t Si7021::get_humidity()
daniwestside 0:85df64b421a8 89 {
daniwestside 0:85df64b421a8 90 return rhData;
daniwestside 0:85df64b421a8 91 }
daniwestside 0:85df64b421a8 92
daniwestside 0:85df64b421a8 93 bool Si7021::measure()
daniwestside 0:85df64b421a8 94 {
daniwestside 0:85df64b421a8 95 tx_buff[0] = READ_RH;
daniwestside 0:85df64b421a8 96 if(i2c.write(ADDR, (char*)tx_buff, 1) != 0) return 0;
daniwestside 0:85df64b421a8 97 if(i2c.read(ADDR, (char*)rx_buff, 2) != 0) return 0;
daniwestside 0:85df64b421a8 98
daniwestside 0:85df64b421a8 99 rhData = ((uint32_t)rx_buff[0] << 8) + (rx_buff[1] & 0xFC);
daniwestside 0:85df64b421a8 100 rhData = (((rhData) * 15625L) >> 13) - 6000;
daniwestside 0:85df64b421a8 101
daniwestside 0:85df64b421a8 102 tx_buff[0] = READ_TEMP;
daniwestside 0:85df64b421a8 103 if(i2c.write(ADDR, (char*)tx_buff, 1) != 0) return 0;
daniwestside 0:85df64b421a8 104 if(i2c.read(ADDR, (char*)rx_buff, 2) != 0) return 0;
daniwestside 0:85df64b421a8 105
daniwestside 0:85df64b421a8 106 tData = ((uint32_t)rx_buff[0] << 8) + (rx_buff[1] & 0xFC);
daniwestside 0:85df64b421a8 107 tData = (((tData) * 21965L) >> 13) - 46850;
daniwestside 0:85df64b421a8 108
daniwestside 0:85df64b421a8 109 return 1;
daniwestside 0:85df64b421a8 110 }
daniwestside 0:85df64b421a8 111
daniwestside 0:85df64b421a8 112 bool Si7021::check()
daniwestside 0:85df64b421a8 113 {
daniwestside 0:85df64b421a8 114 tx_buff[0] = READ_ID2_1;
daniwestside 0:85df64b421a8 115 tx_buff[1] = READ_ID2_2;
daniwestside 0:85df64b421a8 116 if(i2c.write(ADDR, (char*)tx_buff, 2) != 0) return 0;
daniwestside 0:85df64b421a8 117 if(i2c.read(ADDR, (char*)rx_buff, 8) != 0) return 0;
daniwestside 0:85df64b421a8 118
daniwestside 0:85df64b421a8 119 if(rx_buff[0] == DEVICE_ID)
daniwestside 0:85df64b421a8 120 return true;
daniwestside 0:85df64b421a8 121 else return 0;
daniwestside 0:85df64b421a8 122 }