前言
尝试通过lvgl的bar控件,显示mpu6050的xyz数值。
代码
主控代码
- 加载四份文件(lcd初始化,mpu初始化和参数获取,lvgl示例,mpu的cont内容)
- 初始化lcd/lvgl/cont/bar
- 循环中获取mpu6050值,然后处理值
- 设置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