From 7300ad4ba267767492df8223f220eab6c5a1f4d8 Mon Sep 17 00:00:00 2001 From: The Weather PI Date: Wed, 12 Jul 2017 21:32:04 +0000 Subject: [PATCH] Added python code. --- in_python/bmp180.py | 145 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100755 in_python/bmp180.py diff --git a/in_python/bmp180.py b/in_python/bmp180.py new file mode 100755 index 0000000..366423e --- /dev/null +++ b/in_python/bmp180.py @@ -0,0 +1,145 @@ +#!/usr/bin/python +#-------------------------------------- +# +# bmp180.py +# Read data from a digital pressure sensor. +# And broadcast to network. +# Author : Jony Silva +# Date : Wed 12 Jul 21:03:26 UTC 2017 +# +# Reading the chip code taken from : +# http://www.raspberrypi-spy.co.uk/ +# +#-------------------------------------- +import smbus +import time +from socket import * +from ctypes import c_short + +DEVICE = 0x77 # Default device I2C address + +# addressing information of target +IPADDR = '' +PORTNUM = 10000 + +#bus = smbus.SMBus(0) # Rev 1 Pi uses 0 +bus = smbus.SMBus(1) # Rev 2 Pi uses 1 + +def convertToString(data): + # Simple function to convert binary data into + # a string + return str((data[1] + (256 * data[0])) / 1.2) + +def getShort(data, index): + # return two bytes from data as a signed 16-bit value + return c_short((data[index] << 8) + data[index + 1]).value + +def getUshort(data, index): + # return two bytes from data as an unsigned 16-bit value + return (data[index] << 8) + data[index + 1] + +def readBmp180Id(addr=DEVICE): + # Chip ID Register Address + REG_ID = 0xD0 + (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2) + return (chip_id, chip_version) + +def readBmp180(addr=DEVICE): + # Register Addresses + REG_CALIB = 0xAA + REG_MEAS = 0xF4 + REG_MSB = 0xF6 + REG_LSB = 0xF7 + # Control Register Address + CRV_TEMP = 0x2E + CRV_PRES = 0x34 + # Oversample setting + OVERSAMPLE = 3 # 0 - 3 + + # Read calibration data + # Read calibration data from EEPROM + cal = bus.read_i2c_block_data(addr, REG_CALIB, 22) + + # Convert byte data to word values + AC1 = getShort(cal, 0) + AC2 = getShort(cal, 2) + AC3 = getShort(cal, 4) + AC4 = getUshort(cal, 6) + AC5 = getUshort(cal, 8) + AC6 = getUshort(cal, 10) + B1 = getShort(cal, 12) + B2 = getShort(cal, 14) + MB = getShort(cal, 16) + MC = getShort(cal, 18) + MD = getShort(cal, 20) + + # Read temperature + bus.write_byte_data(addr, REG_MEAS, CRV_TEMP) + time.sleep(0.005) + (msb, lsb) = bus.read_i2c_block_data(addr, REG_MSB, 2) + UT = (msb << 8) + lsb + + # Read pressure + bus.write_byte_data(addr, REG_MEAS, CRV_PRES + (OVERSAMPLE << 6)) + time.sleep(0.04) + (msb, lsb, xsb) = bus.read_i2c_block_data(addr, REG_MSB, 3) + UP = ((msb << 16) + (lsb << 8) + xsb) >> (8 - OVERSAMPLE) + + # Refine temperature + X1 = ((UT - AC6) * AC5) >> 15 + X2 = (MC << 11) / (X1 + MD) + B5 = X1 + X2 + temperature = int(B5 + 8) >> 4 + + # Refine pressure + B6 = B5 - 4000 + B62 = int(B6 * B6) >> 12 + X1 = (B2 * B62) >> 11 + X2 = int(AC2 * B6) >> 11 + X3 = X1 + X2 + B3 = (((AC1 * 4 + X3) << OVERSAMPLE) + 2) >> 2 + + X1 = int(AC3 * B6) >> 13 + X2 = (B1 * B62) >> 16 + X3 = ((X1 + X2) + 2) >> 2 + B4 = (AC4 * (X3 + 32768)) >> 15 + B7 = (UP - B3) * (50000 >> OVERSAMPLE) + + P = (B7 * 2) / B4 + + X1 = (int(P) >> 8) * (int(P) >> 8) + X1 = (X1 * 3038) >> 16 + X2 = int(-7357 * P) >> 16 + pressure = int(P + ((X1 + X2 + 3791) >> 4)) + + return (temperature/10.0,pressure/100.0) + +def main(): + + (chip_id, chip_version) = readBmp180Id() + print("Chip ID : {0}".format(chip_id)) + print("Version : {0}".format(chip_version)) + + print + + (temperature,pressure) = readBmp180() + temp = "Temperature : {0} C".format(temperature) + press = "Pressure : {0} mbar".format(pressure) + + print temp + print press + + # initialize a socket, think of it as a cable + # SOCK_DGRAM specifies that this is UDP + s = socket(AF_INET, SOCK_DGRAM) + + s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) + s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) + s.sendto(temp, (IPADDR, PORTNUM)) + + # close the socket + s.close() + +if __name__=="__main__": + main() +