Seeed_BME280.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #include "Seeed_BME280.h"
  2. bool BME280::init(void)
  3. {
  4. Wire.begin();
  5. if(BME280Read8(BME280_REG_CHIPID) != 0x60)
  6. return false;
  7. dig_T1 = BME280Read16LE(BME280_REG_DIG_T1);
  8. dig_T2 = BME280ReadS16LE(BME280_REG_DIG_T2);
  9. dig_T3 = BME280ReadS16LE(BME280_REG_DIG_T3);
  10. dig_P1 = BME280Read16LE(BME280_REG_DIG_P1);
  11. dig_P2 = BME280ReadS16LE(BME280_REG_DIG_P2);
  12. dig_P3 = BME280ReadS16LE(BME280_REG_DIG_P3);
  13. dig_P4 = BME280ReadS16LE(BME280_REG_DIG_P4);
  14. dig_P5 = BME280ReadS16LE(BME280_REG_DIG_P5);
  15. dig_P6 = BME280ReadS16LE(BME280_REG_DIG_P6);
  16. dig_P7 = BME280ReadS16LE(BME280_REG_DIG_P7);
  17. dig_P8 = BME280ReadS16LE(BME280_REG_DIG_P8);
  18. dig_P9 = BME280ReadS16LE(BME280_REG_DIG_P9);
  19. dig_H1 = BME280Read8(BME280_REG_DIG_H1);
  20. dig_H2 = BME280Read16LE(BME280_REG_DIG_H2);
  21. dig_H3 = BME280Read8(BME280_REG_DIG_H3);
  22. dig_H4 = (BME280Read8(BME280_REG_DIG_H4) << 4) | (0x0F & BME280Read8(BME280_REG_DIG_H4 + 1));
  23. dig_H5 = (BME280Read8(BME280_REG_DIG_H5 + 1) << 4) | (0x0F & BME280Read8(BME280_REG_DIG_H5) >> 4);
  24. dig_H6 = (int8_t)BME280Read8(BME280_REG_DIG_H6);
  25. writeRegister(BME280_REG_CONTROLHUMID, 0x05); //Choose 16X oversampling
  26. writeRegister(BME280_REG_CONTROL, 0xB7); //Choose 16X oversampling
  27. return true;
  28. }
  29. float BME280::getTemperature(void)
  30. {
  31. int32_t var1, var2;
  32. int32_t adc_T = BME280Read24(BME280_REG_TEMPDATA);
  33. adc_T >>= 4;
  34. var1 = (((adc_T >> 3) - ((int32_t)(dig_T1 << 1))) *
  35. ((int32_t)dig_T2)) >> 11;
  36. var2 = (((((adc_T >> 4) - ((int32_t)dig_T1)) *
  37. ((adc_T >> 4) - ((int32_t)dig_T1))) >> 12) *
  38. ((int32_t)dig_T3)) >> 14;
  39. t_fine = var1 + var2;
  40. float T = (t_fine * 5 + 128) >> 8;
  41. return T/100;
  42. }
  43. uint32_t BME280::getPressure(void)
  44. {
  45. int64_t var1, var2, p;
  46. // Call getTemperature to get t_fine
  47. getTemperature();
  48. int32_t adc_P = BME280Read24(BME280_REG_PRESSUREDATA);
  49. adc_P >>= 4;
  50. var1 = ((int64_t)t_fine) - 128000;
  51. var2 = var1 * var1 * (int64_t)dig_P6;
  52. var2 = var2 + ((var1*(int64_t)dig_P5)<<17);
  53. var2 = var2 + (((int64_t)dig_P4)<<35);
  54. var1 = ((var1 * var1 * (int64_t)dig_P3)>>8) + ((var1 * (int64_t)dig_P2)<<12);
  55. var1 = (((((int64_t)1)<<47)+var1))*((int64_t)dig_P1)>>33;
  56. if (var1 == 0)
  57. {
  58. return 0; // avoid exception caused by division by zero
  59. }
  60. p = 1048576-adc_P;
  61. p = (((p<<31)-var2)*3125)/var1;
  62. var1 = (((int64_t)dig_P9) * (p>>13) * (p>>13)) >> 25;
  63. var2 = (((int64_t)dig_P8) * p) >> 19;
  64. p = ((p + var1 + var2) >> 8) + (((int64_t)dig_P7)<<4);
  65. return (uint32_t)p/256;
  66. }
  67. uint32_t BME280::getHumidity(void)
  68. {
  69. int32_t v_x1_u32r, adc_H;
  70. // Call getTemperature to get t_fine
  71. getTemperature();
  72. adc_H = BME280Read16(BME280_REG_HUMIDITYDATA);
  73. v_x1_u32r = (t_fine - ((int32_t)76800));
  74. v_x1_u32r = (((((adc_H << 14) - (((int32_t)dig_H4) << 20) - (((int32_t)dig_H5) * v_x1_u32r)) + ((int32_t)16384)) >> 15) * (((((((v_x1_u32r * ((int32_t)dig_H6)) >> 10) * (((v_x1_u32r * ((int32_t)dig_H3)) >> 11) + ((int32_t)32768))) >> 10) + ((int32_t)2097152)) * ((int32_t)dig_H2) + 8192) >> 14));
  75. v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((int32_t)dig_H1)) >> 4));
  76. v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r);
  77. v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r);
  78. return (uint32_t)(v_x1_u32r>>12)/1024.0;
  79. }
  80. float BME280::calcAltitude(float pressure)
  81. {
  82. float A = pressure/101325;
  83. float B = 1/5.25588;
  84. float C = pow(A,B);
  85. C = 1.0 - C;
  86. C = C /0.0000225577;
  87. return C;
  88. }
  89. uint8_t BME280::BME280Read8(uint8_t reg)
  90. {
  91. Wire.beginTransmission(BME280_ADDRESS);
  92. Wire.write(reg);
  93. Wire.endTransmission();
  94. Wire.requestFrom(BME280_ADDRESS, 1);
  95. while(!Wire.available());
  96. return Wire.read();
  97. }
  98. uint16_t BME280::BME280Read16(uint8_t reg)
  99. {
  100. uint8_t msb, lsb;
  101. Wire.beginTransmission(BME280_ADDRESS);
  102. Wire.write(reg);
  103. Wire.endTransmission();
  104. Wire.requestFrom(BME280_ADDRESS, 2);
  105. while(Wire.available()<2);
  106. msb = Wire.read();
  107. lsb = Wire.read();
  108. return (uint16_t) msb<<8 | lsb;
  109. }
  110. uint16_t BME280::BME280Read16LE(uint8_t reg)
  111. {
  112. uint16_t data = BME280Read16(reg);
  113. return (data >> 8) | (data << 8);
  114. }
  115. int16_t BME280::BME280ReadS16(uint8_t reg)
  116. {
  117. return (int16_t)BME280Read16(reg);
  118. }
  119. int16_t BME280::BME280ReadS16LE(uint8_t reg)
  120. {
  121. return (int16_t)BME280Read16LE(reg);
  122. }
  123. uint32_t BME280::BME280Read24(uint8_t reg)
  124. {
  125. uint32_t data;
  126. Wire.beginTransmission(BME280_ADDRESS);
  127. Wire.write(reg);
  128. Wire.endTransmission();
  129. Wire.requestFrom(BME280_ADDRESS, 3);
  130. while(Wire.available()<3);
  131. data = Wire.read();
  132. data <<= 8;
  133. data |= Wire.read();
  134. data <<= 8;
  135. data |= Wire.read();
  136. return data;
  137. }
  138. void BME280::writeRegister(uint8_t reg, uint8_t val)
  139. {
  140. Wire.beginTransmission(BME280_ADDRESS); // start transmission to device
  141. Wire.write(reg); // send register address
  142. Wire.write(val); // send value to write
  143. Wire.endTransmission(); // end transmission
  144. }