A Library for the AMS ENS210 temperature and humidity sensor.

Dependents:   AMS_CCS811_gas_sensor AMS_CCS811_gas_sensor

Committer:
UHSLMarcus
Date:
Wed Mar 08 09:44:13 2017 +0000
Revision:
8:1a7d241afbcb
Parent:
7:d61772b5cd3b
.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
UHSLMarcus 0:7088b1bdc2e5 1
UHSLMarcus 3:3b427231e5a7 2 #include "AMS_ENS210.h"
UHSLMarcus 0:7088b1bdc2e5 3
UHSLMarcus 8:1a7d241afbcb 4 AMS_ENS210::AMS_ENS210(PinName sda, PinName scl) :
UHSLMarcus 8:1a7d241afbcb 5 _temp_mode(CONFIG_TEMP_OP_MODE),
UHSLMarcus 8:1a7d241afbcb 6 _humid_mode(CONFIG_HUMID_OP_MODE),
UHSLMarcus 3:3b427231e5a7 7 _power_mode(CONFIG_POWER_MODE),
UHSLMarcus 3:3b427231e5a7 8 _reset(0),
UHSLMarcus 3:3b427231e5a7 9 temp_reading(0),
UHSLMarcus 7:d61772b5cd3b 10 humid_reading(0),
UHSLMarcus 8:1a7d241afbcb 11 _i2c(sda, scl)
UHSLMarcus 8:1a7d241afbcb 12 { }
UHSLMarcus 0:7088b1bdc2e5 13
UHSLMarcus 8:1a7d241afbcb 14 AMS_ENS210::AMS_ENS210(PinName sda, PinName scl, bool temp_single_shot, bool humid_single_shot) :
UHSLMarcus 8:1a7d241afbcb 15 _temp_mode(temp_single_shot),
UHSLMarcus 8:1a7d241afbcb 16 _humid_mode(humid_single_shot),
UHSLMarcus 3:3b427231e5a7 17 _power_mode(CONFIG_POWER_MODE),
UHSLMarcus 3:3b427231e5a7 18 _reset(0),
UHSLMarcus 3:3b427231e5a7 19 temp_reading(0),
UHSLMarcus 7:d61772b5cd3b 20 humid_reading(0),
UHSLMarcus 8:1a7d241afbcb 21 _i2c(sda, scl)
UHSLMarcus 8:1a7d241afbcb 22 { }
UHSLMarcus 0:7088b1bdc2e5 23
UHSLMarcus 8:1a7d241afbcb 24 AMS_ENS210::AMS_ENS210(PinName sda, PinName scl, bool temp_single_shot, bool humid_single_shot, bool low_power) :
UHSLMarcus 8:1a7d241afbcb 25 _temp_mode(temp_single_shot),
UHSLMarcus 8:1a7d241afbcb 26 _humid_mode(humid_single_shot),
UHSLMarcus 3:3b427231e5a7 27 _power_mode(low_power),
UHSLMarcus 3:3b427231e5a7 28 _reset(0),
UHSLMarcus 3:3b427231e5a7 29 temp_reading(0),
UHSLMarcus 7:d61772b5cd3b 30 humid_reading(0),
UHSLMarcus 8:1a7d241afbcb 31 _i2c(sda, scl)
UHSLMarcus 8:1a7d241afbcb 32 { }
UHSLMarcus 0:7088b1bdc2e5 33
UHSLMarcus 3:3b427231e5a7 34 AMS_ENS210::~AMS_ENS210() {}
UHSLMarcus 0:7088b1bdc2e5 35
UHSLMarcus 8:1a7d241afbcb 36 bool AMS_ENS210::init()
UHSLMarcus 8:1a7d241afbcb 37 {
UHSLMarcus 8:1a7d241afbcb 38
UHSLMarcus 0:7088b1bdc2e5 39 return write_config();
UHSLMarcus 8:1a7d241afbcb 40
UHSLMarcus 0:7088b1bdc2e5 41 }
UHSLMarcus 0:7088b1bdc2e5 42
UHSLMarcus 8:1a7d241afbcb 43 bool AMS_ENS210::reset()
UHSLMarcus 8:1a7d241afbcb 44 {
UHSLMarcus 8:1a7d241afbcb 45
UHSLMarcus 0:7088b1bdc2e5 46 _reset = true;
UHSLMarcus 0:7088b1bdc2e5 47 bool success = write_config(true, false);
UHSLMarcus 0:7088b1bdc2e5 48 _reset = false;
UHSLMarcus 8:1a7d241afbcb 49
UHSLMarcus 0:7088b1bdc2e5 50 return success;
UHSLMarcus 8:1a7d241afbcb 51
UHSLMarcus 0:7088b1bdc2e5 52 }
UHSLMarcus 0:7088b1bdc2e5 53
UHSLMarcus 8:1a7d241afbcb 54 bool AMS_ENS210::low_power_mode(bool low_power)
UHSLMarcus 8:1a7d241afbcb 55 {
UHSLMarcus 0:7088b1bdc2e5 56 _power_mode = low_power;
UHSLMarcus 3:3b427231e5a7 57 return write_config(true, false);
UHSLMarcus 0:7088b1bdc2e5 58 }
UHSLMarcus 0:7088b1bdc2e5 59
UHSLMarcus 8:1a7d241afbcb 60 bool AMS_ENS210::low_power_mode()
UHSLMarcus 8:1a7d241afbcb 61 {
UHSLMarcus 0:7088b1bdc2e5 62 return read_config(true, false)[0] & 1; // just mask bit 0
UHSLMarcus 0:7088b1bdc2e5 63 }
UHSLMarcus 0:7088b1bdc2e5 64
UHSLMarcus 8:1a7d241afbcb 65 bool AMS_ENS210::is_active()
UHSLMarcus 8:1a7d241afbcb 66 {
UHSLMarcus 3:3b427231e5a7 67 char output[1];
UHSLMarcus 3:3b427231e5a7 68 i2c_read(SYS_STATUS, output, 1);
UHSLMarcus 8:1a7d241afbcb 69 return output[0] & 1;
UHSLMarcus 0:7088b1bdc2e5 70 }
UHSLMarcus 0:7088b1bdc2e5 71
UHSLMarcus 8:1a7d241afbcb 72 bool AMS_ENS210::temp_continuous_mode(bool continuous)
UHSLMarcus 8:1a7d241afbcb 73 {
UHSLMarcus 3:3b427231e5a7 74 _temp_mode = continuous;
UHSLMarcus 3:3b427231e5a7 75 return write_config(false, true);
UHSLMarcus 3:3b427231e5a7 76 }
UHSLMarcus 3:3b427231e5a7 77
UHSLMarcus 8:1a7d241afbcb 78 bool AMS_ENS210::temp_continuous_mode()
UHSLMarcus 8:1a7d241afbcb 79 {
UHSLMarcus 0:7088b1bdc2e5 80 return read_config(false, true)[0] & 1; // just mask bit 0
UHSLMarcus 0:7088b1bdc2e5 81 }
UHSLMarcus 0:7088b1bdc2e5 82
UHSLMarcus 8:1a7d241afbcb 83 bool AMS_ENS210::humid_continuous_mode(bool continuous)
UHSLMarcus 8:1a7d241afbcb 84 {
UHSLMarcus 3:3b427231e5a7 85 _humid_mode = continuous;
UHSLMarcus 3:3b427231e5a7 86 return write_config(false, true);
UHSLMarcus 0:7088b1bdc2e5 87 }
UHSLMarcus 0:7088b1bdc2e5 88
UHSLMarcus 8:1a7d241afbcb 89 bool AMS_ENS210::humid_continuous_mode()
UHSLMarcus 8:1a7d241afbcb 90 {
UHSLMarcus 3:3b427231e5a7 91 return (read_config(false, true)[0] >> 1) & 1; // shift bit 1 and mask
UHSLMarcus 0:7088b1bdc2e5 92 }
UHSLMarcus 0:7088b1bdc2e5 93
UHSLMarcus 8:1a7d241afbcb 94 bool AMS_ENS210::start(bool temp, bool humid)
UHSLMarcus 8:1a7d241afbcb 95 {
UHSLMarcus 8:1a7d241afbcb 96 char cmd[1] = {0 | temp | (humid << 1)};
UHSLMarcus 8:1a7d241afbcb 97 return i2c_write(SENS_START, cmd, 1) == 1; //_i2c.write(ENS210_SLAVE_ADDR, cmd, 2) == 2;
UHSLMarcus 6:475b764b720d 98 }
UHSLMarcus 6:475b764b720d 99
UHSLMarcus 8:1a7d241afbcb 100 bool AMS_ENS210::stop(bool temp, bool humid)
UHSLMarcus 8:1a7d241afbcb 101 {
UHSLMarcus 3:3b427231e5a7 102 char cmd[1] = {0 | temp | (humid << 1)};
UHSLMarcus 8:1a7d241afbcb 103 return i2c_write(SENS_STOP, cmd, 1) == 1; //_i2c.write(ENS210_SLAVE_ADDR, cmd, 2) == 2;
UHSLMarcus 0:7088b1bdc2e5 104 }
UHSLMarcus 0:7088b1bdc2e5 105
UHSLMarcus 8:1a7d241afbcb 106 bool AMS_ENS210::temp_is_measuring()
UHSLMarcus 8:1a7d241afbcb 107 {
UHSLMarcus 3:3b427231e5a7 108 char output[1];
UHSLMarcus 0:7088b1bdc2e5 109 i2c_read(SENS_STATUS, output, 1);
UHSLMarcus 8:1a7d241afbcb 110 return output[0] & 1;
UHSLMarcus 0:7088b1bdc2e5 111 }
UHSLMarcus 8:1a7d241afbcb 112
UHSLMarcus 8:1a7d241afbcb 113 bool AMS_ENS210::humid_is_measuring()
UHSLMarcus 8:1a7d241afbcb 114 {
UHSLMarcus 3:3b427231e5a7 115 char output[1];
UHSLMarcus 0:7088b1bdc2e5 116 i2c_read(SENS_STATUS, output, 1);
UHSLMarcus 8:1a7d241afbcb 117 return output[0] >> 1 & 1;
UHSLMarcus 0:7088b1bdc2e5 118 }
UHSLMarcus 0:7088b1bdc2e5 119
UHSLMarcus 8:1a7d241afbcb 120 bool AMS_ENS210::temp_has_data()
UHSLMarcus 8:1a7d241afbcb 121 {
UHSLMarcus 8:1a7d241afbcb 122
UHSLMarcus 0:7088b1bdc2e5 123 char output[3];
UHSLMarcus 0:7088b1bdc2e5 124 i2c_read(SENS_TEMP, output, 3);
UHSLMarcus 8:1a7d241afbcb 125
UHSLMarcus 0:7088b1bdc2e5 126 // do crc7
UHSLMarcus 8:1a7d241afbcb 127 // Store read data to avoid reading from I2C again
UHSLMarcus 0:7088b1bdc2e5 128 temp_reading = 0 | output[0] | (output[1] << 8); // bytes 1 and 2 make the 16 bit data
UHSLMarcus 8:1a7d241afbcb 129
UHSLMarcus 3:3b427231e5a7 130 bool valid = output[2] & 1; // bit 0 of byte 3 is the valid flag
UHSLMarcus 8:1a7d241afbcb 131
UHSLMarcus 8:1a7d241afbcb 132
UHSLMarcus 3:3b427231e5a7 133 if (!valid) {
UHSLMarcus 3:3b427231e5a7 134 if (!temp_continuous_mode()) { // when in single shot mode make sure sensor has started
UHSLMarcus 8:1a7d241afbcb 135 if (!temp_is_measuring())
UHSLMarcus 3:3b427231e5a7 136 start(true, false); // set start bit if sensor is idle
UHSLMarcus 3:3b427231e5a7 137 }
UHSLMarcus 3:3b427231e5a7 138 }
UHSLMarcus 8:1a7d241afbcb 139
UHSLMarcus 3:3b427231e5a7 140 return valid;
UHSLMarcus 0:7088b1bdc2e5 141 }
UHSLMarcus 0:7088b1bdc2e5 142
UHSLMarcus 8:1a7d241afbcb 143 bool AMS_ENS210::humid_has_data()
UHSLMarcus 8:1a7d241afbcb 144 {
UHSLMarcus 8:1a7d241afbcb 145
UHSLMarcus 0:7088b1bdc2e5 146 char output[3];
UHSLMarcus 0:7088b1bdc2e5 147 i2c_read(SENS_HUMID, output, 3);
UHSLMarcus 8:1a7d241afbcb 148
UHSLMarcus 0:7088b1bdc2e5 149 // do crc7
UHSLMarcus 8:1a7d241afbcb 150 // Store read data to avoid reading from I2C again
UHSLMarcus 3:3b427231e5a7 151 humid_reading = 0 | output[0] | (output[1] << 8); // bytes 1 and 2 make the 16 bit data
UHSLMarcus 8:1a7d241afbcb 152
UHSLMarcus 3:3b427231e5a7 153 bool valid = output[2] & 1; // bit 0 of byte 3 is the valid flag
UHSLMarcus 8:1a7d241afbcb 154
UHSLMarcus 3:3b427231e5a7 155 if (!valid) {
UHSLMarcus 8:1a7d241afbcb 156 if (!humid_continuous_mode()) { // when in single shot mode make sure sensor has started first
UHSLMarcus 8:1a7d241afbcb 157 if (!humid_is_measuring())
UHSLMarcus 3:3b427231e5a7 158 start(false, true); // set start bit if sensor is idle
UHSLMarcus 3:3b427231e5a7 159 }
UHSLMarcus 3:3b427231e5a7 160 }
UHSLMarcus 8:1a7d241afbcb 161
UHSLMarcus 3:3b427231e5a7 162 return valid;
UHSLMarcus 0:7088b1bdc2e5 163 }
UHSLMarcus 0:7088b1bdc2e5 164
UHSLMarcus 8:1a7d241afbcb 165 uint16_t AMS_ENS210::temp_read()
UHSLMarcus 8:1a7d241afbcb 166 {
UHSLMarcus 8:1a7d241afbcb 167
UHSLMarcus 0:7088b1bdc2e5 168 uint16_t reading = 0;
UHSLMarcus 8:1a7d241afbcb 169
UHSLMarcus 3:3b427231e5a7 170 if (!temp_continuous_mode()) { // when in single shot mode, data is read and saved in temp_has_data()
UHSLMarcus 0:7088b1bdc2e5 171 reading = temp_reading;
UHSLMarcus 0:7088b1bdc2e5 172 } else {
UHSLMarcus 0:7088b1bdc2e5 173 char output[3];
UHSLMarcus 0:7088b1bdc2e5 174 i2c_read(SENS_TEMP, output, 3);
UHSLMarcus 8:1a7d241afbcb 175
UHSLMarcus 0:7088b1bdc2e5 176 // do crc7
UHSLMarcus 2:f5a7883ae9c2 177 if (output[2] & 1) // bit 0 of byte 3 is the valid flag
UHSLMarcus 0:7088b1bdc2e5 178 reading = 0 | output[0] | (output[1] << 8); // bytes 1 and 2 make the 16 bit data
UHSLMarcus 0:7088b1bdc2e5 179 }
UHSLMarcus 8:1a7d241afbcb 180
UHSLMarcus 0:7088b1bdc2e5 181 return reading;
UHSLMarcus 0:7088b1bdc2e5 182 }
UHSLMarcus 0:7088b1bdc2e5 183
UHSLMarcus 8:1a7d241afbcb 184 uint16_t AMS_ENS210::humid_read()
UHSLMarcus 8:1a7d241afbcb 185 {
UHSLMarcus 0:7088b1bdc2e5 186 uint16_t reading = 0;
UHSLMarcus 8:1a7d241afbcb 187
UHSLMarcus 3:3b427231e5a7 188 if (!humid_continuous_mode()) { // when in single shot mode, data is read and saved in humid_has_data()
UHSLMarcus 0:7088b1bdc2e5 189 reading = humid_reading;
UHSLMarcus 0:7088b1bdc2e5 190 } else {
UHSLMarcus 0:7088b1bdc2e5 191 char output[3];
UHSLMarcus 0:7088b1bdc2e5 192 i2c_read(SENS_HUMID, output, 3);
UHSLMarcus 8:1a7d241afbcb 193
UHSLMarcus 0:7088b1bdc2e5 194 // do crc7
UHSLMarcus 2:f5a7883ae9c2 195 if (output[2] & 1) // bit 0 of byte 3 is the valid flag
UHSLMarcus 0:7088b1bdc2e5 196 reading = 0 | output[0] | (output[1] << 8); // bytes 1 and 2 make the 16 bit data
UHSLMarcus 0:7088b1bdc2e5 197 }
UHSLMarcus 8:1a7d241afbcb 198
UHSLMarcus 0:7088b1bdc2e5 199 return reading;
UHSLMarcus 0:7088b1bdc2e5 200 }
UHSLMarcus 0:7088b1bdc2e5 201
UHSLMarcus 0:7088b1bdc2e5 202 /*** Private ***/
UHSLMarcus 0:7088b1bdc2e5 203
UHSLMarcus 8:1a7d241afbcb 204 bool AMS_ENS210::write_config(bool system, bool sensor)
UHSLMarcus 8:1a7d241afbcb 205 {
UHSLMarcus 0:7088b1bdc2e5 206 int w_bytes = 0;
UHSLMarcus 3:3b427231e5a7 207 char cmd[1];
UHSLMarcus 8:1a7d241afbcb 208
UHSLMarcus 0:7088b1bdc2e5 209 if (system) {
UHSLMarcus 3:3b427231e5a7 210 cmd[0] = 0 | _power_mode | _reset << 7; // bit 0 of SYS_CTRL is power mode, bit 7 is reset
UHSLMarcus 8:1a7d241afbcb 211 w_bytes += i2c_write(SYS_CONFIG, cmd, 1); //_i2c.write(ENS210_SLAVE_ADDR, cmd, 2);
UHSLMarcus 0:7088b1bdc2e5 212 }
UHSLMarcus 8:1a7d241afbcb 213
UHSLMarcus 0:7088b1bdc2e5 214 if (sensor) {
UHSLMarcus 3:3b427231e5a7 215 cmd[0] = 0 | _temp_mode | (_humid_mode << 1); // bit 0 is temp mode, bit 1 is humid mode
UHSLMarcus 8:1a7d241afbcb 216 w_bytes += i2c_write(SENS_OP_MODE, cmd, 1); //_i2c.write(ENS210_SLAVE_ADDR, cmd, 2);
UHSLMarcus 0:7088b1bdc2e5 217 }
UHSLMarcus 8:1a7d241afbcb 218
UHSLMarcus 3:3b427231e5a7 219 return w_bytes == (system + sensor);
UHSLMarcus 0:7088b1bdc2e5 220 }
UHSLMarcus 0:7088b1bdc2e5 221
UHSLMarcus 8:1a7d241afbcb 222 const char *AMS_ENS210::read_config(bool system, bool sensor) // todo, maybe throw excpetion if i2c read fails?
UHSLMarcus 8:1a7d241afbcb 223 {
UHSLMarcus 8:1a7d241afbcb 224
UHSLMarcus 3:3b427231e5a7 225 static char output[2] = {0, 0};
UHSLMarcus 8:1a7d241afbcb 226
UHSLMarcus 0:7088b1bdc2e5 227 if (system)
UHSLMarcus 0:7088b1bdc2e5 228 i2c_read(SYS_CONFIG, output, 1);
UHSLMarcus 8:1a7d241afbcb 229
UHSLMarcus 8:1a7d241afbcb 230 if (sensor)
UHSLMarcus 3:3b427231e5a7 231 i2c_read(SENS_OP_MODE, output+system, 1);
UHSLMarcus 3:3b427231e5a7 232
UHSLMarcus 0:7088b1bdc2e5 233 return output;
UHSLMarcus 8:1a7d241afbcb 234
UHSLMarcus 0:7088b1bdc2e5 235 }
UHSLMarcus 0:7088b1bdc2e5 236
UHSLMarcus 8:1a7d241afbcb 237 int AMS_ENS210::i2c_read(char reg_addr, char* output, int len)
UHSLMarcus 8:1a7d241afbcb 238 {
UHSLMarcus 8:1a7d241afbcb 239
UHSLMarcus 0:7088b1bdc2e5 240 int read_count = 0;
UHSLMarcus 8:1a7d241afbcb 241
UHSLMarcus 8:1a7d241afbcb 242
UHSLMarcus 8:1a7d241afbcb 243 char reg_cmd[1];
UHSLMarcus 8:1a7d241afbcb 244 reg_cmd[0] = reg_addr;
UHSLMarcus 8:1a7d241afbcb 245 _i2c.write(ENS210_SLAVE_ADDR, reg_cmd, 1, true);
UHSLMarcus 8:1a7d241afbcb 246 wait_ms(10);
UHSLMarcus 8:1a7d241afbcb 247 int read_res = _i2c.read(ENS210_SLAVE_ADDR, output, len);
UHSLMarcus 8:1a7d241afbcb 248 if (read_res == 0) read_count = len;
UHSLMarcus 8:1a7d241afbcb 249
UHSLMarcus 0:7088b1bdc2e5 250 return read_count;
UHSLMarcus 3:3b427231e5a7 251 }
UHSLMarcus 3:3b427231e5a7 252
UHSLMarcus 8:1a7d241afbcb 253 int AMS_ENS210::i2c_write(char reg_addr, char* input, int len)
UHSLMarcus 8:1a7d241afbcb 254 {
UHSLMarcus 8:1a7d241afbcb 255
UHSLMarcus 3:3b427231e5a7 256 int write_count = 0;
UHSLMarcus 8:1a7d241afbcb 257
UHSLMarcus 8:1a7d241afbcb 258
UHSLMarcus 8:1a7d241afbcb 259 char cmd[len+1];
UHSLMarcus 8:1a7d241afbcb 260 cmd[0] = reg_addr;
UHSLMarcus 8:1a7d241afbcb 261 memcpy(cmd+1, input, len);
UHSLMarcus 8:1a7d241afbcb 262 write_count = _i2c.write(ENS210_SLAVE_ADDR, cmd, len+1) + 1;
UHSLMarcus 8:1a7d241afbcb 263
UHSLMarcus 3:3b427231e5a7 264 return write_count;
UHSLMarcus 0:7088b1bdc2e5 265 }