A simple example adopting SHT21 Arduino library to mbed.

Dependencies:   mbed

Committer:
odtulumbedder
Date:
Wed Sep 13 13:36:04 2017 +0000
Revision:
1:f4a1942b4486
file order fixed.

Who changed what in which revision?

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