bme280.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #!/usr/bin/python
  2. #--------------------------------------
  3. # ___ ___ _ ____
  4. # / _ \/ _ \(_) __/__ __ __
  5. # / , _/ ___/ /\ \/ _ \/ // /
  6. # /_/|_/_/ /_/___/ .__/\_, /
  7. # /_/ /___/
  8. #
  9. # bme280.py
  10. # Read data from a digital pressure sensor.
  11. #
  12. # Official datasheet available from :
  13. # https://www.bosch-sensortec.com/bst/products/all_products/bme280
  14. #
  15. # Author : Matt Hawkins
  16. # Date : 21/01/2018
  17. #
  18. # https://www.raspberrypi-spy.co.uk/
  19. #
  20. #--------------------------------------
  21. import smbus
  22. import time
  23. import sys
  24. from ctypes import c_short
  25. from ctypes import c_byte
  26. from ctypes import c_ubyte
  27. DEVICE = 0x76 # Default device I2C address
  28. bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1
  29. # Rev 1 Pi uses bus 0
  30. def getShort(data, index):
  31. # return two bytes from data as a signed 16-bit value
  32. return c_short((data[index+1] << 8) + data[index]).value
  33. def getUShort(data, index):
  34. # return two bytes from data as an unsigned 16-bit value
  35. return (data[index+1] << 8) + data[index]
  36. def getChar(data,index):
  37. # return one byte from data as a signed char
  38. result = data[index]
  39. if result > 127:
  40. result -= 256
  41. return result
  42. def getUChar(data,index):
  43. # return one byte from data as an unsigned char
  44. result = data[index] & 0xFF
  45. return result
  46. def readBME280ID(addr=DEVICE):
  47. # Chip ID Register Address
  48. REG_ID = 0xD0
  49. (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2)
  50. return (chip_id, chip_version)
  51. def readBME280All(addr=DEVICE):
  52. # Register Addresses
  53. REG_DATA = 0xF7
  54. REG_CONTROL = 0xF4
  55. REG_CONFIG = 0xF5
  56. REG_CONTROL_HUM = 0xF2
  57. REG_HUM_MSB = 0xFD
  58. REG_HUM_LSB = 0xFE
  59. # Oversample setting - page 27
  60. OVERSAMPLE_TEMP = 2
  61. OVERSAMPLE_PRES = 2
  62. MODE = 1
  63. # Oversample setting for humidity register - page 26
  64. OVERSAMPLE_HUM = 2
  65. bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM)
  66. control = OVERSAMPLE_TEMP<<5 | OVERSAMPLE_PRES<<2 | MODE
  67. bus.write_byte_data(addr, REG_CONTROL, control)
  68. # Read blocks of calibration data from EEPROM
  69. # See Page 22 data sheet
  70. cal1 = bus.read_i2c_block_data(addr, 0x88, 24)
  71. cal2 = bus.read_i2c_block_data(addr, 0xA1, 1)
  72. cal3 = bus.read_i2c_block_data(addr, 0xE1, 7)
  73. # Convert byte data to word values
  74. dig_T1 = getUShort(cal1, 0)
  75. dig_T2 = getShort(cal1, 2)
  76. dig_T3 = getShort(cal1, 4)
  77. dig_P1 = getUShort(cal1, 6)
  78. dig_P2 = getShort(cal1, 8)
  79. dig_P3 = getShort(cal1, 10)
  80. dig_P4 = getShort(cal1, 12)
  81. dig_P5 = getShort(cal1, 14)
  82. dig_P6 = getShort(cal1, 16)
  83. dig_P7 = getShort(cal1, 18)
  84. dig_P8 = getShort(cal1, 20)
  85. dig_P9 = getShort(cal1, 22)
  86. dig_H1 = getUChar(cal2, 0)
  87. dig_H2 = getShort(cal3, 0)
  88. dig_H3 = getUChar(cal3, 2)
  89. dig_H4 = getChar(cal3, 3)
  90. dig_H4 = (dig_H4 << 24) >> 20
  91. dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F)
  92. dig_H5 = getChar(cal3, 5)
  93. dig_H5 = (dig_H5 << 24) >> 20
  94. dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F)
  95. dig_H6 = getChar(cal3, 6)
  96. # Wait in ms (Datasheet Appendix B: Measurement time and current calculation)
  97. wait_time = 1.25 + (2.3 * OVERSAMPLE_TEMP) + ((2.3 * OVERSAMPLE_PRES) + 0.575) + ((2.3 * OVERSAMPLE_HUM)+0.575)
  98. time.sleep(wait_time/1000) # Wait the required time
  99. # Read temperature/pressure/humidity
  100. data = bus.read_i2c_block_data(addr, REG_DATA, 8)
  101. pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
  102. temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
  103. hum_raw = (data[6] << 8) | data[7]
  104. #Refine temperature
  105. var1 = ((((temp_raw>>3)-(dig_T1<<1)))*(dig_T2)) >> 11
  106. var2 = (((((temp_raw>>4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14
  107. t_fine = var1+var2
  108. temperature = float(((t_fine * 5) + 128) >> 8);
  109. # Refine pressure and adjust for temperature
  110. var1 = t_fine / 2.0 - 64000.0
  111. var2 = var1 * var1 * dig_P6 / 32768.0
  112. var2 = var2 + var1 * dig_P5 * 2.0
  113. var2 = var2 / 4.0 + dig_P4 * 65536.0
  114. var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0
  115. var1 = (1.0 + var1 / 32768.0) * dig_P1
  116. if var1 == 0:
  117. pressure=0
  118. else:
  119. pressure = 1048576.0 - pres_raw
  120. pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1
  121. var1 = dig_P9 * pressure * pressure / 2147483648.0
  122. var2 = pressure * dig_P8 / 32768.0
  123. pressure = pressure + (var1 + var2 + dig_P7) / 16.0
  124. pressure = round(pressure, 2)
  125. # Refine humidity
  126. humidity = t_fine - 76800.0
  127. humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity)))
  128. humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0)
  129. humidity = round(humidity, 2)
  130. if humidity > 100:
  131. humidity = 100
  132. elif humidity < 0:
  133. humidity = 0
  134. return temperature/100.0,pressure/100.0,humidity
  135. def main():
  136. # (chip_id, chip_version) = readBME280ID()
  137. # print ("Chip ID :", chip_id)
  138. # print ("Version :", chip_version)
  139. temperature,pressure,humidity = readBME280All()
  140. print ("Temperature : ", temperature, "°C")
  141. print ("Pressure : ", pressure, "hPa")
  142. print ("Humidity : ", humidity, "%")
  143. if __name__=="__main__":
  144. main()