Arduino-TWI
Two-Wire Interface (TWI) library for Arduino
Si70XX.h
Go to the documentation of this file.
1 
19 #ifndef Si70XX_H
20 #define Si70XX_H
21 
22 #include "TWI.h"
23 #include <math.h>
24 
25 #ifndef CHARBITS
26 #define CHARBITS 8
27 #endif
28 
51 class Si70XX : protected TWI::Device {
52 public:
57  TWI::Device(twi, 0x40)
58  {}
59 
66  bool read_user_register(uint8_t &reg)
67  {
68  return (read(READ_RHT_USER_REG_1, reg));
69  }
70 
77  bool read_electronic_serial_number(uint8_t snr[8])
78  {
79  uint8_t sna[8];
80  uint8_t snb[6];
81  uint16_t cmd;
82  uint8_t crc;
83  int count;
84  size_t j;
85 
86  // Read SNA and check crc
87  if (!acquire()) return (false);
88  cmd = READ_ID_1;
89  count = write(&cmd, sizeof(cmd));
90  if (count != sizeof(cmd)) goto err;
91  count = read(sna, sizeof(sna));
92  if (count != sizeof(sna)) goto err;
93  crc = 0;
94  j = 0;
95  for (size_t i = 0; i < sizeof(sna);) {
96  crc = crc_update(crc, sna[i]);
97  snr[j++] = sna[i++];
98  if (sna[i++] != crc) goto err;
99  }
100 
101  // Read SNB and check crc
102  cmd = READ_ID_2;
103  count = write(&cmd, sizeof(cmd));
104  if (count != sizeof(cmd)) goto err;
105  count = read(&snb, sizeof(snb));
106  if (count != sizeof(snb)) goto err;
107  crc = 0;
108  for (size_t i = 0; i < sizeof(snb); ) {
109  crc = crc_update(crc, snb[i]);
110  snr[j++] = snb[i++];
111  crc = crc_update(crc, snb[i]);
112  snr[j++] = snb[i++];
113  if (snb[i++] != crc) goto err;
114  }
115  return (release());
116 
117  err:
118  release();
119  return (false);
120  }
121 
128  bool read_firmware_revision(uint8_t &rev)
129  {
130  uint16_t cmd = READ_REV;
131  int count = 0;
132  if (!acquire()) return (false);
133  count = write(&cmd, sizeof(cmd));
134  count = read(&rev, sizeof(rev));
135  if (!release()) return (false);
136  return (count == sizeof(rev));
137  }
138 
145  {
146  return (issue(MEASURE_RH_NO_HOLD));
147  }
148 
155  {
156  uint16_t value;
157  if (!read(value)) (NAN);
158  return (((125.00 * value) / 65536) - 6.00);
159  }
160 
167  {
168  uint16_t value;
169  if (!issue(READ_RH_TEMP)) return (NAN);
170  if (!read(value, false)) return (NAN);
171  return (((175.72 * value) / 65536) - 46.85);
172  }
173 
181  {
182  return (issue(MEASURE_TEMP_NO_HOLD));
183  }
184 
191  {
192  uint16_t value;
193  if (!read(value)) return (NAN);
194  return (((175.72 * value) / 65536) - 46.85);
195  }
196 
197 protected:
201  enum Command {
206  READ_RH_TEMP = 0xE0,
207  RESET = 0xFE,
210  READ_ID_1 = 0x0FFA,
211  READ_ID_2 = 0xC8FC,
212  READ_REV = 0xB884
213  } __attribute__((packed));
214 
220  bool issue(uint8_t cmd)
221  {
222  if (!acquire()) return (false);
223  int count = write(&cmd, sizeof(cmd));
224  if (!release()) return (false);
225  return (count == sizeof(cmd));
226  }
227 
235  bool read(uint16_t& value, bool check = true)
236  {
237  uint8_t buf[3];
238  int size;
239  int count = 0;
240 
241  size = check ? sizeof(buf) : sizeof(buf) - 1;
242  for (int retry = 0; retry < 20; retry++) {
243  if (acquire()) {
244  count = read(buf, size);
245  if (release() && count != -1) break;
246  }
247  delay(1);
248  }
249  if (count != size) return (false);
250  value = ((buf[0] << 8) | buf[1]);
251  if (!check) return (true);
252 
253  uint8_t crc;
254  crc = crc_update(0, buf[0]);
255  crc = crc_update(crc, buf[1]);
256  return (crc == buf[2]);
257  }
258 
266  bool read(uint8_t cmd, uint8_t& value)
267  {
268  uint8_t reg;
269  int count = 0;
270  if (!acquire()) return (false);
271  write(&cmd, sizeof(cmd));
272  count = read(&reg, sizeof(reg));
273  if (!release() || count != sizeof(reg)) return (false);
274  value = reg;
275  return (true);
276  }
277 
278  static uint8_t crc_update(uint8_t crc, uint8_t data)
279  {
280  crc ^= data;
281  for (uint8_t i = CHARBITS; i != 0; i--) {
282  uint8_t msb = (crc & 0x80);
283  crc <<= 1;
284  if (msb) crc ^= 0x31;
285  }
286  return (crc);
287  }
288 
289  using Device::read;
290 };
291 
292 #endif
static uint8_t crc_update(uint8_t crc, uint8_t data)
Definition: Si70XX.h:278
Definition: TWI.h:28
Si70XX(TWI &twi)
Definition: Si70XX.h:56
Measure Relative Humidity, Hold Master Mode.
Definition: Si70XX.h:202
bool read_electronic_serial_number(uint8_t snr[8])
Definition: Si70XX.h:77
Write RH/T User Register 1.
Definition: Si70XX.h:208
bool release()
Definition: TWI.h:62
bool issue(uint8_t cmd)
Definition: Si70XX.h:220
bool read_firmware_revision(uint8_t &rev)
Definition: Si70XX.h:128
float read_humidity()
Definition: Si70XX.h:154
Reset.
Definition: Si70XX.h:207
Dito, No Hold Master Mode.
Definition: Si70XX.h:205
Read RH/T User Register 1.
Definition: Si70XX.h:209
Read Temperature from RH Measurement.
Definition: Si70XX.h:206
bool measure_humidity()
Definition: Si70XX.h:144
bool measure_temperature()
Definition: Si70XX.h:180
bool read(uint8_t cmd, uint8_t &value)
Definition: Si70XX.h:266
Read Firmware Revision.
Definition: Si70XX.h:212
bool read_user_register(uint8_t &reg)
Definition: Si70XX.h:66
Command
Definition: Si70XX.h:201
Hardware::TWI twi(100000UL)
float read_humidity_temperature()
Definition: Si70XX.h:166
Read Electronic ID 1.
Definition: Si70XX.h:210
#define CHARBITS
Definition: Si70XX.h:26
Dito, No Hold Master Mode.
Definition: Si70XX.h:203
float read_temperature()
Definition: Si70XX.h:190
int write(const void *buf, size_t count)
Definition: TWI.h:84
Device(TWI &twi, uint8_t addr)
Definition: TWI.h:41
bool read(uint16_t &value, bool check=true)
Definition: Si70XX.h:235
Definition: Si70XX.h:51
Read Electronic ID 2.
Definition: Si70XX.h:211
bool acquire()
Definition: TWI.h:52
Measure Temperature, Hold Master Mode.
Definition: Si70XX.h:204