| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- --- 模块功能:I2C功能测试.
- -- @author JWL
- -- @module i2c.BMP280
- -- @license MIT
- -- @copyright openLuat
- -- @release 2021.11.12
- module(...,package.seeall)
- -- 调试BMP280芯片会出现数据不变化的情况,要关电5分钟后再使用。
- require"utils"
- local dev={}
- local I2C_ID = 0x02
- local DEV_ID = 0x76
- local BMP280_REGISTER_DIG_T1 = 0x88
- local BMP280_REGISTER_DIG_T2 = 0x8A
- local BMP280_REGISTER_DIG_T3 = 0x8C
- local BMP280_REGISTER_DIG_P1 = 0x8E
- local BMP280_REGISTER_DIG_P2 = 0x90
- local BMP280_REGISTER_DIG_P3 = 0x92
- local BMP280_REGISTER_DIG_P4 = 0x94
- local BMP280_REGISTER_DIG_P5 = 0x96
- local BMP280_REGISTER_DIG_P6 = 0x98
- local BMP280_REGISTER_DIG_P7 = 0x9A
- local BMP280_REGISTER_DIG_P8 = 0x9C
- local BMP280_REGISTER_DIG_P9 = 0x9E
- local BMP280_REGISTER_CHIPID = 0xD0
- local BMP280_REGISTER_VERSION = 0xD1
- local BMP280_REGISTER_SOFTRESET = 0xE0
- --R calibration stored in 0xE1-0xF0
- local BMP280_REGISTER_CAL26 = 0xE1
- local BMP280_REGISTER_CONTROL = 0xF4
- local BMP280_REGISTER_CONFIG = 0xF5
- local BMP280_REGISTER_PRESSUREDATA = 0xF7
- local BMP280_REGISTER_TEMPDATA = 0xFA
- local function I2C_Open(id)
- if i2c.setup(id, i2c.SLOW) ~= i2c.SLOW then
- log.error("BMP280", "I2C.init is: fail")
- i2c.close(id)
- return
- else
- log.error("BMP280", "I2C.init is: succeed")
- end
- return i2c.SLOW
- end
-
- local function I2C_Write_Byte_BMP280(regAddress,content)
- i2c.send(I2C_ID, DEV_ID, {regAddress,content})
- end
-
- local function I2C_Read_Bytes_BMP280(regAddress,rdcnt)
- i2c.send(I2C_ID, DEV_ID, regAddress)
- return i2c.recv(I2C_ID, DEV_ID, rdcnt)
- end
- local function read8(regaddr)
- local buff = I2C_Read_Bytes_BMP280(regaddr,1)
- return buff:byte(1)
- end
-
- local function read16(regaddr)
- local buff = I2C_Read_Bytes_BMP280(regaddr,2)
- return (buff:byte(1)) *256 + buff:byte(2)
- end
- local function readS16(regaddr)
- local val = read16(regaddr)
- if val < 0x8000 then return val end
- return val -0x10000
- end
- local function read16_LE(regaddr)
- local buff = I2C_Read_Bytes_BMP280(regaddr,2)
- return (buff:byte(2)) *256 + buff:byte(1)
- end
- local function readS16_LE(regaddr)
- local val = read16_LE(regaddr)
- if val < 0x8000 then return val end
- return val -0x10000
- end
- local function readCoefficients(void)
- dev["calib"]["dig_T1"] = read16_LE(BMP280_REGISTER_DIG_T1);
- dev["calib"]["dig_T2"] = readS16_LE(BMP280_REGISTER_DIG_T2);
- dev["calib"]["dig_T3"] = readS16_LE(BMP280_REGISTER_DIG_T3);
- dev["calib"]["dig_P1"] = read16_LE(BMP280_REGISTER_DIG_P1);
- dev["calib"]["dig_P2"] = readS16_LE(BMP280_REGISTER_DIG_P2);
- dev["calib"]["dig_P3"] = readS16_LE(BMP280_REGISTER_DIG_P3);
- dev["calib"]["dig_P4"] = readS16_LE(BMP280_REGISTER_DIG_P4);
- dev["calib"]["dig_P5"] = readS16_LE(BMP280_REGISTER_DIG_P5);
- dev["calib"]["dig_P6"] = readS16_LE(BMP280_REGISTER_DIG_P6);
- dev["calib"]["dig_P7"] = readS16_LE(BMP280_REGISTER_DIG_P7);
- dev["calib"]["dig_P8"] = readS16_LE(BMP280_REGISTER_DIG_P8);
- dev["calib"]["dig_P9"] = readS16_LE(BMP280_REGISTER_DIG_P9);
- end
-
- local function lshift(x,y)
- return x * math.pow(2,y)
- end
- local function rshift(x,y)
- return x / math.pow(2,y)
- end
-
- local function readTemperature()
- local var1, var2;
- local adc_T = read16(BMP280_REGISTER_TEMPDATA)
- adc_T = lshift(adc_T,8)
- adc_T = adc_T+ read8(BMP280_REGISTER_TEMPDATA+2)
- adc_T = rshift(adc_T,4)
- var1 = (((( rshift(adc_T,3)) - (lshift( dev["calib"]["dig_T1"],1)))) * (dev["calib"]["dig_T2"]))
- var1 = rshift(var1,11)
- var2 = (( rshift((((rshift(adc_T,4)) - (dev["calib"]["dig_T1"])) * ((rshift(adc_T,4)) - (dev["calib"]["dig_T1"]))) , 12)) * (dev["calib"]["dig_T3"]))
- var2 = rshift(var2,14)
- dev["calib"]["t_fine"] = var1 + var2
- local T = rshift((dev["calib"]["t_fine"] * 5 + 128), 8 )
- return math.floor(T)/100;
- end
- local function readPressure()
- local var1, var2, p
-
- local adc_P = read16(BMP280_REGISTER_PRESSUREDATA)
- adc_P = lshift(adc_P,8)
- adc_P = adc_P+ read8(BMP280_REGISTER_PRESSUREDATA+2)
- adc_P = rshift(adc_P,4)
- log.info("adc_P", adc_P)
- var1 =dev["calib"]["t_fine"] - 128000;
- var2 = var1 * var1 * dev["calib"]["dig_P6"]
- var2 = var2 + ( lshift( (var1*dev["calib"]["dig_P5"]),17) )
- var2 = var2 + (lshift((dev["calib"]["dig_P4"]),35))
- var1 = ( rshift((var1 * var1 * dev["calib"]["dig_P3"]),8)) + ( lshift((var1 * dev["calib"]["dig_P2"]),12) )
- var1 = ((( lshift(1,47) )+var1)) * rshift((dev["calib"]["dig_P1"]),33)
- log.info("[calib] ", json.encode(dev["calib"]))
- if var1 == 0 then
- return 0 -- avoid exception caused by division by zero
- end
- p = 1048576 - adc_P
- p = (( ( lshift(p, 31)) - var2)*3125) / var1
- var1 = ((dev["calib"]["dig_P9"]) * ( rshift( p,13) ) * ( rshift(p,13) ))
- var1 = rshift(var1,25)
- var2 = ((dev["calib"]["dig_P8"]) * p)
- var2 = rshift(var2,19)
-
- p = (rshift((p + var1 + var2) , 8)) + ( lshift((dev["calib"]["dig_P7"]),4) )
- return math.floor(p/256);
- end
-
-
- sys.taskInit(function()
- sys.wait(4000)
- I2C_Open(I2C_ID)
- sys.wait(200)
- dev["calib"] = {}
- dev["calib"]["t_fine"] = 0
- dev["chip_id"] = I2C_Read_Bytes_BMP280(BMP280_REGISTER_CHIPID,1)
- log.info("BMP280 chipid=", string.format("%02X", dev["chip_id"]:byte(1) ) )
- readCoefficients()
- I2C_Write_Byte_BMP280(BMP280_REGISTER_CONTROL, 0x3F);
-
- while true do
- sys.wait(100)
- local temp = readTemperature()
- local pres = readPressure()
- log.info("temp, pres", temp .."℃", pres)
- sys.wait(2000)
- end
- end)
-
-
|