| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- PROJECT = "sensor"
- VERSION = "1.0.0"
- require "log"
- require "sys"
- require "misc"
- -- i2c ID
- i2cid = 2
- -- i2c 速率
-
- local LIS2DH12_POWER_DOWN = 0
- local LIS2DH12_ODR_1Hz = 1
- local LIS2DH12_ODR_10Hz = 2
- local LIS2DH12_ODR_25Hz = 3
- local LIS2DH12_ODR_50Hz = 4
- local LIS2DH12_ODR_100Hz = 5
- local LIS2DH12_ODR_200Hz = 6
- local LIS2DH12_ODR_400Hz = 7
- local LIS2DH12_ODR_1kHz620_LP = 8
- local LIS2DH12_ODR_5kHz376_LP = 9
- local LIS2DH12_ODR_1kHz344_NM_HP = 9
- local LIS2DH12_2g = 0
- local LIS2DH12_4g = 1
- local LIS2DH12_8g = 2
- local LIS2DH12_16g = 3
- local LIS2DH12_HR_12bit = 0
- local LIS2DH12_NM_10bit = 1
- local LIS2DH12_LP_8bit = 2
- local PROPERTY_DISABLE = 0
- local PROPERTY_ENABLE = 1
- local LIS2DH12_TEMP_DISABLE = 0
- local LIS2DH12_TEMP_ENABLE = 3
- local OUT_X_L = 0x28
- local OUT_X_H = 0x29
- local OUT_Y_L = 0x2A
- local OUT_Y_H = 0x2B
- local OUT_Z_L = 0x2C
- local OUT_Z_H = 0x2D
- local addr = 0x19
- local speed = 100000
- local WHO_AM_I = 0x0F
- local CTRL_REG1 = 0x20
- local CTRL_REG4 = 0x23
- local TEMP_CFG_REG = 0x1F
- local STATUS_REG = 0x27
- local STATUS_REG_AUX = 0x07
- local OUT_TEMP_L = 0x0C
- local OUT_TEMP_H = 0x0D
- local function LIS2DH12_FROM_FS_2g_HR_TO_mg(lsb) return (bit.rshift(lsb,4)) * 1.0 end
- local function LIS2DH12_FROM_FS_4g_HR_TO_mg(lsb) return (bit.rshift(lsb,4)) * 2.0 end
- local function LIS2DH12_FROM_FS_8g_HR_TO_mg(lsb) return (bit.rshift(lsb,4)) * 4.0 end
- local function LIS2DH12_FROM_FS_16g_HR_TO_mg(lsb) return (bit.rshift(lsb,4)) * 12.0 end
- local function LIS2DH12_FROM_LSB_TO_degC_HR(lsb) return (bit.rshift(lsb,6)) / 4.0 +25.0 end
- local function LIS2DH12_FROM_FS_2g_NM_TO_mg(lsb) return (bit.rshift(lsb,6)) * 4.0 end
- local function LIS2DH12_FROM_FS_4g_NM_TO_mg(lsb) return (bit.rshift(lsb,6)) * 8.0 end
- local function LIS2DH12_FROM_FS_8g_NM_TO_mg(lsb) return (bit.rshift(lsb,6)) * 16.0 end
- local function LIS2DH12_FROM_FS_16g_NM_TO_mg(lsb) return (bit.rshift(lsb,6)) * 48.0 end
- local function LIS2DH12_FROM_LSB_TO_degC_NM(lsb) return (bit.rshift(lsb,6)) / 4.0 +25.0 end
- local function LIS2DH12_FROM_FS_2g_LP_TO_mg(lsb) return (bit.rshift(lsb,8)) * 16.0 end
- local function LIS2DH12_FROM_FS_4g_LP_TO_mg(lsb) return (bit.rshift(lsb,8)) * 32.0 end
- local function LIS2DH12_FROM_FS_8g_LP_TO_mg(lsb) return (bit.rshift(lsb,8)) * 64.0 end
- local function LIS2DH12_FROM_FS_16g_LP_TO_mg(lsb) return (bit.rshift(lsb,8)) * 192.0 end
- local function LIS2DH12_FROM_LSB_TO_degC_LP(lsb) return (bit.rshift(lsb,8)) * 1.0 +25.0 end
- --------------------------------
- local function I2C_Write_Byte_LIS2DH12TR(regAddress,content)
- i2c.send(i2cid, addr, {regAddress,content})
- end
- local function I2C_Read_Byte_LIS2DH12TR(regAddress)
- i2c.send(i2cid, addr, regAddress)
- local rdstr = i2c.recv(i2cid, addr, 1)
- log.info("rdstr:toHex()",rdstr:toHex())
- return rdstr:byte(1)
- end
- -------------------------------------------------------------
- local function lis2dh12_block_data_update_set(val)
- local rdval = I2C_Read_Byte_LIS2DH12TR(CTRL_REG4)
- val = (val==1) and 0x80 or 0x00
- rdval = bit.band(rdval,0x7F)
- rdval = bit.bor(rdval, val)
- I2C_Write_Byte_LIS2DH12TR(CTRL_REG4,rdval)
- end
- local function lis2dh12_data_rate_set(val)
- val = bit.band(val,0x0F)
- val = bit.lshift(val,4)
- local rdval =I2C_Read_Byte_LIS2DH12TR(CTRL_REG1)
- rdval = bit.band(rdval,0x0F)
- rdval = bit.bor(rdval, val)
- I2C_Write_Byte_LIS2DH12TR(CTRL_REG1, rdval)
- end
- --
- local function lis2dh12_full_scale_set(val)
- val = bit.band(val,0x03)
- val = bit.lshift(val,4)
- local rdval = I2C_Read_Byte_LIS2DH12TR(CTRL_REG4)
- rdval = bit.band(rdval,0xCF)
- rdval = bit.bor(rdval, val)
- I2C_Write_Byte_LIS2DH12TR(CTRL_REG4,rdval)
- end
- local function lis2dh12_temperature_meas_set( val)
- val = bit.band(val,0x03)
- val = bit.lshift(val,6)
- local rdval = I2C_Read_Byte_LIS2DH12TR( TEMP_CFG_REG)
- rdval = bit.band(rdval,0x3F)
- rdval = bit.bor(rdval, val)
- I2C_Write_Byte_LIS2DH12TR(TEMP_CFG_REG, rdval)
- end
- local function lis2dh12_operating_mode_set(val)
- local rdval, lpen, hr
- if val == LIS2DH12_HR_12bit then
- lpen = 0x00
- hr = 0x08
- elseif val == LIS2DH12_NM_10bit then
- lpen = 0x00
- hr = 0x00
- elseif val == LIS2DH12_LP_8bit then
- lpen = 0x80
- hr = 0x00
- end
- rdval = I2C_Read_Byte_LIS2DH12TR( CTRL_REG1);
- rdval = bit.band(rdval,0xF7)
- rdval = bit.bor(rdval, lpen)
- I2C_Write_Byte_LIS2DH12TR( CTRL_REG1, rdval);
- rdval =I2C_Read_Byte_LIS2DH12TR( CTRL_REG4);
- rdval = bit.band(rdval,0xF7)
- rdval = bit.bor(rdval, hr)
- I2C_Write_Byte_LIS2DH12TR( CTRL_REG4, rdval);
- end
- local function lis2dh12_status_get()
- return I2C_Read_Byte_LIS2DH12TR( STATUS_REG)
- end
- local function lis2dh12_temp_data_ready_get()
- local rdval = I2C_Read_Byte_LIS2DH12TR(STATUS_REG_AUX)
- return bit.band(rdval,0x20)
- end
- local function lis2dh12_acceleration_raw_get()
- local xl,xh,yl,yh,zl,zh
-
- xl = I2C_Read_Byte_LIS2DH12TR(OUT_X_L)
- xh = I2C_Read_Byte_LIS2DH12TR(OUT_X_H)
- yl = I2C_Read_Byte_LIS2DH12TR(OUT_Y_L)
- yh = I2C_Read_Byte_LIS2DH12TR(OUT_Y_H)
- zl = I2C_Read_Byte_LIS2DH12TR(OUT_Z_L)
- zh = I2C_Read_Byte_LIS2DH12TR(OUT_Z_H)
- local x,y,z
- x = xh * 256 + xl
- y = yh * 256 + yl
- z = zh * 256 + zl
- log.info(string.format(" xl,xh,yl,yh,zl,zh =0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X ",xl,xh,yl,yh,zl,zh))
- return x,y,z
- end
- local function lis2dh12_temperature_raw_get()
- local tl,th
- tl = I2C_Read_Byte_LIS2DH12TR(OUT_TEMP_L)
- th = I2C_Read_Byte_LIS2DH12TR(OUT_TEMP_H)
-
- log.info(string.format("tl,th =%02X %02X ",tl,th))
- return th * 256 + tl
- end
- -- 初始化
- function init()
- if i2c.setup(i2cid, speed, addr) ~= speed then
- log.error("i2c", "setup fail", addr)
- return
- end
- local whoid = I2C_Read_Byte_LIS2DH12TR(WHO_AM_I)
- if whoid ==0x33 then
- log.info("===================dev is ok========================")
- else
- log.info("i2c dev id is wrong!")
- return false
- end
- lis2dh12_block_data_update_set(PROPERTY_ENABLE)
- lis2dh12_data_rate_set(LIS2DH12_ODR_10Hz)
- lis2dh12_full_scale_set(LIS2DH12_2g)
- lis2dh12_temperature_meas_set(LIS2DH12_TEMP_ENABLE)
- lis2dh12_operating_mode_set(LIS2DH12_HR_12bit)
- log.info("dev i2c init_ok")
- return true
- end
- --获取加速度计的原始数据
- local function TEST_LIS2DH12TR()
- local accel={x=nil,y=nil,z=nil}
- local xl,xh,yl,yh,zl,zh
- local stat = lis2dh12_status_get() or 0
- if bit.band(stat,0x10) >0 then
- local acceleration_mg ={0,0,0}
- local x,y,z = lis2dh12_acceleration_raw_get()
- acceleration_mg[1] = LIS2DH12_FROM_FS_2g_HR_TO_mg( x )
- acceleration_mg[2] = LIS2DH12_FROM_FS_2g_HR_TO_mg( y )
- acceleration_mg[3] = LIS2DH12_FROM_FS_2g_HR_TO_mg( z )
- log.info("Acceleration [mg]",acceleration_mg[1], acceleration_mg[2], acceleration_mg[3] , "--------------",x,y,z)
- if lis2dh12_temp_data_ready_get() >0 then
-
- local tempv = lis2dh12_temperature_raw_get()
- temperature_degC = LIS2DH12_FROM_LSB_TO_degC_HR( tempv)
- log.info("Temperature [degC]", temperature_degC,tempv)
- end
- else
- log.info("dev read loop!!!!!!!!!!!!!!!!")
- end
-
- end
- sys.taskInit(function()
- sys.wait(4000)
- if init() then
- while true do
- TEST_LIS2DH12TR()
- sys.wait(1000)
- end
- end
- end)
- sys.init(0, 0)
- sys.run()
|