return values: AM2315_OK AM2315_ERROR_CONNECT AM2315_MISSING_BYTES AM2315_ERROR_CHECKSUM;
| 175 | // AM2315_MISSING_BYTES |
| 176 | // AM2315_ERROR_CHECKSUM; |
| 177 | int AM2315::_readSensor() |
| 178 | { |
| 179 | // HANDLE PENDING IRQ etc. |
| 180 | yield(); |
| 181 | |
| 182 | // WAKE UP the sensor |
| 183 | if (! isConnected() ) return AM2315_ERROR_CONNECT; |
| 184 | |
| 185 | // SEND COMMAND |
| 186 | _wire->beginTransmission(AM2315_ADDRESS); |
| 187 | _wire->write(0X03); |
| 188 | _wire->write(0); |
| 189 | _wire->write(4); |
| 190 | int rv = _wire->endTransmission(); |
| 191 | if (rv < 0) return rv; |
| 192 | |
| 193 | // REQUEST DATA |
| 194 | const int length = 8; |
| 195 | int bytes = _wire->requestFrom((int)AM2315_ADDRESS, length); |
| 196 | if (bytes == 0) return AM2315_ERROR_CONNECT; |
| 197 | if (bytes < length) return AM2315_MISSING_BYTES; |
| 198 | |
| 199 | // READ DATA |
| 200 | for (int i = 0; i < bytes; i++) |
| 201 | { |
| 202 | _bits[i] = _wire->read(); |
| 203 | } |
| 204 | |
| 205 | // TEST CHECKSUM |
| 206 | uint16_t crc = _bits[bytes - 1] * 256 + _bits[bytes - 2]; |
| 207 | if (_crc16(_bits, bytes - 2) != crc) |
| 208 | { |
| 209 | return AM2315_ERROR_CHECKSUM; |
| 210 | } |
| 211 | return AM2315_OK; |
| 212 | } |
| 213 | |
| 214 | |
| 215 | uint16_t AM2315::_crc16(uint8_t *ptr, uint8_t len) |