Steven Cooreman
/
i2c-rht
Basic version of reading the temperature with a Si7021 sensor on the Happy Gecko STK board.
main.cpp@1:cc6bfdd667ea, 2016-03-17 (annotated)
- Committer:
- stevew817
- Date:
- Thu Mar 17 11:33:02 2016 +0000
- Revision:
- 1:cc6bfdd667ea
- Parent:
- 0:2629b8684f00
Update measurement algo
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
stevew817 | 0:2629b8684f00 | 1 | #include "mbed.h" |
stevew817 | 0:2629b8684f00 | 2 | |
stevew817 | 0:2629b8684f00 | 3 | /******************************************************************************* |
stevew817 | 0:2629b8684f00 | 4 | ******************************* DEFINES *********************************** |
stevew817 | 0:2629b8684f00 | 5 | ******************************************************************************/ |
stevew817 | 0:2629b8684f00 | 6 | |
stevew817 | 0:2629b8684f00 | 7 | /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ |
stevew817 | 0:2629b8684f00 | 8 | |
stevew817 | 0:2629b8684f00 | 9 | /** Si7013 Read Temperature Command */ |
stevew817 | 1:cc6bfdd667ea | 10 | #define SI7013_READ_TEMP_POST 0xE0 /* Read previous T data from RH measurement |
stevew817 | 0:2629b8684f00 | 11 | command*/ |
stevew817 | 1:cc6bfdd667ea | 12 | #define SI7013_READ_TEMP 0xE3 /* Stand-alone read temperature command */ |
stevew817 | 1:cc6bfdd667ea | 13 | |
stevew817 | 0:2629b8684f00 | 14 | /** Si7013 Read RH Command */ |
stevew817 | 0:2629b8684f00 | 15 | #define SI7013_READ_RH 0xE5 /* Perform RH (and T) measurement. */ |
stevew817 | 0:2629b8684f00 | 16 | /** Si7013 Read ID */ |
stevew817 | 0:2629b8684f00 | 17 | #define SI7013_READ_ID1_1 0xFA |
stevew817 | 0:2629b8684f00 | 18 | #define SI7013_READ_ID1_2 0x0F |
stevew817 | 0:2629b8684f00 | 19 | #define SI7013_READ_ID2_1 0xFc |
stevew817 | 0:2629b8684f00 | 20 | #define SI7013_READ_ID2_2 0xc9 |
stevew817 | 0:2629b8684f00 | 21 | /** Si7013 Read Firmware Revision */ |
stevew817 | 0:2629b8684f00 | 22 | #define SI7013_READ_FWREV_1 0x84 |
stevew817 | 0:2629b8684f00 | 23 | #define SI7013_READ_FWREV_2 0xB8 |
stevew817 | 0:2629b8684f00 | 24 | |
stevew817 | 0:2629b8684f00 | 25 | /** I2C device address for Si7013 */ |
stevew817 | 0:2629b8684f00 | 26 | #define SI7013_ADDR 0x82 |
stevew817 | 0:2629b8684f00 | 27 | /** I2C device address for Si7021 */ |
stevew817 | 0:2629b8684f00 | 28 | #define SI7021_ADDR 0x80 |
stevew817 | 0:2629b8684f00 | 29 | |
stevew817 | 0:2629b8684f00 | 30 | |
stevew817 | 0:2629b8684f00 | 31 | /** Device ID value for Si7013 */ |
stevew817 | 0:2629b8684f00 | 32 | #define SI7013_DEVICE_ID 0x0D |
stevew817 | 0:2629b8684f00 | 33 | /** Device ID value for Si7020 */ |
stevew817 | 0:2629b8684f00 | 34 | #define SI7020_DEVICE_ID 0x14 |
stevew817 | 0:2629b8684f00 | 35 | /** Device ID value for Si7021 */ |
stevew817 | 0:2629b8684f00 | 36 | #define SI7021_DEVICE_ID 0x15 |
stevew817 | 0:2629b8684f00 | 37 | |
stevew817 | 0:2629b8684f00 | 38 | /** @endcond */ |
stevew817 | 0:2629b8684f00 | 39 | |
stevew817 | 0:2629b8684f00 | 40 | /******************************************************************************* |
stevew817 | 0:2629b8684f00 | 41 | ******************************* Variables *********************************** |
stevew817 | 0:2629b8684f00 | 42 | ******************************************************************************/ |
stevew817 | 0:2629b8684f00 | 43 | |
stevew817 | 0:2629b8684f00 | 44 | //LED1 |
stevew817 | 0:2629b8684f00 | 45 | DigitalOut myled(LED1); |
stevew817 | 0:2629b8684f00 | 46 | //I2C-bus with RHT sensor (Si7021) on Happy Gecko STK |
stevew817 | 0:2629b8684f00 | 47 | I2C tempSensor(PD6, PD7); |
stevew817 | 0:2629b8684f00 | 48 | //And enable line for the sensor |
stevew817 | 0:2629b8684f00 | 49 | DigitalOut SENS_EN(PC8); |
stevew817 | 0:2629b8684f00 | 50 | |
stevew817 | 0:2629b8684f00 | 51 | uint8_t _address = 0; |
stevew817 | 0:2629b8684f00 | 52 | uint8_t _rx_buf[8] = {0}; |
stevew817 | 0:2629b8684f00 | 53 | uint8_t _tx_buf[2] = {0}; |
stevew817 | 0:2629b8684f00 | 54 | |
stevew817 | 0:2629b8684f00 | 55 | uint32_t _rhData = 0; |
stevew817 | 0:2629b8684f00 | 56 | int32_t _tData = 0; |
stevew817 | 0:2629b8684f00 | 57 | |
stevew817 | 0:2629b8684f00 | 58 | /******************************************************************************* |
stevew817 | 0:2629b8684f00 | 59 | ******************************* FUNC *********************************** |
stevew817 | 0:2629b8684f00 | 60 | ******************************************************************************/ |
stevew817 | 0:2629b8684f00 | 61 | |
stevew817 | 1:cc6bfdd667ea | 62 | void readSensor(void) { |
stevew817 | 0:2629b8684f00 | 63 | int temp = 0; |
stevew817 | 1:cc6bfdd667ea | 64 | unsigned int humidity = 0; |
stevew817 | 1:cc6bfdd667ea | 65 | |
stevew817 | 1:cc6bfdd667ea | 66 | //send humidity command |
stevew817 | 1:cc6bfdd667ea | 67 | _tx_buf[0] = SI7013_READ_RH; |
stevew817 | 1:cc6bfdd667ea | 68 | tempSensor.write(_address, (char*)_tx_buf, 1); |
stevew817 | 1:cc6bfdd667ea | 69 | tempSensor.read(_address, (char*)_rx_buf, 2); |
stevew817 | 1:cc6bfdd667ea | 70 | |
stevew817 | 1:cc6bfdd667ea | 71 | /* Store raw RH info */ |
stevew817 | 1:cc6bfdd667ea | 72 | humidity = ((uint32_t)_rx_buf[0] << 8) + (_rx_buf[1] & 0xFC); |
stevew817 | 1:cc6bfdd667ea | 73 | /* Convert value to milli-percent */ |
stevew817 | 1:cc6bfdd667ea | 74 | humidity = (((humidity) * 15625L) >> 13) - 6000; |
stevew817 | 0:2629b8684f00 | 75 | |
stevew817 | 0:2629b8684f00 | 76 | //send temperature command |
stevew817 | 1:cc6bfdd667ea | 77 | _tx_buf[0] = SI7013_READ_TEMP_POST; |
stevew817 | 0:2629b8684f00 | 78 | tempSensor.write(_address, (char*)_tx_buf, 1); |
stevew817 | 0:2629b8684f00 | 79 | tempSensor.read(_address, (char*)_rx_buf, 2); |
stevew817 | 0:2629b8684f00 | 80 | |
stevew817 | 0:2629b8684f00 | 81 | /* Store raw temperature info */ |
stevew817 | 0:2629b8684f00 | 82 | temp = ((uint32_t)_rx_buf[0] << 8) + (_rx_buf[1] & 0xFC); |
stevew817 | 0:2629b8684f00 | 83 | /* Convert to milli-degC */ |
stevew817 | 1:cc6bfdd667ea | 84 | temp = (((temp) * 21965L) >> 13) - 46850; |
stevew817 | 0:2629b8684f00 | 85 | |
stevew817 | 1:cc6bfdd667ea | 86 | _tData = temp; |
stevew817 | 1:cc6bfdd667ea | 87 | _rhData = humidity; |
stevew817 | 0:2629b8684f00 | 88 | } |
stevew817 | 0:2629b8684f00 | 89 | |
stevew817 | 0:2629b8684f00 | 90 | int main() { |
stevew817 | 0:2629b8684f00 | 91 | //Enable the sensor |
stevew817 | 0:2629b8684f00 | 92 | SENS_EN = 1; |
stevew817 | 0:2629b8684f00 | 93 | |
stevew817 | 0:2629b8684f00 | 94 | //Check if the sensor is present |
stevew817 | 0:2629b8684f00 | 95 | _tx_buf[0] = SI7013_READ_ID2_1; |
stevew817 | 0:2629b8684f00 | 96 | _tx_buf[1] = SI7013_READ_ID2_2; |
stevew817 | 0:2629b8684f00 | 97 | |
stevew817 | 0:2629b8684f00 | 98 | _address = SI7021_ADDR; //TODO: update if we use another sensor |
stevew817 | 0:2629b8684f00 | 99 | |
stevew817 | 0:2629b8684f00 | 100 | tempSensor.write(_address, (char*)_tx_buf, 2); |
stevew817 | 0:2629b8684f00 | 101 | tempSensor.read(_address, (char*)_rx_buf, 8); |
stevew817 | 0:2629b8684f00 | 102 | //Check ID byte |
stevew817 | 0:2629b8684f00 | 103 | if(_rx_buf[0] != SI7021_DEVICE_ID) { |
stevew817 | 0:2629b8684f00 | 104 | printf("No sensor present!\r\n"); |
stevew817 | 0:2629b8684f00 | 105 | while(1); |
stevew817 | 0:2629b8684f00 | 106 | } |
stevew817 | 0:2629b8684f00 | 107 | |
stevew817 | 0:2629b8684f00 | 108 | while(1) { |
stevew817 | 0:2629b8684f00 | 109 | wait(1); |
stevew817 | 1:cc6bfdd667ea | 110 | readSensor(); |
stevew817 | 0:2629b8684f00 | 111 | printf("Temperature: %d,%3d\r\n", _tData / 1000, _tData % 1000); |
stevew817 | 0:2629b8684f00 | 112 | } |
stevew817 | 0:2629b8684f00 | 113 | } |