Created
April 28, 2019 14:14
-
-
Save cretudorin/afafc6d932ffdbb0dd3d3579c920fa3a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# !/usr/bin/python | |
#-------------------------------------- | |
# ___ ___ _ ____ | |
# / _ \/ _ \(_) __/__ __ __ | |
# / , _/ ___/ /\ \/ _ \/ // / | |
# /_/|_/_/ /_/___/ .__/\_, / | |
# /_/ /___/ | |
# | |
# bmp180.py | |
# Read data from a digital pressure sensor. | |
# | |
# Original Author : Matt Hawkins | |
# Date : 15/04/2015 | |
# | |
# Adapted by Alexander Sorokin to his own setup: | |
# * send data to UDP socket (for InfluxDB) | |
# * convert mBars to mercury mm of mercury | |
# | |
# http://www.raspberrypi-spy.co.uk/ | |
# | |
#-------------------------------------- | |
import smbus | |
import time | |
from ctypes import c_short | |
import socket | |
UDP_IP = "127.0.0.1" | |
UDP_PORT = 8089 | |
DEVICE = 0x77 # Default device I2C address | |
#bus = smbus.SMBus(0) # Rev 1 Pi uses 0 | |
bus = smbus.SMBus(2) # 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): | |
# 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 = (B5 + 8) >> 4 | |
# Refine pressure | |
B6 = B5 - 4000 | |
B62 = B6 * B6 >> 12 | |
X1 = (B2 * B62) >> 11 | |
X2 = AC2 * B6 >> 11 | |
X3 = X1 + X2 | |
B3 = (((AC1 * 4 + X3) << OVERSAMPLE) + 2) >> 2 | |
X1 = 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 = (P >> 8) * (P >> 8) | |
X1 = (X1 * 3038) >> 16 | |
X2 = (-7357 * P) >> 16 | |
pressure = P + ((X1 + X2 + 3791) >> 4) | |
return (temperature/10.0,pressure/ 100.0) | |
def main(): | |
(chip_id, chip_version) = readBmp180Id() | |
# print "Chip ID :", chip_id | |
# print "Version :", chip_version | |
(temperature,pressure)=readBmp180() | |
sock = socket.socket(socket.AF_INET, # Internet | |
socket.SOCK_DGRAM) # UDP | |
sock.sendto("temperature value=%s" % temperature, (UDP_IP, UDP_PORT)) | |
pressure = pressure/1000 * 750.0637554192 | |
sock.sendto("pressure value=%s" % pressure, (UDP_IP, UDP_PORT)) | |
if __name__=="__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment