Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
si7021.cpp@0:9909c9c7d326, 2017-09-12 (annotated)
- Committer:
- ninensei
- Date:
- Tue Sep 12 17:17:03 2017 +0000
- Revision:
- 0:9909c9c7d326
Initial driver release
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| ninensei | 0:9909c9c7d326 | 1 | #include "si7021.h" |
| ninensei | 0:9909c9c7d326 | 2 | |
| ninensei | 0:9909c9c7d326 | 3 | #define SI7021A20_I2C_ADDR 0x80 |
| ninensei | 0:9909c9c7d326 | 4 | |
| ninensei | 0:9909c9c7d326 | 5 | #define SI7021A20_CMD_MEAS_RH_HMM 0xE5 |
| ninensei | 0:9909c9c7d326 | 6 | #define SI7021A20_CMD_MEAS_RH_NHMM 0xF5 |
| ninensei | 0:9909c9c7d326 | 7 | #define SI7021A20_CMD_MEAS_TEMP_HMM 0xE3 |
| ninensei | 0:9909c9c7d326 | 8 | #define SI7021A20_CMD_MEAS_TEMP_NHMM 0xF3 |
| ninensei | 0:9909c9c7d326 | 9 | #define SI7021A20_CMD_READ_TEMP 0xE0 |
| ninensei | 0:9909c9c7d326 | 10 | #define SI7021A20_CMD_RESET 0xFE |
| ninensei | 0:9909c9c7d326 | 11 | #define SI7021A20_CMD_WRITE_USER1 0xE6 |
| ninensei | 0:9909c9c7d326 | 12 | #define SI7021A20_CMD_WRITE_USER2 0xE7 |
| ninensei | 0:9909c9c7d326 | 13 | #define SI7021A20_CMD_WRITE_HEAT_CTRL 0x51 |
| ninensei | 0:9909c9c7d326 | 14 | #define SI7021A20_CMD_READ_HEAT_CTRL 0x11 |
| ninensei | 0:9909c9c7d326 | 15 | #define SI7021A20_CMD_READ_ID1 0xFA0F |
| ninensei | 0:9909c9c7d326 | 16 | #define SI7021A20_CMD_READ_ID2 0xFCC9 |
| ninensei | 0:9909c9c7d326 | 17 | #define SI7021A20_REGF_ID2_DEV_ID 0x15 |
| ninensei | 0:9909c9c7d326 | 18 | #define SI7021A20_CMD_READ_FW_REV 0x84B8 |
| ninensei | 0:9909c9c7d326 | 19 | |
| ninensei | 0:9909c9c7d326 | 20 | bool SI7021::_i2c_transfer(int address, void * buff, size_t write_size, size_t read_size) |
| ninensei | 0:9909c9c7d326 | 21 | { |
| ninensei | 0:9909c9c7d326 | 22 | bool ok; |
| ninensei | 0:9909c9c7d326 | 23 | bool expect_response = (read_size != 0); |
| ninensei | 0:9909c9c7d326 | 24 | |
| ninensei | 0:9909c9c7d326 | 25 | ok = !_i2c->write(address, (char*)buff, write_size, expect_response); |
| ninensei | 0:9909c9c7d326 | 26 | if (ok && expect_response) |
| ninensei | 0:9909c9c7d326 | 27 | ok = !_i2c->read(address, (char*)buff, read_size); |
| ninensei | 0:9909c9c7d326 | 28 | |
| ninensei | 0:9909c9c7d326 | 29 | return ok; |
| ninensei | 0:9909c9c7d326 | 30 | } |
| ninensei | 0:9909c9c7d326 | 31 | |
| ninensei | 0:9909c9c7d326 | 32 | /* |
| ninensei | 0:9909c9c7d326 | 33 | bool SI7021::_validate(void) |
| ninensei | 0:9909c9c7d326 | 34 | { |
| ninensei | 0:9909c9c7d326 | 35 | bool ok; |
| ninensei | 0:9909c9c7d326 | 36 | uint8_t buff[4]; |
| ninensei | 0:9909c9c7d326 | 37 | |
| ninensei | 0:9909c9c7d326 | 38 | buff[0] = (uint8_t)(SI7021A20_CMD_READ_ID2 >> 8); |
| ninensei | 0:9909c9c7d326 | 39 | buff[1] = (uint8_t)(SI7021A20_CMD_READ_ID2); |
| ninensei | 0:9909c9c7d326 | 40 | |
| ninensei | 0:9909c9c7d326 | 41 | ok = (i2c_transfer(SI7021A20_I2C_ADDR, buff, 2, 1)) && |
| ninensei | 0:9909c9c7d326 | 42 | (SI7021A20_REGF_ID2_DEV_ID == buff[0]); |
| ninensei | 0:9909c9c7d326 | 43 | |
| ninensei | 0:9909c9c7d326 | 44 | return ok; |
| ninensei | 0:9909c9c7d326 | 45 | } |
| ninensei | 0:9909c9c7d326 | 46 | */ |
| ninensei | 0:9909c9c7d326 | 47 | |
| ninensei | 0:9909c9c7d326 | 48 | bool SI7021::read(si7021_measurements_t * data) { |
| ninensei | 0:9909c9c7d326 | 49 | bool ok; |
| ninensei | 0:9909c9c7d326 | 50 | union { |
| ninensei | 0:9909c9c7d326 | 51 | char cmd; |
| ninensei | 0:9909c9c7d326 | 52 | struct { |
| ninensei | 0:9909c9c7d326 | 53 | uint8_t meas_msb; |
| ninensei | 0:9909c9c7d326 | 54 | uint8_t meas_lsb; |
| ninensei | 0:9909c9c7d326 | 55 | }; |
| ninensei | 0:9909c9c7d326 | 56 | } buff; |
| ninensei | 0:9909c9c7d326 | 57 | |
| ninensei | 0:9909c9c7d326 | 58 | buff.cmd = SI7021A20_CMD_MEAS_RH_HMM; |
| ninensei | 0:9909c9c7d326 | 59 | ok = (_i2c_transfer(SI7021A20_I2C_ADDR, &buff, 1, 2)); |
| ninensei | 0:9909c9c7d326 | 60 | if (ok) { |
| ninensei | 0:9909c9c7d326 | 61 | // Humidity% = measurement * 125/65536 - 6 |
| ninensei | 0:9909c9c7d326 | 62 | int meas_raw = ((int)buff.meas_msb << 8) + buff.meas_lsb; |
| ninensei | 0:9909c9c7d326 | 63 | data->humidity_PR = (float)meas_raw * (125.0F/65536.0F) - 6.0F; |
| ninensei | 0:9909c9c7d326 | 64 | // data->humidity = meas_raw / 2 - 1573; |
| ninensei | 0:9909c9c7d326 | 65 | // data->humidity_norm = 262; |
| ninensei | 0:9909c9c7d326 | 66 | // printf("<humidityH/r = %f/%d>", Humidity, meas_raw); |
| ninensei | 0:9909c9c7d326 | 67 | |
| ninensei | 0:9909c9c7d326 | 68 | buff.cmd = SI7021A20_CMD_READ_TEMP; |
| ninensei | 0:9909c9c7d326 | 69 | ok = _i2c_transfer(SI7021A20_I2C_ADDR, &buff, 1, 2); |
| ninensei | 0:9909c9c7d326 | 70 | } |
| ninensei | 0:9909c9c7d326 | 71 | if (ok) { |
| ninensei | 0:9909c9c7d326 | 72 | // TempC = measurement * 175.72/65536 - 46.85 |
| ninensei | 0:9909c9c7d326 | 73 | int meas_raw = ((int)buff.meas_msb << 8) + buff.meas_lsb; |
| ninensei | 0:9909c9c7d326 | 74 | data->temp_C = meas_raw * (175.72/65536.0) - 46.85; |
| ninensei | 0:9909c9c7d326 | 75 | // data->temp = meas_raw / 2 - 8736; |
| ninensei | 0:9909c9c7d326 | 76 | // data->temp_norm = 186; |
| ninensei | 0:9909c9c7d326 | 77 | // printf("<tempC/F/r = %f/%f/%d>", Temp, Temp * 9 / 5 + 32, meas_raw); |
| ninensei | 0:9909c9c7d326 | 78 | } |
| ninensei | 0:9909c9c7d326 | 79 | return ok; |
| ninensei | 0:9909c9c7d326 | 80 | } |