فهرست منبع

add:去除bmp180和bmp280,新增bmx,支持bmp180 bmp280 bme280,自动判断器件id

Dozingfiretruck 4 سال پیش
والد
کامیت
0ad6b7db28
5فایلهای تغییر یافته به همراه439 افزوده شده و 458 حذف شده
  1. 0 186
      script/libs/bmp180/bmp180.lua
  2. 0 262
      script/libs/bmp280/bmp280.lua
  3. 0 9
      script/libs/bmp280/package.json
  4. 438 0
      script/libs/bmx/bmx.lua
  5. 1 1
      script/libs/bmx/package.json

+ 0 - 186
script/libs/bmp180/bmp180.lua

@@ -1,186 +0,0 @@
---[[
-@module bmp180
-@summary bmp180 驱动
-@version 1.0
-@date    2022.03.11
-@author  Dozingfiretruck
-@usage
---注意:因使用了sys.wait()所有api需要在协程中使用
--- 用法实例
-local bmp180 = require "bmp180"
-i2cid = 0
-i2c_speed = i2c.FAST
-sys.taskInit(function()
-    i2c.setup(i2cid,i2c_speed)
-    bmp180.init(i2cid)--初始化,传入i2c_id
-    while 1 do
-        local bmp180_data = bmp180.get_data()
-        log.info("bmp180_data.temp:"..(bmp180_data.temp).."℃")
-        log.info("bmp180_data.press:"..(bmp180_data.press).."hPa")
-        log.info("bmp180_data.high:"..(bmp180_data.high).."m")
-        sys.wait(1000)
-    end
-end)
-]]
-
-
-local bmp180 = {}
-
-local sys = require "sys"
-
-local i2cid
-
-local BMP180_ADDRESS_ADR            =   0x77
-
----器件所用地址
-local BMP180_CHIP_ID_CHECK			=   0xD0	
-local BMP180_CHIP_ID                =   0x55
-
-local BMP180_RESET			        =   0xE0
-local BMP180_RESET_VALUE		    =   0xB6
-
-local BMS180_AC1_ADDR				=   0xAA
-local BMP180_AC2_ADDR               =   0xAC  
-local BMP180_AC3_ADDR               =   0xAE  
-local BMP180_AC4_ADDR               =   0xB0  
-local BMP180_AC5_ADDR               =   0xB2  
-local BMP180_AC6_ADDR               =   0xB4
-local BMP180_B1_ADDR                =   0xB6  
-local BMP180_B2_ADDR                =   0xB8  
-local BMP180_MB_ADDR                =   0xBA  
-local BMP180_MC_ADDR                =   0xBC  
-local BMP180_MD_ADDR                =   0xBE
-
-local BMP180_CTRL_ADDR		        =   0xF4 --控制寄存器
-local BMP180_CTRL_TEMP		        =   0x2E --转换温度 4.5MS
-local BMP180_CTRL_POSS0		        =   0x34 --转换大气压 4.5ms
-local BMP180_CTRL_POSS1		        =   0x74 --转换大气压 7.5ms
-local BMP180_CTRL_POSS2		        =   0xB4 --转换大气压 13.5ms
-local BMP180_CTRL_POSS3		        =   0xF4 --转换大气压 25.5ms
-
-local BMP180_AD_MSB			        =   0xF6 --ADC输出高8位
-local BMP180_AD_LSB			        =   0xF7 --ADC输出低8位
-local BMP180_AD_XLSB			    =   0xF8 --19位测量时,ADC输出最低3位
-
-
-local PRESSURE_OF_SEA			    =   101325	-- 参考海平面压强
-
-local AC1,AC2,AC3,AC4,AC5,AC6,B1,B2,MB,MC,MD
-
---[[
-bmp180初始化
-@api bmp180.init(i2c_id)
-@number i2c_id i2c_id
-@return bool   成功返回true
-@usage
-bmp180.init(0)
-]]
-function bmp180.init(i2c_id)
-    i2cid = i2c_id
-    sys.wait(20)
-    i2c.send(i2cid, BMP180_ADDRESS_ADR, {BMP180_RESET,BMP180_RESET_VALUE})--软复位
-    sys.wait(20)
-    i2c.send(i2cid, BMP180_ADDRESS_ADR, BMP180_CHIP_ID_CHECK)
-    local data = i2c.recv(i2cid, BMP180_ADDRESS_ADR, 1)
-    if data:byte() == BMP180_CHIP_ID then
-        log.info("bmp180 is ok")
-        i2c.send(i2cid, BMP180_ADDRESS_ADR, BMS180_AC1_ADDR)
-        _,AC1 = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2), ">h")
-        i2c.send(i2cid, BMP180_ADDRESS_ADR, BMP180_AC2_ADDR)
-        _,AC2 = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2), ">h")
-        i2c.send(i2cid, BMP180_ADDRESS_ADR, BMP180_AC3_ADDR)
-        _,AC3 = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2), ">h")
-        i2c.send(i2cid, BMP180_ADDRESS_ADR, BMP180_AC4_ADDR)
-        _,AC4 = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2), ">H")
-        i2c.send(i2cid, BMP180_ADDRESS_ADR, BMP180_AC5_ADDR)
-        _,AC5 = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2), ">H")
-        i2c.send(i2cid, BMP180_ADDRESS_ADR, BMP180_AC6_ADDR)
-        _,AC6 = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2), ">H")
-        i2c.send(i2cid, BMP180_ADDRESS_ADR, BMP180_B1_ADDR)
-        _,B1 = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2), ">h")
-        i2c.send(i2cid, BMP180_ADDRESS_ADR, BMP180_B2_ADDR)
-        _,B2 = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2), ">h")
-        i2c.send(i2cid, BMP180_ADDRESS_ADR, BMP180_MB_ADDR)
-        _,MB = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2), ">h")
-        i2c.send(i2cid, BMP180_ADDRESS_ADR, BMP180_MC_ADDR)
-        _,MC = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2), ">h")
-        i2c.send(i2cid, BMP180_ADDRESS_ADR, BMP180_MD_ADDR)
-        _,MD = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2), ">h")
-        return true
-    end
-    log.info("Can't find bmp180")
-    return false
-end
-
---获取温度的原始数据
-local function bmp180_get_temp_raw()
-    i2c.send(i2cid, BMP180_ADDRESS_ADR,{BMP180_CTRL_ADDR,BMP180_CTRL_TEMP})
-    sys.wait(5)
-    i2c.send(i2cid, BMP180_ADDRESS_ADR,BMP180_AD_MSB)
-    local buffer = i2c.recv(i2cid, BMP180_ADDRESS_ADR, 2)--获取2字节
-    local _, temp_raw = pack.unpack(buffer, ">h")
-    return temp_raw or 0
-end
-
---获取气压的原始数据
-local function bmp180_get_pressure_raw()
-    i2c.send(i2cid, BMP180_ADDRESS_ADR,{BMP180_CTRL_ADDR,BMP180_CTRL_POSS3})
-    sys.wait(26)
-    i2c.send(i2cid, BMP180_ADDRESS_ADR,BMP180_AD_MSB)
-    local _, MSB = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 1), "b")
-    i2c.send(i2cid, BMP180_ADDRESS_ADR,BMP180_AD_LSB)
-    local _, LSB = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 1), "b")
-    i2c.send(i2cid, BMP180_ADDRESS_ADR,BMP180_AD_XLSB)
-    local _, XLSB = pack.unpack(i2c.recv(i2cid, BMP180_ADDRESS_ADR, 1), "b")
-    local pressure_raw = bit.rshift((bit.lshift(MSB, 16)+bit.lshift(LSB, 8)+XLSB),5)
-    return pressure_raw or 0
-end
-
---[[
-获取bmp180数据
-@api bmp180.get_data()
-@return table bmp180数据
-@usage
-local bmp180_data = bmp180.get_data()
-log.info("bmp180_data.temp:"..(bmp180_data.temp).."℃")
-log.info("bmp180_data.press:"..(bmp180_data.press).."hPa")
-log.info("bmp180_data.high:"..(bmp180_data.high).."m")
-]]
-function bmp180.get_data()
-    local bmp180_data={temp=nil,press=nil,high=nil}
-    local temp_raw = bmp180_get_temp_raw()
-    local pressure_raw = bmp180_get_pressure_raw()
-    local P = 0
-    local X1 = ((temp_raw - AC6) * AC5) / 32768
-    local X2 = (MC * 2048) / (X1 + MD)
-    local B5 = X1 + X2 
-    temp_raw  = (B5 + 8)/16
-    bmp180_data.temp = temp_raw/10
-    local B6 = B5 - 4000
-    X1 = (B2 * (B6 * B6 /4096))/2048
-    X2 = AC2 * B6/2048
-    local X3 = X1 + X2 
-    local B3 = (((AC1 * 4 + X3)*8) + 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 = (pressure_raw - B3) * (50000/8)
-    if (B7 < 0x80000000)then
-        P = (B7 * 2) / B4 
-    else
-        P = (B7 / B4) * 2
-    end
-    X1 = (P/256) * (P/256)
-    X1 = (X1 * 3038)/65536
-    X2 = (-7357 * P)/65536
-    P = P + ((X1 + X2 + 3791)/16)
-    bmp180_data.press = P /100
-    bmp180_data.high = 44330 * (1 - math.pow((P / PRESSURE_OF_SEA), (1.0 / 5.255)))
-    return bmp180_data
-end
-
-return bmp180
-
-
-

+ 0 - 262
script/libs/bmp280/bmp280.lua

@@ -1,262 +0,0 @@
---[[
-@module bmp280
-@summary bmp280 驱动
-@version 1.0
-@date    2022.03.12
-@author  Dozingfiretruck
-@usage
---注意:因使用了sys.wait()所有api需要在协程中使用
--- 用法实例
-local bmp280 = require "bmp280"
-i2cid = 0
-i2c_speed = i2c.FAST
-sys.taskInit(function()
-    i2c.setup(i2cid,i2c_speed)
-    bmp280.init(i2cid)--初始化,传入i2c_id
-    while 1 do
-        local bmp280_data = bmp280.get_data()
-        log.info("bmp280_data.temp:"..(bmp280_data.temp).."℃")
-        log.info("bmp280_data.press:"..(bmp280_data.press).."hPa")
-        log.info("bmp280_data.high:"..(bmp280_data.high).."m")
-        sys.wait(1000)
-    end
-end)
-]]
-
-
-local bmp280 = {}
-
-local sys = require "sys"
-
-local i2cid
-local BMP280_ADDRESS_ADR
-
-local BMP280_ADDRESS_ADR_LOW        =   0x76
-local BMP280_ADDRESS_ADR_HIGH       =   0x77
-
----器件所用地址
-local BMP280_CHIP_ID_CHECK			=   0xD0	
-local BMP280_CHIP_ID                =   0x58
-
-local BMP280_RESET			        =   0xE0
-local BMP280_RESET_VALUE		    =   0xB6
-
-local BMS280_T1_ADDR				=   0x88
-local BMS280_T2_ADDR				=   0x8A
-local BMS280_T3_ADDR				=   0x8C
-local BMS280_P1_ADDR				=   0x8E
-local BMS280_P2_ADDR				=   0x90
-local BMS280_P3_ADDR				=   0x90
-local BMS280_P4_ADDR				=   0x94
-local BMS280_P5_ADDR				=   0x96
-local BMS280_P6_ADDR				=   0x98
-local BMS280_P7_ADDR				=   0x9A
-local BMS280_P8_ADDR				=   0x9C
-local BMS280_P9_ADDR				=   0x9E
-
-local BMP280_STATUS_ADDR		    =   0xF3 --状态寄存器
-local BMP280_CTRL_ADDR		        =   0xF4 --控制寄存器
-local BMP280_CONFIG_ADDR		    =   0xF5 --配置寄存器
-
-local BMP280_SLEEP_MODE             =   0x00 
-local BMP280_FORCED_MODE            =   0x01 
-local BMP280_NORMAL_MODE            =   0x03 
-
-local BMP280_P_MODE_SKIP            =   0x00 --skipped
-local BMP280_P_MODE_1               =   0x01 --x1
-local BMP280_P_MODE_2               =   0x02 --x2
-local BMP280_P_MODE_3               =   0x03 --x4
-local BMP280_P_MODE_4               =   0x04 --x8
-local BMP280_P_MODE_5               =   0x05 --x16
-local BMP280_T_MODE_SKIP            =   0x00 --skipped
-local BMP280_T_MODE_1               =   0x01 --x1
-local BMP280_T_MODE_2               =   0x02 --x2
-local BMP280_T_MODE_3               =   0x03 --x4
-local BMP280_T_MODE_4               =   0x04 --x8
-local BMP280_T_MODE_5               =   0x05 --x16
-
-local BMP280_FILTER_OFF             =   0x00 --filter off
-local BMP280_FILTER_MODE_1		    =   0x01 --0.223*ODR     x2
-local BMP280_FILTER_MODE_2		    =   0x02 --0.092*ODR     x4
-local BMP280_FILTER_MODE_3		    =   0x03 --0.042*ODR     x8
-local BMP280_FILTER_MODE_4		    =   0x04 --0.021*ODR     x16
-
-local BMP280_T_SB1                  =   0x00 --0.5ms
-local BMP280_T_SB2			        =   0x01 --62.5ms
-local BMP280_T_SB3			        =   0x02 --125ms
-local BMP280_T_SB4			        =   0x03 --250ms
-local BMP280_T_SB5			        =   0x04 --500ms
-local BMP280_T_SB6			        =   0x05 --1000ms
-local BMP280_T_SB7			        =   0x06 --2000ms
-local BMP280_T_SB8			        =   0x07 --4000ms
-
-local BMP280_SPI_DISABLE			=   0x00
-local BMP280_SPI_ENABLE			    =   0x01
-
---按照官方手册配置一种模式,此处可自行修改
-local osrs_t                        =   BMP280_T_MODE_1
-local osrs_p                        =   BMP280_P_MODE_3
-local mode                          =   BMP280_NORMAL_MODE
-local t_sb                          =   BMP280_T_SB1
-local filter                        =   BMP280_FILTER_MODE_4
-local spi_en                        =   BMP280_SPI_DISABLE
-
-local ctrl_meas                     =   bit.bor(bit.lshift(osrs_t,5), bit.lshift(osrs_p, 2), mode)
-local config                        =   bit.bor(bit.lshift(t_sb,5), bit.lshift(filter, 2), spi_en)
-
-local BMP180_CTRL_TEMP		        =   0x2E --转换温度 4.5MS
-local BMP180_CTRL_POSS0		        =   0x34 --转换大气压 4.5ms
-local BMP180_CTRL_POSS1		        =   0x74 --转换大气压 7.5ms
-local BMP180_CTRL_POSS2		        =   0xB4 --转换大气压 13.5ms
-local BMP180_CTRL_POSS3		        =   0xF4 --转换大气压 25.5ms
-
-local BMP280_PRESS_MSB			    =   0xF7
-local BMP280_PRESS_LSB			    =   0xF8
-local BMP280_PRESS_XLSB			    =   0xF9
-
-local BMP280_TEMP_MSB			    =   0xFA
-local BMP280_TEMP_LSB			    =   0xFB
-local BMP280_TEMP_XLSB			    =   0xFC
-
-local PRESSURE_OF_SEA			    =   101325	-- 参考海平面压强
-
-local T1,T2,T3,P1,P2,P3,P4,P5,P6,P7,P8,P9
-
---器件ID检测
-local function bmp280_check()
-    i2c.send(i2cid, BMP280_ADDRESS_ADR_LOW, BMP280_CHIP_ID_CHECK)--读器件地址
-    local revData = i2c.recv(i2cid, BMP280_ADDRESS_ADR_LOW, 1)
-    if revData:byte() ~= nil then
-        BMP280_ADDRESS_ADR = BMP280_ADDRESS_ADR_LOW
-    else
-        i2c.send(i2cid, BMP280_ADDRESS_ADR_HIGH, BMP280_CHIP_ID_CHECK)--读器件地址
-        sys.wait(50)
-        local revData = i2c.recv(i2cid, BMP280_ADDRESS_ADR_HIGH, 1)
-        if revData:byte() ~= nil then
-            BMP280_ADDRESS_ADR = BMP280_ADDRESS_ADR_HIGH
-        else
-            log.info("i2c", "Can't find device")
-            return false
-        end
-    end
-    i2c.send(i2cid, BMP280_ADDRESS_ADR, BMP280_CHIP_ID_CHECK)--读器件地址
-    sys.wait(50)
-    local revData = i2c.recv(i2cid, BMP280_ADDRESS_ADR, 1)
-    if revData:byte() == BMP280_CHIP_ID then
-        log.info("Device i2c id is: bmp280")
-    else
-        log.info("i2c", "Can't find device")
-        return false
-    end
-    return true
-end
-
---[[
-bmp280初始化
-@api bmp280.init(i2c_id)
-@number i2c_id i2c_id
-@return bool   成功返回true
-@usage
-bmp280.init(0)
-]]
-function bmp280.init(i2c_id)
-    i2cid = i2c_id
-    sys.wait(20)
-    if bmp280_check() then
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_T1_ADDR)
-        _,T1 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<H")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_T2_ADDR)
-        _,T2 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<h")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_T3_ADDR)
-        _,T3 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<h")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_P1_ADDR)
-        _,P1 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<H")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_P2_ADDR)
-        _,P2 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<h")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_P3_ADDR)
-        _,P3 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<h")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_P4_ADDR)
-        _,P4 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<h")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_P5_ADDR)
-        _,P5 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<h")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_P6_ADDR)
-        _,P6 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<h")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_P7_ADDR)
-        _,P7 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<h")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_P8_ADDR)
-        _,P8 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<h")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, BMS280_P9_ADDR)
-        _,P9 = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 2), "<h")
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, {BMP280_RESET,BMP280_RESET_VALUE})--软复位
-        sys.wait(20)
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, {BMP280_CTRL_ADDR,ctrl_meas})
-        i2c.send(i2cid, BMP280_ADDRESS_ADR, {BMP280_CONFIG_ADDR,config})
-        log.info("bmp280 init_ok")
-        return true
-    end
-    return false
-end
-
---获取温度的原始数据
-local function bmp280_get_temp_raw()
-    i2c.send(i2cid, BMP280_ADDRESS_ADR,BMP280_TEMP_MSB)
-    local _, MSB = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 1), "b")
-    i2c.send(i2cid, BMP280_ADDRESS_ADR,BMP280_TEMP_LSB)
-    local _, LSB = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 1), "b")
-    i2c.send(i2cid, BMP280_ADDRESS_ADR,BMP280_TEMP_XLSB)
-    local _, XLSB = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 1), "b")
-    local temp_raw = bit.bor(bit.lshift(MSB,12), bit.lshift(LSB, 4), bit.rshift(XLSB, 4))
-    return temp_raw or 0
-end
-
---获取气压的原始数据
-local function bmp280_get_pressure_raw()
-    i2c.send(i2cid, BMP280_ADDRESS_ADR,BMP280_PRESS_MSB)
-    local _, MSB = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 1), "b")
-    i2c.send(i2cid, BMP280_ADDRESS_ADR,BMP280_PRESS_LSB)
-    local _, LSB = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 1), "b")
-    i2c.send(i2cid, BMP280_ADDRESS_ADR,BMP280_PRESS_XLSB)
-    local _, XLSB = pack.unpack(i2c.recv(i2cid, BMP280_ADDRESS_ADR, 1), "b")
-    local pressure_raw = bit.bor(bit.lshift(MSB,12), bit.lshift(LSB, 4), bit.rshift(XLSB, 4))
-    return pressure_raw or 0
-end
-
---[[
-获取bmp280数据
-@api bmp280.get_data()
-@return table bmp280数据
-@usage
-local bmp280_data = bmp280.get_data()
-log.info("bmp280_data.temp:"..(bmp280_data.temp).."℃")
-log.info("bmp280_data.press:"..(bmp280_data.press).."hPa")
-log.info("bmp280_data.high:"..(bmp280_data.high).."m")
-]]
-function bmp280.get_data()
-    local bmp280_data={temp=nil,press=nil,high=nil}
-    local temp_raw = bmp280_get_temp_raw()
-    local pressure_raw = bmp280_get_pressure_raw()
-    local var1 = (temp_raw/16384.0 - T1/1024.0) * T2
-	local var2 = ((temp_raw/131072.0 - T1/8192.0) *(temp_raw/131072.0 - T1/8192.0)) * T3
-	local t_fine = var1 + var2
-	bmp280_data.temp = (var1 + var2) / 5120.0
-
-    var1 = t_fine/2.0 - 64000.0
-	var2 = var1 * var1 * P6 / 32768.0
-	var2 = var2 + var1 * P5 * 2.0
-	var2 = var2 / 4.0 + P4 * 65536.0
-	var1 = (P3 * var1 * var1 / 524288.0 + P2 * var1) / 524288.0
-	var1 = (1.0 + var1 / 32768.0)*P1
-    local p = 1048576.0 - pressure_raw
-    p = (p - (var2 / 4096.0)) * 6250.0 / var1
-    var1 = P9 * p * p / 2147483648.0
-    var2 = p * P8 / 32768.0
-    p = p + (var1 + var2 + P7) / 16.0
-    bmp280_data.press = p /100
-    bmp280_data.high = 44330 * (1 - math.pow((p / PRESSURE_OF_SEA), (1.0 / 5.255)))
-    return bmp280_data
-end
-
-return bmp280
-
-
-

+ 0 - 9
script/libs/bmp280/package.json

@@ -1,9 +0,0 @@
-{
-    "type" : "lua", // 可以是lua(纯lua), c(纯c), 或者lua-c(混合)
-    "enterpoint" : "bmp280.lua",
-    "compatibility" : {
-        "soc" : true,
-        "air" : true
-    },
-    "dependency" : ["i2c"] // 需要何种硬件或软件接口
-}

+ 438 - 0
script/libs/bmx/bmx.lua

@@ -0,0 +1,438 @@
+--[[
+@module bmx
+@summary bmx 驱动 目前支持bmp180 bmp280 bme280 会自动判断器件
+@version 1.0
+@date    2022.04.9
+@author  Dozingfiretruck
+@usage
+--注意:因使用了sys.wait()所有api需要在协程中使用
+-- 用法实例
+local bmx = require "bmx"
+i2cid = 0
+i2c_speed = i2c.SLOW
+sys.taskInit(function()
+    i2c.setup(i2cid,i2c_speed)
+    bmx.init(i2cid)--初始化,传入i2c_id
+    while 1 do
+        local bmx_data = bmx.get_data()
+        if bmx_data.temp then
+            log.info("bmx_data_data.temp:"..(bmx_data.temp).."℃")
+        end
+        if bmx_data.press then
+            log.info("bmx_data_data.press:"..(bmx_data.press).."hPa")
+        end
+        if bmx_data.high then
+            log.info("bmx_data_data.high:"..(bmx_data.high).."m")
+        end
+        if bmx_data.hum then
+            log.info("bmx_data_data.temp:"..(bmx_data.hum).."%")
+        end
+        sys.wait(1000)
+    end
+end)
+]]
+
+
+local bmx = {}
+
+local sys = require "sys"
+
+local i2cid
+local BMX_ADDRESS_ADR
+local CHIP_ID
+
+local BMX_ADDRESS_ADR_LOW           =   0x76
+local BMX_ADDRESS_ADR_HIGH          =   0x77
+
+---器件所用地址
+local BMX_CHIP_ID_CHECK			    =   0xD0	
+local BMP180_CHIP_ID                =   0x55
+local BMP280_CHIP_ID                =   0x58
+local BME280_CHIP_ID                =   0x60
+
+local BMX_RESET			            =   0xE0
+local BMX_RESET_VALUE		        =   0xB6
+
+local BMP180_AC1_ADDR				=   0xAA
+local BMP180_AC2_ADDR               =   0xAC  
+local BMP180_AC3_ADDR               =   0xAE  
+local BMP180_AC4_ADDR               =   0xB0  
+local BMP180_AC5_ADDR               =   0xB2  
+local BMP180_AC6_ADDR               =   0xB4
+local BMP180_B1_ADDR                =   0xB6  
+local BMP180_B2_ADDR                =   0xB8  
+local BMP180_MB_ADDR                =   0xBA  
+local BMP180_MC_ADDR                =   0xBC  
+local BMP180_MD_ADDR                =   0xBE
+
+local BMP180_CTRL_ADDR		        =   0xF4 --控制寄存器
+local BMP180_CTRL_TEMP		        =   0x2E --转换温度 4.5MS
+local BMP180_CTRL_POSS0		        =   0x34 --转换大气压 4.5ms
+local BMP180_CTRL_POSS1		        =   0x74 --转换大气压 7.5ms
+local BMP180_CTRL_POSS2		        =   0xB4 --转换大气压 13.5ms
+local BMP180_CTRL_POSS3		        =   0xF4 --转换大气压 25.5ms
+
+local BMP180_AD_MSB			        =   0xF6 --ADC输出高8位
+local BMP180_AD_LSB			        =   0xF7 --ADC输出低8位
+local BMP180_AD_XLSB			    =   0xF8 --19位测量时,ADC输出最低3位
+
+local BMX280_T1_ADDR				=   0x88
+local BMX280_T2_ADDR				=   0x8A
+local BMX280_T3_ADDR				=   0x8C
+local BMX280_P1_ADDR				=   0x8E
+local BMX280_P2_ADDR				=   0x90
+local BMX280_P3_ADDR				=   0x90
+local BMX280_P4_ADDR				=   0x94
+local BMX280_P5_ADDR				=   0x96
+local BMX280_P6_ADDR				=   0x98
+local BMX280_P7_ADDR				=   0x9A
+local BMX280_P8_ADDR				=   0x9C
+local BMX280_P9_ADDR				=   0x9E
+
+local BME280_H1_ADDR				=   0xA1
+local BME280_H2_ADDR				=   0xE1
+local BME280_H3_ADDR				=   0xE3
+local BME280_H4_ADDR				=   0xE4
+local BME280_H5_ADDR				=   0xE5
+local BME280_H6_ADDR				=   0xE7
+
+local BMX280_CTRLMHUM_ADDR		    =   0xF2 --控制寄存器
+local BMX280_STATUS_ADDR		    =   0xF3 --状态寄存器
+local BMX280_CTRLMEAS_ADDR		    =   0xF4 --控制寄存器
+local BMX280_CONFIG_ADDR		    =   0xF5 --配置寄存器
+
+local BMX280_SLEEP_MODE             =   0x00 
+local BMX280_FORCED_MODE            =   0x01 
+local BMX280_NORMAL_MODE            =   0x03 
+
+local BMX280_P_MODE_SKIP            =   0x00 --skipped
+local BMX280_P_MODE_1               =   0x01 --x1
+local BMX280_P_MODE_2               =   0x02 --x2
+local BMX280_P_MODE_3               =   0x03 --x4
+local BMX280_P_MODE_4               =   0x04 --x8
+local BMX280_P_MODE_5               =   0x05 --x16
+local BMX280_T_MODE_SKIP            =   0x00 --skipped
+local BMX280_T_MODE_1               =   0x01 --x1
+local BMX280_T_MODE_2               =   0x02 --x2
+local BMX280_T_MODE_3               =   0x03 --x4
+local BMX280_T_MODE_4               =   0x04 --x8
+local BMX280_T_MODE_5               =   0x05 --x16
+
+local BMX280_FILTER_OFF             =   0x00 --filter off
+local BMX280_FILTER_MODE_1		    =   0x01 --0.223*ODR     x2
+local BMX280_FILTER_MODE_2		    =   0x02 --0.092*ODR     x4
+local BMX280_FILTER_MODE_3		    =   0x03 --0.042*ODR     x8
+local BMX280_FILTER_MODE_4		    =   0x04 --0.021*ODR     x16
+
+local BMX280_T_SB1                  =   0x00 --0.5ms
+local BMX280_T_SB2			        =   0x01 --62.5ms
+local BMX280_T_SB3			        =   0x02 --125ms
+local BMX280_T_SB4			        =   0x03 --250ms
+local BMX280_T_SB5			        =   0x04 --500ms
+local BMX280_T_SB6			        =   0x05 --1000ms
+local BMX280_T_SB7			        =   0x06 --2000ms
+local BMX280_T_SB8			        =   0x07 --4000ms
+
+local BMX280_H_SB0			        =   0x00 --Skipped (output set to 0x8000)
+local BMX280_H_SB1			        =   0x01 --oversampling ×1
+local BMX280_H_SB2			        =   0x02 --oversampling ×2
+local BMX280_H_SB3			        =   0x03 --oversampling ×4
+local BMX280_H_SB4			        =   0x04 --oversampling ×8
+local BMX280_H_SB5			        =   0x05 --oversampling ×16
+
+local BMX280_SPI_DISABLE			=   0x00
+local BMX280_SPI_ENABLE			    =   0x01
+
+--按照官方手册配置一种模式,此处可自行修改
+local osrs_t                        =   BMX280_T_MODE_1
+local osrs_p                        =   BMX280_P_MODE_3
+local osrs_h                        =   BMX280_H_SB1
+local mode                          =   BMX280_NORMAL_MODE
+local t_sb                          =   BMX280_T_SB1
+local filter                        =   BMX280_FILTER_MODE_4
+local spi_en                        =   BMX280_SPI_DISABLE
+
+local ctrl_hum                      =   osrs_h
+local ctrl_meas                     =   bit.bor(bit.lshift(osrs_t,5), bit.lshift(osrs_p, 2), mode)
+local config                        =   bit.bor(bit.lshift(t_sb,5), bit.lshift(filter, 2), spi_en)
+
+local BMX180_CTRL_TEMP		        =   0x2E --转换温度 4.5MS
+local BMX180_CTRL_POSS0		        =   0x34 --转换大气压 4.5ms
+local BMX180_CTRL_POSS1		        =   0x74 --转换大气压 7.5ms
+local BMX180_CTRL_POSS2		        =   0xB4 --转换大气压 13.5ms
+local BMX180_CTRL_POSS3		        =   0xF4 --转换大气压 25.5ms
+
+local BMX280_PRESS_MSB			    =   0xF7
+local BMX280_PRESS_LSB			    =   0xF8
+local BMX280_PRESS_XLSB			    =   0xF9
+
+local BMX280_TEMP_MSB			    =   0xFA
+local BMX280_TEMP_LSB			    =   0xFB
+local BMX280_TEMP_XLSB			    =   0xFC
+
+local BMX280_HUM_MSB			    =   0xFD
+local BMX280_HUM_LSB			    =   0xFE
+
+local PRESSURE_OF_SEA			    =   101325	-- 参考海平面压强
+
+local AC1,AC2,AC3,AC4,AC5,AC6,B1,B2,MB,MC,MD
+local H1,H2,H3,H4,H5,H6,T1,T2,T3,P1,P2,P3,P4,P5,P6,P7,P8,P9
+
+
+--器件ID检测
+local function bmp_check()
+    i2c.send(i2cid, BMX_ADDRESS_ADR_LOW, BMX_CHIP_ID_CHECK)--读器件地址
+    local revData = i2c.recv(i2cid, BMX_ADDRESS_ADR_LOW, 1)
+    if revData:byte() ~= nil then
+        BMX_ADDRESS_ADR = BMX_ADDRESS_ADR_LOW
+    else
+        i2c.send(i2cid, BMX_ADDRESS_ADR_HIGH, BMX_CHIP_ID_CHECK)--读器件地址
+        sys.wait(50)
+        local revData = i2c.recv(i2cid, BMX_ADDRESS_ADR_HIGH, 1)
+        if revData:byte() ~= nil then
+            BMX_ADDRESS_ADR = BMX_ADDRESS_ADR_HIGH
+        else
+            log.info("i2c", "Can't find bmx device")
+            return false
+        end
+    end
+    i2c.send(i2cid, BMX_ADDRESS_ADR, BMX_CHIP_ID_CHECK)--读器件地址
+    sys.wait(50)
+    local revData = i2c.recv(i2cid, BMX_ADDRESS_ADR, 1)
+    if revData:byte() == BMP180_CHIP_ID then
+        CHIP_ID = BMP180_CHIP_ID
+        log.info("Device i2c id is: bmp180")
+    elseif revData:byte() == BMP280_CHIP_ID then
+        CHIP_ID = BMP280_CHIP_ID
+        log.info("Device i2c id is: bmp280")
+    elseif revData:byte() == BME280_CHIP_ID then
+        log.info("Device i2c id is: bme280")
+        CHIP_ID = BME280_CHIP_ID
+    else
+        log.info("i2c", "Can't find bmx device")
+        return false
+    end
+    return true
+end
+
+--器件初始化
+function bmx.init(i2c_id)
+    i2cid = i2c_id
+    sys.wait(20)
+    if bmp_check() then
+        i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX_RESET,BMX_RESET_VALUE})--软复位
+        sys.wait(20)
+        if CHIP_ID == BMP180_CHIP_ID then
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC1_ADDR)
+            _,AC1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC2_ADDR)
+            _,AC2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC3_ADDR)
+            _,AC3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC4_ADDR)
+            _,AC4 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">H")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC5_ADDR)
+            _,AC5 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">H")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC6_ADDR)
+            _,AC6 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">H")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_B1_ADDR)
+            _,B1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_B2_ADDR)
+            _,B2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_MB_ADDR)
+            _,MB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_MC_ADDR)
+            _,MC = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_MD_ADDR)
+            _,MD = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
+        else
+            if CHIP_ID == BME280_CHIP_ID then
+                i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H1_ADDR)
+                _,H1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<b")
+                i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H2_ADDR)
+                _,H2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
+                i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H3_ADDR)
+                _,H3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<b")
+
+                i2c.send(i2cid, BMX_ADDRESS_ADR, 0xE4)
+                _,tmp1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+                i2c.send(i2cid, BMX_ADDRESS_ADR, 0xE5)
+                _,tmp2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+                i2c.send(i2cid, BMX_ADDRESS_ADR, 0xE6)
+                _,tmp3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+
+                H4 = bit.bor(bit.lshift(tmp1,4),bit.band(tmp2,0x0F))
+                H5 = bit.bor(bit.lshift(tmp3,4),bit.band(bit.rshift(tmp2,4),0x0F))
+
+                if bit.band(H4,0x0080)~=0 then H4 = bit.bxor(-H4,0x00FF) + 1 end
+                if bit.band(H5,0x0080)~=0 then H5 = bit.bxor(-H5,0x00FF) + 1 end
+                
+                i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H6_ADDR)
+                _,H6 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
+            end
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_T1_ADDR)
+            _,T1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<H")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_T2_ADDR)
+            _,T2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_T3_ADDR)
+            _,T3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P1_ADDR)
+            _,P1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<H")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P2_ADDR)
+            _,P2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P3_ADDR)
+            _,P3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P4_ADDR)
+            _,P4 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P5_ADDR)
+            _,P5 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P6_ADDR)
+            _,P6 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P7_ADDR)
+            _,P7 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P8_ADDR)
+            _,P8 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
+            i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P9_ADDR)
+            _,P9 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
+        end
+        if CHIP_ID == BME280_CHIP_ID then
+            i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX280_CTRLMHUM_ADDR,ctrl_hum})
+        end
+        if CHIP_ID ~= BMP180_CHIP_ID then
+            i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX280_CTRLMEAS_ADDR,ctrl_meas})
+            i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX280_CONFIG_ADDR,config})
+        end
+        sys.wait(20)--跳过首次数据
+        log.info("bmp init_ok")
+        return true
+    end
+    return false
+end
+
+--获取温度的原始数据
+local function bmx_get_temp_raw()
+    local temp_raw
+    if CHIP_ID == BMP180_CHIP_ID then
+        i2c.send(i2cid, BMX_ADDRESS_ADR,{BMP180_CTRL_ADDR,BMP180_CTRL_TEMP})
+        sys.wait(5)
+        i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_MSB)
+        local buffer = i2c.recv(i2cid, BMX_ADDRESS_ADR, 2)--获取2字节
+        _, temp_raw = pack.unpack(buffer, ">h")
+    else
+        i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_TEMP_MSB)
+        local _, MSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+        i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_TEMP_LSB)
+        local _, LSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+        i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_TEMP_XLSB)
+        local _, XLSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+        temp_raw = bit.bor(bit.lshift(MSB,12), bit.lshift(LSB, 4), bit.rshift(XLSB, 4))
+    end
+    return temp_raw or 0
+end
+
+--获取气压的原始数据
+local function bmx_get_pressure_raw()
+    local pressure_raw
+    if CHIP_ID == BMP180_CHIP_ID then
+        i2c.send(i2cid, BMX_ADDRESS_ADR,{BMP180_CTRL_ADDR,BMP180_CTRL_POSS3})
+        sys.wait(26)
+        i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_MSB)
+        local _, MSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+        i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_LSB)
+        local _, LSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+        i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_XLSB)
+        local _, XLSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+        pressure_raw = bit.rshift((bit.lshift(MSB, 16)+bit.lshift(LSB, 8)+XLSB),5)
+    else
+        i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_PRESS_MSB)
+        local _, MSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+        i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_PRESS_LSB)
+        local _, LSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+        i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_PRESS_XLSB)
+        local _, XLSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
+        pressure_raw = bit.bor(bit.lshift(MSB,12), bit.lshift(LSB, 4), bit.rshift(XLSB, 4))
+    end
+    return pressure_raw or 0
+end
+
+--获取湿度的原始数据 
+local function bmx_get_humidity_raw()
+    i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_HUM_MSB)
+    local _, humidity = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
+    return humidity or 0
+end
+
+function bmx.get_data()
+    local bme_data={}
+    local temp_raw = bmx_get_temp_raw()
+    local pressure_raw = bmx_get_pressure_raw()
+    if CHIP_ID == BMP180_CHIP_ID then
+        local P = 0
+        local X1 = ((temp_raw - AC6) * AC5) / 32768
+        local X2 = (MC * 2048) / (X1 + MD)
+        local B5 = X1 + X2 
+        temp_raw  = (B5 + 8)/16
+        bme_data.temp = temp_raw/10
+        local B6 = B5 - 4000
+        X1 = (B2 * (B6 * B6 /4096))/2048
+        X2 = AC2 * B6/2048
+        local X3 = X1 + X2 
+        local B3 = (((AC1 * 4 + X3)*8) + 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 = (pressure_raw - B3) * (50000/8)
+        if (B7 < 0x80000000)then
+            P = (B7 * 2) / B4 
+        else
+            P = (B7 / B4) * 2
+        end
+        X1 = (P/256) * (P/256)
+        X1 = (X1 * 3038)/65536
+        X2 = (-7357 * P)/65536
+        P = P + ((X1 + X2 + 3791)/16)
+        bme_data.press = P /100
+        bme_data.high = 44330 * (1 - math.pow((P / PRESSURE_OF_SEA), (1.0 / 5.255)))
+        bme_data.high = 44330 * (1 - math.pow((P / PRESSURE_OF_SEA), (1.0 / 5.255)))
+    else
+        local var1 = (temp_raw/16384.0 - T1/1024.0) * T2
+        local var2 = ((temp_raw/131072.0 - T1/8192.0) *(temp_raw/131072.0 - T1/8192.0)) * T3
+        local t_fine = var1 + var2
+        bme_data.temp = (var1 + var2) / 5120.0
+        var1 = t_fine/2.0 - 64000.0
+        var2 = var1 * var1 * P6 / 32768.0
+        var2 = var2 + var1 * P5 * 2.0
+        var2 = var2 / 4.0 + P4 * 65536.0
+        var1 = (P3 * var1 * var1 / 524288.0 + P2 * var1) / 524288.0
+        var1 = (1.0 + var1 / 32768.0)*P1
+        if var1==0 then
+            return bme_data
+        end
+        local p = 1048576.0 - pressure_raw
+        p = (p - (var2 / 4096.0)) * 6250.0 / var1
+        var1 = P9 * p * p / 2147483648.0
+        var2 = p * P8 / 32768.0
+        p = p + (var1 + var2 + P7) / 16.0
+        bme_data.press = p /100
+        bme_data.high = 44330 * (1 - math.pow((p / PRESSURE_OF_SEA), (1.0 / 5.255)))
+        if CHIP_ID == BME280_CHIP_ID then
+            local humidity_raw = bmx_get_humidity_raw()
+            local var_H = t_fine - 76800.0
+            var_H = (humidity_raw - (H4 * 64.0 + H5 / 16384.0 * var_H)) * (H2 / 65536.0 * (1.0 + H6 / 67108864.0 * var_H * (1.0 + H3 / 67108864.0 * var_H)))
+            var_H = var_H * (1.0 - H1 * var_H / 524288.0)
+            if var_H > 100.0 then
+                var_H = 100.0
+            elseif var_H < 0.0 then
+                var_H = 0.0
+            end
+            bme_data.hum=var_H
+        end
+    end 
+    return bme_data
+end
+
+return bmx
+
+
+

+ 1 - 1
script/libs/bmp180/package.json → script/libs/bmx/package.json

@@ -1,6 +1,6 @@
 {
     "type" : "lua", // 可以是lua(纯lua), c(纯c), 或者lua-c(混合)
-    "enterpoint" : "bmp180.lua",
+    "enterpoint" : "bmx.lua",
     "compatibility" : {
         "soc" : true,
         "air" : true