资讯详情

【Luat-esp32】3.2 通过lvgl显示mpu6050数值

前言

尝试通过lvgl的bar控件,显示mpu6050的xyz数值。

代码

主控代码

  1. 加载四份文件(lcd初始化,mpu初始化和参数获取,lvgl示例,mpu的cont内容)
  2. 初始化lcd/lvgl/cont/bar
  3. 循环中获取mpu6050值,然后处理值
  4. 设置bar的数值
-- main.lua --- 模块功能:gsensor- esp32_mpu6050 -- @module mpu6050 -- @author youkai -- @release 2022.01.23  -- LuaTools需要PROJECT和VERSION这两个信息 PROJECT = "esp32_mpu6050" VERSION = "1.0.0"  log.info("main", PROJECT, VERSION)  -- sys库是标配 _G.sys = require("sys")  require("esp32_st7735")     --setup lcd require("mpu6xxx_nolocal")  --setup mpu6050 require("lvgl_demo") require("mpucont")  --添加硬狗防止程序卡死 -- wdt.init(15000)--初始化watchdog设置为15s -- sys.timerLoopStart(wdt.feed, 10000)--10s喂一次狗  -- ----------------setup start---------------------- -- 初始化屏幕 init_esp32_st7735 () init_lvgl() -- ----------------setup end------------------------  -- ================main start================ sys.taskInit(function()     init_mpu6050()      -- 有wait不能放在外面     init_mpu6050_cont()     -- si_x = init_mpu6050_slider_x()     -- si_y = init_mpu6050_slider_y()     -- si_z = init_mpu6050_slider_z()     sys.wait(1500)      init_bar("x")     init_bar("y")     init_bar("z")      while 1 do          temp_a = get_mpu6xxx_value()
        -- get_mpu6xxx_value()

        temp_x = set_bar_value(value_range[1][1],value_range[1][2],temp_a.x,"x")
        temp_y = set_bar_value(value_range[2][1],value_range[2][2],temp_a.y,"y")
        temp_z = set_bar_value(value_range[3][1],value_range[3][2],temp_a.z,"z")
        -- log.info("temp_x",temp_x)
        -- temp_x = set_slider_value(value_range[1][1],value_range[1][2],temp_a.x)
        -- temp_y = set_slider_value(value_range[2][1],value_range[2][2],temp_a.y,"y")
        -- temp_z = set_slider_value(value_range[3][1],value_range[3][2],temp_a.z)

        -- lvgl.bar_set_value(barx["bar"], 0, lvgl.ANIM_OFF)
        lvgl.bar_set_value(bar_list["x"]["bar"], temp_x, lvgl.ANIM_OFF)
        lvgl.bar_set_value(bar_list["y"]["bar"], temp_y, lvgl.ANIM_OFF)
        lvgl.bar_set_value(bar_list["z"]["bar"], temp_z, lvgl.ANIM_OFF)
        -- lvgl.slider_set_value(si_x, temp_x, lvgl.ANIM_OFF)
        -- lvgl.slider_set_value(si_y, temp_y, lvgl.ANIM_OFF)
        -- lvgl.slider_set_value(si_z, temp_z, lvgl.ANIM_OFF)

        -- log.debug("get-------",lvgl.slider_get_value(si_1))
        -- log.info("layout update")
        sys.wait(10)
    end
end)
-- ================main end==================

sys.run()

官方提供的mpu6050的demo,修改一点。

-- mpu6xxx_nolocal.lua
--- 模块功能:mpu6xxx
-- @module mpu6xxx
-- @author Dozingfiretruck
-- @license MIT
-- @copyright OpenLuat.com
-- @release 2020.12.22

--支持mpu6500,mpu6050,mpu9250,icm2068g,icm20608d,自动判断器件id,只需要配置i2c id就可以


sys = require "sys"

--pm.wake("mpu6xxx")

i2cid = 0 --i2cid

i2cslaveaddr = MPU6XXX_ADDRESS_AD0_LOW
deviceid = MPU6050_WHO_AM_I

MPU6XXX_ADDRESS_AD0_LOW     =   0x68 -- address pin low (GND), default for InvenSense evaluation board
MPU6XXX_ADDRESS_AD0_HIGH    =   0x69 -- address pin high (VCC)

---器件通讯地址
MPU6050_WHO_AM_I            =   0x68 -- mpu6050
MPU6500_WHO_AM_I            =   0x70 -- mpu6500
MPU9250_WHO_AM_I            =   0x71 -- mpu9250
ICM20608G_WHO_AM_I          =   0xAF -- icm20608G
ICM20608D_WHO_AM_I          =   0xAE -- icm20608D

MPU6XXX_ACCEL_SEN           =   16384
MPU6XXX_GYRO_SEN            =   1310

MPU60X0_TEMP_SEN            =   340
MPU60X0_TEMP_OFFSET         =   36.5

MPU6500_TEMP_SEN            =   333.87
MPU6500_TEMP_OFFSET         =   21

---MPU6XXX所用地址
MPU6XXX_RA_ACCEL_XOUT_H     =   0x3B
MPU6XXX_RA_ACCEL_XOUT_L     =   0x3C
MPU6XXX_RA_ACCEL_YOUT_H     =   0x3D
MPU6XXX_RA_ACCEL_YOUT_L     =   0x3E
MPU6XXX_RA_ACCEL_ZOUT_H     =   0x3F
MPU6XXX_RA_ACCEL_ZOUT_L     =   0x40
MPU6XXX_RA_TEMP_OUT_H       =   0x41
MPU6XXX_RA_TEMP_OUT_L       =   0x42
MPU6XXX_RA_GYRO_XOUT_H      =   0x43
MPU6XXX_RA_GYRO_XOUT_L      =   0x44
MPU6XXX_RA_GYRO_YOUT_H      =   0x45
MPU6XXX_RA_GYRO_YOUT_L      =   0x46
MPU6XXX_RA_GYRO_ZOUT_H      =   0x47
MPU6XXX_RA_GYRO_ZOUT_L      =   0x48

MPU6XXX_RA_SMPLRT_DIV     =   0x19   --陀螺仪采样率,典型值:0x07(125Hz)
MPU6XXX_RA_CONFIG         =   0x1A   --低通滤波频率,典型值:0x06(5Hz)
MPU6XXX_RA_GYRO_CONFIG    =   0x1B   --陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
MPU6XXX_RA_ACCEL_CONFIG   =   0x1C   --加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
MPU6XXX_RA_FIFO_EN        =   0x23   --fifo使能
MPU6XXX_RA_INT_PIN_CFG    =   0x37   --int引脚有效电平
MPU6XXX_RA_INT_ENABLE     =   0x38   --中断使能
MPU6XXX_RA_USER_CTRL      =   0x6A
MPU6XXX_RA_PWR_MGMT_1     =   0x6B   --电源管理,典型值:0x00(正常启用)
MPU6XXX_RA_PWR_MGMT_2     =   0x6C
MPU6XXX_RA_WHO_AM_I       =   0x75
--器件ID检测
function mpu6xxx_check()
    i2c.send(i2cid, MPU6XXX_ADDRESS_AD0_LOW, MPU6XXX_RA_WHO_AM_I)--读器件地址
    sys.wait(50)
    revData = i2c.recv(i2cid, MPU6XXX_ADDRESS_AD0_LOW, 1)
    if revData:byte() ~= nil then
        i2cslaveaddr = MPU6XXX_ADDRESS_AD0_LOW
    else
        i2c.send(i2cid, MPU6XXX_ADDRESS_AD0_HIGH, MPU6XXX_RA_WHO_AM_I)--读器件地址
        sys.wait(50)
        revData = i2c.recv(i2cid, MPU6XXX_ADDRESS_AD0_HIGH, 1)
        if revData:byte() ~= nil then
            i2cslaveaddr = MPU6XXX_ADDRESS_AD0_HIGH
        else
            log.info("i2c", "Can't find device")
            return 1
        end
    end
    i2c.send(i2cid, i2cslaveaddr, MPU6XXX_RA_WHO_AM_I)--读器件地址
    sys.wait(50)
    revData = i2c.recv(i2cid, i2cslaveaddr, 1)
    log.info("Device i2c address is#:", revData:toHex())
    if revData:byte() == MPU6050_WHO_AM_I then
        deviceid = MPU6050_WHO_AM_I
        log.info("Device i2c id is: MPU6050")
    elseif revData:byte() == MPU6500_WHO_AM_I then
        deviceid = MPU6500_WHO_AM_I
        log.info("Device i2c id is: MPU6500")
    elseif revData:byte() == MPU9250_WHO_AM_I then
        deviceid = MPU9250_WHO_AM_I
        log.info("Device i2c id is: MPU9250")
    elseif revData:byte() == ICM20608G_WHO_AM_I then
        deviceid = ICM20608G_WHO_AM_I
        log.info("Device i2c id is: ICM20608G")
    elseif revData:byte() == ICM20608D_WHO_AM_I then
        deviceid = ICM20608D_WHO_AM_I
        log.info("Device i2c id is: ICM20608D")
    else
        log.info("i2c", "Can't find device")
        return 1
    end
    return 0
end

--器件初始化
function mpu6xxx_init()
    i2c.send(i2cid, i2cslaveaddr, { 
        MPU6XXX_RA_PWR_MGMT_1, 0x80})--复位
    sys.wait(100)
    i2c.send(i2cid, i2cslaveaddr, { 
        MPU6XXX_RA_PWR_MGMT_1, 0x00})--唤醒
    sys.wait(100)
    i2c.send(i2cid, i2cslaveaddr, { 
        MPU6XXX_RA_SMPLRT_DIV, 0x07})--陀螺仪采样率,典型值:0x07(125Hz)
    i2c.send(i2cid, i2cslaveaddr, { 
        MPU6XXX_RA_CONFIG, 0x06})--低通滤波频率,典型值:0x06(5Hz)
    i2c.send(i2cid, i2cslaveaddr, { 
        MPU6XXX_RA_GYRO_CONFIG, 0x18})--陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
    i2c.send(i2cid, i2cslaveaddr, { 
        MPU6XXX_RA_ACCEL_CONFIG, 0x01})--加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
    --i2c.send(i2cid, i2cslaveaddr, {MPU6XXX_RA_FIFO_EN, 0x00})--关闭fifo
    --i2c.send(i2cid, i2cslaveaddr, {MPU6XXX_RA_INT_ENABLE, 0x00})--关闭所有中断
    --i2c.send(i2cid, i2cslaveaddr, {MPU6XXX_RA_USER_CTRL, 0x00})--I2C主模式关闭
    i2c.send(i2cid, i2cslaveaddr, { 
        MPU6XXX_RA_PWR_MGMT_1, 0x01})--设置x轴的pll为参考
    i2c.send(i2cid, i2cslaveaddr, { 
        MPU6XXX_RA_PWR_MGMT_2, 0x00})--加速度计与陀螺仪开启
    log.info("i2c init_ok")
end
--获取温度的原始数据
function mpu6xxx_get_temp_raw()
    i2c.send(i2cid, i2cslaveaddr,MPU6XXX_RA_TEMP_OUT_H)--获取的地址
    buffer = i2c.recv(i2cid, i2cslaveaddr, 2)--获取2字节
    temp = string.unpack(">h",buffer)
    --log.info("get_temp_raw type: "..type(buffer).." hex: "..buffer:toHex().." temp: "..temp)
    return temp or 0
end
--获取加速度计的原始数据
function mpu6xxx_get_accel_raw()
    accel={ 
        x=nil,y=nil,z=nil}
    i2c.send(i2cid, i2cslaveaddr,MPU6XXX_RA_ACCEL_XOUT_H)--获取的地址
    x = i2c.recv(i2cid, i2cslaveaddr, 2)--获取6字节
    accel.x = string.unpack(">h",x)
    i2c.send(i2cid, i2cslaveaddr,MPU6XXX_RA_ACCEL_YOUT_H)--获取的地址
    y = i2c.recv(i2cid, i2cslaveaddr, 2)--获取6字节
    accel.y = string.unpack(">h",y)
    i2c.send(i2cid, i2cslaveaddr,MPU6XXX_RA_ACCEL_ZOUT_H)--获取的地址
    z = i2c.recv(i2cid, i2cslaveaddr, 2)--获取6字节
    accel.z = string.unpack(">h",z)
    --log.info("get_accel_raw: x="..x:toHex().." y="..y:toHex().." z="..z:toHex())
    return accel or 0
end
--获取陀螺仪的原始数据
function mpu6xxx_get_gyro_raw()
    gyro={ 
        x=nil,y=nil,z=nil}
    i2c.send(i2cid, i2cslaveaddr,MPU6XXX_RA_GYRO_XOUT_H)--获取的地址
    x = i2c.recv(i2cid, i2cslaveaddr, 2)--获取6字节
    gyro.x = string.unpack(">h",x)
    i2c.send(i2cid, i2cslaveaddr,MPU6XXX_RA_GYRO_YOUT_H)--获取的地址
    y = i2c.recv(i2cid, i2cslaveaddr, 2)--获取6字节
    gyro.y = string.unpack(">h",y)
    i2c.send(i2cid, i2cslaveaddr,MPU6XXX_RA_GYRO_ZOUT_H)--获取的地址
    z = i2c.recv(i2cid, i2cslaveaddr, 2)--获取6字节
    gyro.z = string.unpack(">h",z)
    return gyro or 0
end
--获取温度的原始数据
function mpu6xxx_get_temp()
    temp=nil
    tmp = mpu6xxx_get_temp_raw()
    if deviceid == MPU6050_WHO_AM_I then
        temp = tmp / MPU60X0_TEMP_SEN + MPU60X0_TEMP_OFFSET
    else
        temp = tmp / MPU6500_TEMP_SEN + MPU6500_TEMP_OFFSET
    end
    return temp
end
--获取加速度计的数据,单位: mg
function mpu6xxx_get_accel()
    accel={ 
        x=nil,y=nil,z=nil}
    tmp = mpu6xxx_get_accel_raw()
    accel.x = tmp.x*1000/MPU6XXX_ACCEL_SEN
    accel.y = tmp.y*1000/MPU6XXX_ACCEL_SEN
    accel.z = tmp.z*1000/MPU6XXX_ACCEL_SEN
    return accel
end
--获取陀螺仪的数据,单位: deg / 10s
function mpu6xxx_get_gyro()
    gyro={ 
        x=nil,y=nil,z=nil}
    tmp = mpu6xxx_get_gyro_raw()
    gyro.x = tmp.x*100/MPU6XXX_GYRO_SEN
    gyro.y = tmp.y*100/MPU6XXX_GYRO_SEN
    gyro.z = tmp.z*100/MPU6XXX_GYRO_SEN
    return gyro
end
function check_i2c()
    if i2c.setup(i2cid,i2c.SLOW) ~= i2c.SLOW then
        log.error("testI2c.init","fail")
        return
    end
    if mpu6xxx_check()~= 0 then
        return
    end
end



function init_mpu6050()
    log.info("init_mpu6050 start---------------")
    sys.wait(1000)
    check_i2c()
    mpu6xxx_init()
    log.info("init_mpu6050 end---------------")

    -- -- judge value range
    -- x_max =0
    -- x_min =0
    -- y_max =0
    -- y_min =0
    -- z_max =0
    -- z_min =0
    -- temp_a_ymax = 0
    value_range = { 
        { 
        1100,-994},{ 
        1020,-1090},{ 
        1590,-1320}}
    -- log.info(value_range[2][2])


end

-- judge value range
function judge_x(temp)
    if temp > x_max then
        x_max = temp
        return
    end
    if temp < x_min then
        x_min = temp
        return
    end
end

function judge_y(temp)
    if temp > y_max then
        y_max = temp
        return
    end
    if temp < y_min then
        y_min = temp
        return
    end
end

function judge_z(temp)
    if temp > z_max then
        z_max = temp
        return
    end
    if temp < z_min then
        z_min = temp
        return
    end
end

function get_mpu6xxx_value()
    t = mpu6xxx_get_temp()
    -- log.info("6050temptest", t)
    a = mpu6xxx_get_accel()
    -- log.info("6050acceltest", "accel.x",a.x,"accel.y",a.y,"accel.z",a.z)
    g = mpu6xxx_get_gyro()
    -- log.info("6050gyrotest", "gyro.x",g.x,"gyro.y",g.y,"gyro.z",g.z)

    

    -- judge value range
    -- judge_x(a.x)
    -- judge_y(a.y)
    -- judge_z(a.z)
    -- log.info("x",x_max,x_min,"y",y_max,y_min,"z",z_max,z_min)
    return a
end

创建cont和bar

-- mpucont.lua
function init_mpu6050_cont()
    -- 初始化容器cont
    --{ 
        
    mpu6050_cont = lvgl.cont_create(lvgl.scr_act(), nil)
    lvgl.obj_set_size(mpu6050_cont,128,160)
    lvgl.obj_set_auto_realign(mpu6050_cont, true)                    --Auto realign when the size changes*/
    lvgl.obj_align_origo(mpu6050_cont, nil, lvgl.ALIGN_IN_TOP_MID, 0, 0)  --This parametrs will be sued when realigned*/
    -- lvgl.cont_set_fit(mpu6050_cont, lvgl.FIT_TIGHT) --此时cont依据内容拓展,容易左右超过界限
    -- lvgl.cont_set_fit(mpu6050_cont, lvgl.FIT_MAX)
    lvgl.cont_set_fit(mpu6050_cont, lvgl.FIT_NONE)   --此时cont未设置自适应状态,则内容在cont中
    -- lvgl.cont_set_layout(mpu6050_cont, lvgl.LAYOUT_COLUMN_MID)--字符布局居中
    -- lvgl.cont_set_layout(mpu6050_cont, lvgl.LAYOUT_COLUMN_LEFT) --布局靠左
    --}

    log.info("scr_load",lvgl.scr_load(mpu6050_cont))     --显示 容器

    label_mpu = lvgl.label_create(mpu6050_cont,nil)
    lvgl.label_set_text(label_mpu,"xyz accel value")
    lvgl.obj_align(label_mpu, nil,lvgl.ALIGN_IN_TOP_MID,0,0)

    return mpu6050_cont
end

-- x=1,y=2,z=3
bar_x_table = { 
        }
bar_y_table = { 
        }
bar_z_table = { 
        }

bar_list = { 
        }
bar_list["x"] = bar_x_table
bar_list["y"] = bar_y_table
bar_list["z"] = bar_z_table

function init_bar_x()
    --初始化
    --{ 
        
    bar_x_table["bar"] = lvgl.bar_create(mpu6050_cont, nil)  -- 创建进度条
    lvgl.obj_set_size(bar_x_table["bar"], 115, 5)            -- 设置尺寸
    -- lvgl.obj_align(bar_x_table["bar"], NULL, lvgl.ALIGN_IN_TOP_MID, 0, 0)-- 设置位置居中
    lvgl.obj_set_pos(bar_x_table["bar"], 5, 5)
    --}

    lvgl.bar_set_value(bar_x_table["bar"], 0, lvgl.ANIM_OFF)-- 设置加载到的值,默认范围为0-100
    log.info("scr_load",lvgl.scr_load(bar_x_table["bar"]))     --显示
    
    
    bar_x_lab = lvgl.label_create(mpu6050_cont, nil)
    -- lvgl.obj_set_size(bar_x_lab, 10, 10)
    lvgl.label_set_text(bar_x_lab,"x")
    -- lvgl.obj_set_auto_realign(bar_x_lab, true)
    lvgl.obj_align(bar_x_lab, bar_x_table["bar"], lvgl.ALIGN_OUT_BOTTOM_MID, 0, 0)
    -- lvgl.obj_set_pos(bar_x_lab,0,20)
    -- lvgl.label_set_text(bar_x_lab,"x")
    -- log.info("scr_load",lvgl.disp_load_scr(bar_x_lab))
    -- log.info("scr_load",lvgl.scr_load(bar_x_lab))

    -- range_bar_min_x= 0 -- bar最小值
    -- range_bar_max_x =100 -- bar最大值
    -- range_bar = range_bar_max_x - range_bar_min_x
    bar_x_table["range_min"] = 0
    bar_x_table
        标签: 温度传感器99st400700

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司