Canberk Sönmez
/
SHT21
A simple example adopting SHT21 Arduino library to mbed.
SHT21.cpp@1:f4a1942b4486, 2017-09-13 (annotated)
- Committer:
- odtulumbedder
- Date:
- Wed Sep 13 13:36:04 2017 +0000
- Revision:
- 1:f4a1942b4486
file order fixed.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
odtulumbedder | 1:f4a1942b4486 | 1 | #include "SHT21.hpp" |
odtulumbedder | 1:f4a1942b4486 | 2 | |
odtulumbedder | 1:f4a1942b4486 | 3 | const uint16_t SHT21::POLYNOMIAL = 0x131; |
odtulumbedder | 1:f4a1942b4486 | 4 | |
odtulumbedder | 1:f4a1942b4486 | 5 | SHT21::SHT21(PinName sda, PinName scl, char addr) : |
odtulumbedder | 1:f4a1942b4486 | 6 | addr_(addr), |
odtulumbedder | 1:f4a1942b4486 | 7 | pi2c_(new I2C(sda, scl)), |
odtulumbedder | 1:f4a1942b4486 | 8 | i2c_(*pi2c_) { |
odtulumbedder | 1:f4a1942b4486 | 9 | } |
odtulumbedder | 1:f4a1942b4486 | 10 | |
odtulumbedder | 1:f4a1942b4486 | 11 | SHT21::SHT21(I2C &i2c, char addr) : |
odtulumbedder | 1:f4a1942b4486 | 12 | addr_(addr), |
odtulumbedder | 1:f4a1942b4486 | 13 | pi2c_(NULL), |
odtulumbedder | 1:f4a1942b4486 | 14 | i2c_(i2c) { |
odtulumbedder | 1:f4a1942b4486 | 15 | } |
odtulumbedder | 1:f4a1942b4486 | 16 | |
odtulumbedder | 1:f4a1942b4486 | 17 | float SHT21::temperature() { |
odtulumbedder | 1:f4a1942b4486 | 18 | uint16_t r = readRaw(TRIGGER_T_MEASUREMENT_HM); |
odtulumbedder | 1:f4a1942b4486 | 19 | r &= ~0x0003; |
odtulumbedder | 1:f4a1942b4486 | 20 | return (-46.85 + 175.72/65536 * (float) r); |
odtulumbedder | 1:f4a1942b4486 | 21 | } |
odtulumbedder | 1:f4a1942b4486 | 22 | |
odtulumbedder | 1:f4a1942b4486 | 23 | float SHT21::humidity() { |
odtulumbedder | 1:f4a1942b4486 | 24 | uint16_t r = readRaw(TRIGGER_RH_MEASUREMENT_HM); |
odtulumbedder | 1:f4a1942b4486 | 25 | r &= ~0x0003; |
odtulumbedder | 1:f4a1942b4486 | 26 | return (-6.0 + 125.0/65536 * (float) r); |
odtulumbedder | 1:f4a1942b4486 | 27 | } |
odtulumbedder | 1:f4a1942b4486 | 28 | |
odtulumbedder | 1:f4a1942b4486 | 29 | void SHT21::reset() { |
odtulumbedder | 1:f4a1942b4486 | 30 | uint8_t pcmd [] = { SOFT_RESET }; |
odtulumbedder | 1:f4a1942b4486 | 31 | i2c_.write(addr_, (const char *) pcmd, 1); |
odtulumbedder | 1:f4a1942b4486 | 32 | wait_ms(15); |
odtulumbedder | 1:f4a1942b4486 | 33 | } |
odtulumbedder | 1:f4a1942b4486 | 34 | |
odtulumbedder | 1:f4a1942b4486 | 35 | void SHT21::serialNumber(uint8_t *serialNumber) { |
odtulumbedder | 1:f4a1942b4486 | 36 | uint8_t data[8]; |
odtulumbedder | 1:f4a1942b4486 | 37 | uint8_t pcmd0[2] = { 0xFA, 0x0F }; |
odtulumbedder | 1:f4a1942b4486 | 38 | uint8_t pcmd1[2] = { 0xFC, 0xC9 }; |
odtulumbedder | 1:f4a1942b4486 | 39 | uint8_t i = 0; |
odtulumbedder | 1:f4a1942b4486 | 40 | i2c_.write(addr_, (const char *) pcmd0, 2); |
odtulumbedder | 1:f4a1942b4486 | 41 | i2c_.read(addr_, (char *) data, 8); |
odtulumbedder | 1:f4a1942b4486 | 42 | |
odtulumbedder | 1:f4a1942b4486 | 43 | serialNumber[5] = data[i++]; |
odtulumbedder | 1:f4a1942b4486 | 44 | i++; |
odtulumbedder | 1:f4a1942b4486 | 45 | serialNumber[4] = data[i++]; |
odtulumbedder | 1:f4a1942b4486 | 46 | i++; |
odtulumbedder | 1:f4a1942b4486 | 47 | serialNumber[3] = data[i++]; |
odtulumbedder | 1:f4a1942b4486 | 48 | i++; |
odtulumbedder | 1:f4a1942b4486 | 49 | serialNumber[2] = data[i++]; |
odtulumbedder | 1:f4a1942b4486 | 50 | i = 0; |
odtulumbedder | 1:f4a1942b4486 | 51 | |
odtulumbedder | 1:f4a1942b4486 | 52 | i2c_.write(addr_, (const char *) pcmd1, 2); |
odtulumbedder | 1:f4a1942b4486 | 53 | i2c_.read(addr_, (char *) data, 6); |
odtulumbedder | 1:f4a1942b4486 | 54 | |
odtulumbedder | 1:f4a1942b4486 | 55 | serialNumber[1] = data[i++]; |
odtulumbedder | 1:f4a1942b4486 | 56 | serialNumber[0] = data[i++]; |
odtulumbedder | 1:f4a1942b4486 | 57 | i++; |
odtulumbedder | 1:f4a1942b4486 | 58 | serialNumber[7] = data[i++]; |
odtulumbedder | 1:f4a1942b4486 | 59 | serialNumber[8] = data[i++]; |
odtulumbedder | 1:f4a1942b4486 | 60 | i = 0; |
odtulumbedder | 1:f4a1942b4486 | 61 | } |
odtulumbedder | 1:f4a1942b4486 | 62 | |
odtulumbedder | 1:f4a1942b4486 | 63 | SHT21::~SHT21() { |
odtulumbedder | 1:f4a1942b4486 | 64 | if (pi2c_) delete pi2c_; |
odtulumbedder | 1:f4a1942b4486 | 65 | } |
odtulumbedder | 1:f4a1942b4486 | 66 | |
odtulumbedder | 1:f4a1942b4486 | 67 | uint16_t SHT21::readRaw(uint8_t cmd) { |
odtulumbedder | 1:f4a1942b4486 | 68 | uint8_t checksum; |
odtulumbedder | 1:f4a1942b4486 | 69 | uint8_t data[2]; |
odtulumbedder | 1:f4a1942b4486 | 70 | uint16_t result; |
odtulumbedder | 1:f4a1942b4486 | 71 | |
odtulumbedder | 1:f4a1942b4486 | 72 | uint8_t pcmd [] = { cmd }; |
odtulumbedder | 1:f4a1942b4486 | 73 | |
odtulumbedder | 1:f4a1942b4486 | 74 | i2c_.write(addr_, (const char *) pcmd, 1); |
odtulumbedder | 1:f4a1942b4486 | 75 | i2c_.read(addr_, (char *) data, 2); |
odtulumbedder | 1:f4a1942b4486 | 76 | i2c_.read(addr_, (char *) &checksum, 1); |
odtulumbedder | 1:f4a1942b4486 | 77 | |
odtulumbedder | 1:f4a1942b4486 | 78 | result = data[0] << 8; |
odtulumbedder | 1:f4a1942b4486 | 79 | result += data[1]; |
odtulumbedder | 1:f4a1942b4486 | 80 | |
odtulumbedder | 1:f4a1942b4486 | 81 | if (crcChecksum(data, 2, checksum)) { |
odtulumbedder | 1:f4a1942b4486 | 82 | reset(); |
odtulumbedder | 1:f4a1942b4486 | 83 | return 1; |
odtulumbedder | 1:f4a1942b4486 | 84 | } |
odtulumbedder | 1:f4a1942b4486 | 85 | return result; |
odtulumbedder | 1:f4a1942b4486 | 86 | } |
odtulumbedder | 1:f4a1942b4486 | 87 | |
odtulumbedder | 1:f4a1942b4486 | 88 | bool SHT21::crcChecksum(const uint8_t *data, uint8_t sz, uint8_t checksum) { |
odtulumbedder | 1:f4a1942b4486 | 89 | uint8_t crc = 0; |
odtulumbedder | 1:f4a1942b4486 | 90 | |
odtulumbedder | 1:f4a1942b4486 | 91 | for (uint8_t i = 0; i < sz; ++i) { |
odtulumbedder | 1:f4a1942b4486 | 92 | crc ^= data[i]; |
odtulumbedder | 1:f4a1942b4486 | 93 | for (uint8_t j /* bit index */ = 8; j > 0; --j) { |
odtulumbedder | 1:f4a1942b4486 | 94 | if (crc & 0x80) |
odtulumbedder | 1:f4a1942b4486 | 95 | crc = (crc << 1) ^ POLYNOMIAL; |
odtulumbedder | 1:f4a1942b4486 | 96 | else |
odtulumbedder | 1:f4a1942b4486 | 97 | crc = (crc << 1); |
odtulumbedder | 1:f4a1942b4486 | 98 | } |
odtulumbedder | 1:f4a1942b4486 | 99 | } |
odtulumbedder | 1:f4a1942b4486 | 100 | |
odtulumbedder | 1:f4a1942b4486 | 101 | return crc == checksum; |
odtulumbedder | 1:f4a1942b4486 | 102 | } |