Guest User

bme280C.py

a guest
Jan 19th, 2018
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.55 KB | None | 0 0
  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   : 25/07/2016
  17. #
  18. # http://www.raspberrypi-spy.co.uk/
  19. #
  20. #--------------------------------------
  21. import cayenne.client
  22. import smbus
  23. import time
  24. import pigpio
  25. import subprocess
  26. from openhab import openHAB
  27. from ctypes import c_short
  28. from ctypes import c_byte
  29. from ctypes import c_ubyte
  30.  
  31. #CHANGE INPUT ACCORDING CAYENNE API
  32. MQTT_USERNAME  = "d1****80-f***-1*******1f-6fc******14e"
  33. MQTT_PASSWORD  = "53d********************************813"
  34. MQTT_CLIENT_ID = "3e0****-f***2-****7-**7-13d********7"
  35.  
  36. base_url = 'http://localhost:8080/rest'
  37.  
  38. GPIO_HEATING=23
  39. GPIO_HOTWATER=12
  40.  
  41. pi = pigpio.pi()
  42.  
  43. #READ MESSAGES FROM CAYENNE - ALSO ADD HERE COMMANDS FOR RPI BASH OR COMMANDS TO FORWARD TO OPENHUB
  44. def on_message(message):
  45.   #print("message received: " + str(message))
  46.   inc_data_channel = (str(message).split(",")[1]).split("'")[3]
  47.   inc_channel_number = (str(message).split(",")[3]).split(": ")[1]
  48.   #print(inc_data_channel)
  49.   #print(inc_channel_number)
  50.   if inc_data_channel == '0' and (inc_channel_number == '13'):
  51.     print('RECEIVED BUTTON 13 CLICK: Heating mode OFF')
  52.     Change_HeatingMode.state = 'OFF'
  53.   if inc_data_channel == '1' and (inc_channel_number == '13'):
  54.     print('RECEIVED BUTTON 13 CLICK: Heating mode ON')
  55.     Change_HeatingMode.state = 'ON'
  56.   if inc_data_channel == '1' and (inc_channel_number == '10'):
  57.     print('RECEIVED BUTTON 10 CLICK SHUTDOWN COMMAND')
  58.     command = "/usr/bin/sudo /sbin/shutdown -h 0"
  59.     process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
  60.     output_rpi_command = process.communicate()[0]
  61.     print output_rpi_command
  62.   if inc_data_channel == '1' and (inc_channel_number == '12'):
  63.     print('RECEIVED BUTTON 12 CLICK RESTART COMMAND')
  64.     command = "/usr/bin/sudo /sbin/reboot"
  65.     process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
  66.     output_rpi_command = process.communicate()[0]
  67.     print output_rpi_command
  68.   if inc_channel_number == '11':
  69.     Change_TempSetpoint = openhab.get_item('TempSetpoint')
  70.     Change_TempSetpoint.state = float(inc_data_channel)
  71.   # If there is an error processing the message return an error string, otherwise return nothing.
  72.  
  73.  
  74. client = cayenne.client.CayenneMQTTClient()
  75. client.on_message = on_message
  76. client.begin(MQTT_USERNAME, MQTT_PASSWORD, MQTT_CLIENT_ID)
  77. #client.loop_forever()
  78.  
  79.  
  80.  
  81.  
  82. ######################### SENSOR ORIGINAL CODE - START ############################
  83.  
  84. DEVICE = 0x76 # Default device I2C address
  85.  
  86. bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1
  87.                      # Rev 1 Pi uses bus 0
  88.  
  89. def getShort(data, index):
  90.   # return two bytes from data as a signed 16-bit value
  91.   return c_short((data[index+1] << 8) + data[index]).value
  92.  
  93. def getUShort(data, index):
  94.   # return two bytes from data as an unsigned 16-bit value
  95.   return (data[index+1] << 8) + data[index]
  96.  
  97. def getChar(data,index):
  98.   # return one byte from data as a signed char
  99.   result = data[index]
  100.   if result > 127:
  101.     result -= 256
  102.   return result
  103.  
  104. def getUChar(data,index):
  105.   # return one byte from data as an unsigned char
  106.   result =  data[index] & 0xFF
  107.   return result
  108.  
  109. def readBME280ID(addr=DEVICE):
  110.   # Chip ID Register Address
  111.   REG_ID     = 0xD0
  112.   (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2)
  113.   return (chip_id, chip_version)
  114.  
  115. def readBME280All(addr=DEVICE):
  116.   # Register Addresses
  117.   REG_DATA = 0xF7
  118.   REG_CONTROL = 0xF4
  119.   REG_CONFIG  = 0xF5
  120.  
  121.   REG_CONTROL_HUM = 0xF2
  122.   REG_HUM_MSB = 0xFD
  123.   REG_HUM_LSB = 0xFE
  124.  
  125.   # Oversample setting - page 27
  126.   OVERSAMPLE_TEMP = 2
  127.   OVERSAMPLE_PRES = 2
  128.   MODE = 1
  129.  
  130.   # Oversample setting for humidity register - page 26
  131.   OVERSAMPLE_HUM = 2
  132.   bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM)
  133.  
  134.   control = OVERSAMPLE_TEMP<<5 | OVERSAMPLE_PRES<<2 | MODE
  135.   bus.write_byte_data(addr, REG_CONTROL, control)
  136.  
  137.   # Read blocks of calibration data from EEPROM
  138.   # See Page 22 data sheet
  139.   cal1 = bus.read_i2c_block_data(addr, 0x88, 24)
  140.   cal2 = bus.read_i2c_block_data(addr, 0xA1, 1)
  141.   cal3 = bus.read_i2c_block_data(addr, 0xE1, 7)
  142.  
  143.   # Convert byte data to word values
  144.   dig_T1 = getUShort(cal1, 0)
  145.   dig_T2 = getShort(cal1, 2)
  146.   dig_T3 = getShort(cal1, 4)
  147.  
  148.   dig_P1 = getUShort(cal1, 6)
  149.   dig_P2 = getShort(cal1, 8)
  150.   dig_P3 = getShort(cal1, 10)
  151.   dig_P4 = getShort(cal1, 12)
  152.   dig_P5 = getShort(cal1, 14)
  153.   dig_P6 = getShort(cal1, 16)
  154.   dig_P7 = getShort(cal1, 18)
  155.   dig_P8 = getShort(cal1, 20)
  156.   dig_P9 = getShort(cal1, 22)
  157.  
  158.   dig_H1 = getUChar(cal2, 0)
  159.   dig_H2 = getShort(cal3, 0)
  160.   dig_H3 = getUChar(cal3, 2)
  161.  
  162.   dig_H4 = getChar(cal3, 3)
  163.   dig_H4 = (dig_H4 << 24) >> 20
  164.   dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F)
  165.  
  166.   dig_H5 = getChar(cal3, 5)
  167.   dig_H5 = (dig_H5 << 24) >> 20
  168.   dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F)
  169.  
  170.   dig_H6 = getChar(cal3, 6)
  171.  
  172.   # Wait in ms (Datasheet Appendix B: Measurement time and current calculation)
  173.   wait_time = 1.25 + (2.3 * OVERSAMPLE_TEMP) + ((2.3 * OVERSAMPLE_PRES) + 0.575) + ((2.3 * OVERSAMPLE_HUM)+0.575)
  174.   time.sleep(wait_time/1000)  # Wait the required time
  175.  
  176.   # Read temperature/pressure/humidity
  177.   data = bus.read_i2c_block_data(addr, REG_DATA, 8)
  178.   pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
  179.   temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
  180.   hum_raw = (data[6] << 8) | data[7]
  181.   #Refine temperature
  182.   var1 = ((((temp_raw>>3)-(dig_T1<<1)))*(dig_T2)) >> 11^M  var2 = (((((temp_raw>>4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * $
  183.   t_fine = var1+var2
  184.   temperature = float(((t_fine * 5) + 128) >> 8);
  185.  
  186.   # Refine pressure and adjust for temperature
  187.   var1 = t_fine / 2.0 - 64000.0
  188.   var2 = var1 * var1 * dig_P6 / 32768.0
  189.   var2 = var2 + var1 * dig_P5 * 2.0
  190.   var2 = var2 / 4.0 + dig_P4 * 65536.0
  191.   var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0
  192.   var1 = (1.0 + var1 / 32768.0) * dig_P1
  193.   if var1 == 0:
  194.     pressure=0
  195.   else:
  196.     pressure = 1048576.0 - pres_raw
  197.     pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1
  198.     var1 = dig_P9 * pressure * pressure / 2147483648.0
  199.     var2 = pressure * dig_P8 / 32768.0
  200.     pressure = pressure + (var1 + var2 + dig_P7) / 16.0
  201.  
  202.   # Refine humidity
  203.   humidity = t_fine - 76800.0
  204.   humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * humidity * (1$
  205.   humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0)
  206.   if humidity > 100:
  207.     humidity = 100
  208.   elif humidity < 0:
  209.     humidity = 0
  210.  
  211.   return temperature/100.0,pressure/100.0,humidity
  212.  
  213. ######################### SENSOR ORIGINAL CODE - END ############################
  214.  
  215.  
  216. def main():
  217.  
  218.   (chip_id, chip_version) = readBME280ID()
  219.   temperature,pressure,humidity = readBME280All()
  220.   #SEND CAYENNE DATA TO DISPLAY
  221.   client.virtualWrite(4, temperature, dataType='c')
  222.   client.virtualWrite(5, humidity, dataType='rel_hum')
  223.   client.virtualWrite(6, pressure, dataType='pa', dataUnit='hPa')
  224.   client.virtualWrite(7, HEATINGvalue, dataType='d', dataUnit='')
  225.   client.virtualWrite(8, HOTWATERvalue, dataType='d', dataUnit='')
  226.   client.virtualWrite(9, TempSetpointItem, dataType='c')
  227.   print "=============================================="
  228.   print "Chip ID     :", chip_id
  229.   print "Version     :", chip_version
  230.   print "Temperature : ", temperature, "C"
  231.   #print "Temperature : ", (temperature*1.8)+32, "F"
  232.   print "Pressure : ", pressure, "hPa"
  233.   print "Humidity : ", humidity, "%"
  234.   print "HEATING : ", HEATINGvalue
  235.   print "HOT WATER : ", HOTWATERvalue
  236.   print "Heating mode : ", Change_HeatingMode
  237.   print "Setpoint Temperature : ", TempSetpointItem
  238.   print "=============================================="
  239.   time.sleep(1)
  240.  
  241. #if __name__=="__main__":
  242. #   main()
  243.  
  244. while True:
  245.   HEATINGvalue = pi.read(GPIO_HEATING) #READS RPI GPIO STATE FOR RELAY STATUS
  246.   HOTWATERvalue = pi.read(GPIO_HOTWATER)
  247.   openhab = openHAB(base_url)
  248.   client.on_message = on_message # The callback for when a message is received from Cayenne.
  249.   TempSetpointItem = str(openhab.get_item('TempSetpoint')).split(" : ")[1][:4] #READS SETPOINT STATE FROM OPENHUB
  250.   Change_HeatingMode = openhab.get_item('HeatingMode') #READS HEATINGMODE STATE FROM OPENHUB
  251.   client.loop()
  252.   main()
Advertisement
Add Comment
Please, Sign In to add comment