Basic version of reading the temperature with a Si7021 sensor on the Happy Gecko STK board.

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }