DFRobot_SHT20.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "DFRobot_SHT20.h"
  2. void DFRobot_SHT20::initSHT20(TwoWire &wirePort)
  3. {
  4. i2cPort = &wirePort;
  5. i2cPort->begin();
  6. }
  7. uint16_t DFRobot_SHT20::readValue(byte cmd)
  8. {
  9. i2cPort->beginTransmission(SLAVE_ADDRESS);
  10. i2cPort->write(cmd);
  11. i2cPort->endTransmission();
  12. byte toRead;
  13. byte counter;
  14. for(counter = 0, toRead = 0 ; counter < MAX_COUNTER && toRead != 3; counter++){
  15. delay(DELAY_INTERVAL);
  16. toRead = i2cPort->requestFrom(SLAVE_ADDRESS, 3);
  17. }
  18. if(counter == MAX_COUNTER){
  19. return (ERROR_I2C_TIMEOUT);
  20. }
  21. byte msb, lsb, checksum;
  22. msb = i2cPort->read();
  23. lsb = i2cPort->read();
  24. checksum = i2cPort->read();
  25. uint16_t rawValue = ((uint16_t) msb << 8) | (uint16_t) lsb;
  26. if(checkCRC(rawValue, checksum) != 0){
  27. return (ERROR_BAD_CRC);
  28. }
  29. return rawValue & 0xFFFC;
  30. }
  31. float DFRobot_SHT20::readHumidity(void)
  32. {
  33. uint16_t rawHumidity = readValue(TRIGGER_HUMD_MEASURE_NOHOLD);
  34. if(rawHumidity == ERROR_I2C_TIMEOUT || rawHumidity == ERROR_BAD_CRC){
  35. return(rawHumidity);
  36. }
  37. float tempRH = rawHumidity * (125.0 / 65536.0);
  38. float rh = tempRH - 6.0;
  39. return (rh);
  40. }
  41. float DFRobot_SHT20::readTemperature(void)
  42. {
  43. uint16_t rawTemperature = readValue(TRIGGER_TEMP_MEASURE_NOHOLD);
  44. if(rawTemperature == ERROR_I2C_TIMEOUT || rawTemperature == ERROR_BAD_CRC){
  45. return(rawTemperature);
  46. }
  47. float tempTemperature = rawTemperature * (175.72 / 65536.0);
  48. float realTemperature = tempTemperature - 46.85;
  49. return (realTemperature);
  50. }
  51. void DFRobot_SHT20::setResolution(byte resolution)
  52. {
  53. byte userRegister = readUserRegister();
  54. userRegister &= B01111110;
  55. resolution &= B10000001;
  56. userRegister |= resolution;
  57. writeUserRegister(userRegister);
  58. }
  59. byte DFRobot_SHT20::readUserRegister(void)
  60. {
  61. byte userRegister;
  62. i2cPort->beginTransmission(SLAVE_ADDRESS);
  63. i2cPort->write(READ_USER_REG);
  64. i2cPort->endTransmission();
  65. i2cPort->requestFrom(SLAVE_ADDRESS, 1);
  66. userRegister = i2cPort->read();
  67. return (userRegister);
  68. }
  69. void DFRobot_SHT20::writeUserRegister(byte val)
  70. {
  71. i2cPort->beginTransmission(SLAVE_ADDRESS);
  72. i2cPort->write(WRITE_USER_REG);
  73. i2cPort->write(val);
  74. i2cPort->endTransmission();
  75. }
  76. byte DFRobot_SHT20::checkCRC(uint16_t message_from_sensor, uint8_t check_value_from_sensor)
  77. {
  78. uint32_t remainder = (uint32_t)message_from_sensor << 8;
  79. remainder |= check_value_from_sensor;
  80. uint32_t divsor = (uint32_t)SHIFTED_DIVISOR;
  81. for(int i = 0 ; i < 16 ; i++){
  82. if(remainder & (uint32_t)1 << (23 - i)){
  83. remainder ^= divsor;
  84. }
  85. divsor >>= 1;
  86. }
  87. return (byte)remainder;
  88. }
  89. void DFRobot_SHT20::showReslut(const char *prefix, int val)
  90. {
  91. Serial.print(prefix);
  92. if(val){
  93. Serial.println("yes");
  94. }else{
  95. Serial.println("no");
  96. }
  97. }
  98. void DFRobot_SHT20::checkSHT20(void)
  99. {
  100. byte reg = readUserRegister();
  101. showReslut("End of battery: ", reg & USER_REGISTER_END_OF_BATTERY);
  102. showReslut("Heater enabled: ", reg & USER_REGISTER_HEATER_ENABLED);
  103. showReslut("Disable OTP reload: ", reg & USER_REGISTER_DISABLE_OTP_RELOAD);
  104. }