Created
August 16, 2022 22:45
-
-
Save Sonictherocketman/ddf3315eaf9c979bf7341400359722ec to your computer and use it in GitHub Desktop.
Continual Pressure/Temperature Monitoring (run on a cronjob)
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
# I didn't write this code. I just found it online. | |
# make sure to install python-smbus using below command | |
# sudo apt-get install python-smbus | |
import smbus | |
import time | |
from ctypes import c_short | |
DEVICE = 0x77 # Default device I2C address | |
#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=0x77): | |
# 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 | |
temperature = temperature / 10.0 | |
# 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)) | |
#pressure = float(pressure / 100.0) | |
altitude = 44330.0 * (1.0 - pow(pressure / 101325.0, (1.0/5.255))) | |
altitude = round(altitude,2) | |
return (temperature,pressure,altitude) |
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 python3 | |
import bmp | |
import os.path | |
import sqlite3 | |
import time | |
# This script runs and collects a single reading, writes it to a db, then exits | |
db_path = os.path.expanduser('~/data/temp-and-pressure/readings.db') | |
""" | |
CREATE TABLE readings( | |
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, | |
temperature NUMERIC, | |
pressure NUMERIC, | |
altitude NUMERIC, | |
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP | |
); | |
""" | |
def main(): | |
temp, pressure, altitude = bmp.readBmp180() | |
connection = sqlite3.connect(db_path) | |
cursor = connection.cursor() | |
print(f'inserting into main.readings (t: {temp}, p: {pressure}, a: {altitude})') | |
cursor.execute( | |
'insert into main.readings (temperature, pressure, altitude) values (?, ?, ?)', | |
(temp, pressure, altitude), | |
) | |
connection.commit() | |
connection.close() | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment