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