From a00044980c942c6ccb45445f7963016ec7db9da0 Mon Sep 17 00:00:00 2001 From: Vladimir Dronnikov Date: Sat, 31 Jan 2015 12:55:51 +0300 Subject: [PATCH] yet another bmp085 module added --- lua_examples/yet-another-bmp085.lua | 108 ++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 lua_examples/yet-another-bmp085.lua diff --git a/lua_examples/yet-another-bmp085.lua b/lua_examples/yet-another-bmp085.lua new file mode 100644 index 00000000..5de2de09 --- /dev/null +++ b/lua_examples/yet-another-bmp085.lua @@ -0,0 +1,108 @@ +------------------------------------------------------------------------------ +-- BMP085 query module +-- +-- LICENCE: http://opensource.org/licenses/MIT +-- Vladimir Dronnikov +-- Heavily based on work of Christee +-- +-- Example: +-- require("bmp085").read(sda, scl) +------------------------------------------------------------------------------ +local M +do + -- cache + local i2c, tmr = i2c, tmr + -- helpers + local r8 = function(reg) + i2c.start(0) + i2c.address(0, 0x77, i2c.TRANSMITTER) + i2c.write(0, reg) + i2c.stop(0) + i2c.start(0) + i2c.address(0, 0x77, i2c.RECEIVER) + local r = i2c.read(0, 1) + i2c.stop(0) + return r:byte(1) + end + local w8 = function(reg, val) + i2c.start(0) + i2c.address(0, 0x77, i2c.TRANSMITTER) + i2c.write(0, reg) + i2c.write(0, val) + i2c.stop(0) + end + local r16u = function(reg) + return r8(reg) * 256 + r8(reg + 1) + end + local r16 = function(reg) + local r = r16u(reg) + if r > 32767 then r = r - 65536 end + return r + end + -- calibration data + local AC1, AC2, AC3, AC4, AC5, AC6, B1, B2, MB, MC, MD + -- read + local read = function(sda, scl, oss) + i2c.setup(0, sda, scl, i2c.SLOW) + -- cache calibration data + if not AC1 then + AC1 = r16(0xAA) + AC2 = r16(0xAC) + AC3 = r16(0xAE) + AC4 = r16u(0xB0) + AC5 = r16u(0xB2) + AC6 = r16u(0xB4) + B1 = r16(0xB6) + B2 = r16(0xB8) + MB = r16(0xBA) + MC = r16(0xBC) + MD = r16(0xBE) + end + -- get raw P + local p + -- NB: optimize for oss = 0 + if not oss then oss = 0 end + if oss == 0 then + oss = 0 + w8(0xF4, 0x34) + tmr.delay(5000) + p = r8(0xF6) * 256 + r8(0xF7) + else + w8(0xF4, 0x34 + 64 * oss) + tmr.delay(30000) + p = r8(0xF6) * 65536 + r8(0xF7) * 256 + r8(0xF8) + p = p / 2^(8 - oss) + end + -- get T + w8(0xF4, 0x2E) + tmr.delay(5000) + local t = r16(0xF6) + local X1 = (t - AC6) * AC5 / 32768 + local X2 = MC * 2048 / (X1 + MD) + t = (X2 + X1 + 8) / 16 + -- normalize P + local B5 = t * 16 - 8; + local B6 = B5 - 4000 + local X1 = B2 * (B6 * B6 / 4096) / 2048 + local X2 = AC2 * B6 / 2048 + local X3 = X1 + X2 + local B3 = ((AC1 * 4 + X3) * 2^oss + 2) / 4 + X1 = AC3 * B6 / 8192 + X2 = (B1 * (B6 * B6 / 4096)) / 65536 + X3 = (X1 + X2 + 2) / 4 + local B4 = AC4 * (X3 + 32768) / 32768 + local B7 = (p - B3) * (50000 / 2^oss) + p = B7 / B4 * 2 + X1 = (p / 256)^2 + X1 = (X1 * 3038) / 65536 + X2 = (-7357 * p) / 65536 + p = p + (X1 + X2 + 3791) / 16 + -- Celsius * 10, Hg mm * 10 + return t, p * 3 / 40 + end + -- expose + M = { + read = read, + } +end +return M