|
|
@@ -1,18 +1,20 @@
|
|
|
--- 定义一个名为airpower的表
|
|
|
-local airpower = {}
|
|
|
--- 引入dnsproxy模块
|
|
|
+
|
|
|
+local airpower = {}
|
|
|
+--[[定义一个名为airpower的表,引入三个模块:
|
|
|
+dnsproxy(DNS代理)、dhcpsrv(DHCP服务)
|
|
|
+和httpplus(HTTP增强)。]]
|
|
|
dnsproxy = require("dnsproxy")
|
|
|
--- 引入dhcpsrv模块
|
|
|
dhcpsrv = require("dhcpsrv")
|
|
|
--- 引入httpplus模块
|
|
|
httpplus = require("httpplus")
|
|
|
--- 定义一个名为run_state的变量,用于判断本UI DEMO 是否运行
|
|
|
-local run_state = false -- 判断本UI DEMO 是否运行
|
|
|
|
|
|
-local gpio_pin = 152
|
|
|
+
|
|
|
+local run_state = false --[[定义一个名为run_state的变量,用于控制UI演示的运行状态,初始为false.
|
|
|
+ 用于后续判断本UI DEMO 是否运行,如果运行,则不启动其他UI DEMO]]
|
|
|
+
|
|
|
+local gpio_pin = 152--[[定义GPIO引脚号为152,用于与充电芯片通信]]
|
|
|
-- gpio.setup(gpio_pin, 1, gpio.PULLUP)
|
|
|
--- yhm2712芯片地址
|
|
|
-local sensor_addr = 0x04
|
|
|
+
|
|
|
+local sensor_addr = 0x04-- yhm2712芯片地址,默认为0x04,各位可自行上网查找该型号的设计手册。
|
|
|
-- 电压控制寄存器地址
|
|
|
local V_ctrl_register = 0x00
|
|
|
-- 电流控制寄存器地址
|
|
|
@@ -56,7 +58,8 @@ local set_1I5 = 0xA2 -- 1.5倍,1.5*500=750mA
|
|
|
local set_2I = 0xC2 -- 2倍,2.0*500=1000mA
|
|
|
local set_3I = 0xE2 -- 3倍,3.0*500=1500mA
|
|
|
|
|
|
-local V_table = {
|
|
|
+local V_table = { --[[将电压设置表:(寄存器写入值)映射为可读的电压字符串。
|
|
|
+ 即224对应0xE0,即set_4V的值,表示4V。]]
|
|
|
["224"] = "4.0V",
|
|
|
["240"] = "4.1V",
|
|
|
["0"] = "4.2V",
|
|
|
@@ -65,7 +68,10 @@ local V_table = {
|
|
|
["48"] = "4.275V",
|
|
|
["64"] = "4.3V",
|
|
|
["80"] = "4.325V",
|
|
|
- ["96"] = "4.35V",
|
|
|
+
|
|
|
+ ["96"] = "4.35V", --[[是我们air8000的门限电压:指的是充电过程控制的关键阈值电压,具体来说:
|
|
|
+ 充电控制器预设的电池最高允许充电电压是充电模式切换的关键判定值]]
|
|
|
+
|
|
|
["112"] = "4.375V",
|
|
|
["128"] = "4.4V",
|
|
|
["144"] = "4.425V",
|
|
|
@@ -75,18 +81,22 @@ local V_table = {
|
|
|
["208"] = "4.525V"
|
|
|
}
|
|
|
|
|
|
-local I_table = {
|
|
|
- ["32"] = "100mA",
|
|
|
+local I_table={ --电流设置值(十六进制 -> 电流值)
|
|
|
+ ["1"] = "100mA",
|
|
|
["0"] = "250mA",
|
|
|
- ["64"] = "350mA",
|
|
|
- ["96"] = "450mA",
|
|
|
- ["128"] = "500mA",
|
|
|
- ["160"] = "750mA",
|
|
|
- ["192"] = "1000mA",
|
|
|
- ["224"] = "1500mA"
|
|
|
-}
|
|
|
+ ["2"] = "350mA",
|
|
|
+ ["3"] = "450mA",
|
|
|
+ ["4"] = "500mA",
|
|
|
+ ["5"] = "750mA",
|
|
|
+ ["6"] = "1000mA",
|
|
|
+ ["7"] = "1500mA", --注意,这里是 yhm2712芯片最大可支持1500mA,请严格遵循各物料的规格书
|
|
|
+ }
|
|
|
|
|
|
-local charge_status_table = {
|
|
|
+local charge_status_table = { --[[在充电芯片(yhm2712)的状态寄存器(status1_register,地址0x05)中,
|
|
|
+ 有一个字段表示当前的充电状态。根据之前的代码,这个状态字段位于该寄存
|
|
|
+ 器的最高3位(bit7、bit6、bit5)。因此,通过读取寄存器0x05的值,然后
|
|
|
+ 将其与0xE0(二进制11100000)进行按位与操作,再右移5位,就可以得到一
|
|
|
+ 个0到7之间的整数,这个整数就代表当前充电状态。]]
|
|
|
["0"] = "放电模式",
|
|
|
["1"] = "预充电模式",
|
|
|
["2"] = "涓流充电",
|
|
|
@@ -99,22 +109,25 @@ local charge_status_table = {
|
|
|
|
|
|
|
|
|
|
|
|
--- 新增:系统状态变量
|
|
|
+-- 定义系统状态变量表,用于存储后续我们所需的系统状态信息
|
|
|
local system_state = {
|
|
|
- usb_connected = false, -- USB连接状态
|
|
|
+ usb_connected = false, -- USB连接状态,初始状态为未连接
|
|
|
battery_voltage = 0.0, -- 电池电压
|
|
|
charge_status = "未知状态", -- 充电状态
|
|
|
last_update = 0 -- 最后更新时间
|
|
|
}
|
|
|
-local vbus_pin = gpio.WAKEUP1
|
|
|
--- 新增:充电芯片初始化任务
|
|
|
+
|
|
|
+local vbus_pin = gpio.WAKEUP1 --[[测试USB是否连接,就要测试VBUS脚是否有电,我们后续要用gpio中断来确认是否连接,
|
|
|
+ 而VBUS脚是gpio.WAKEUP1,所以这里我们定义vbus_pin为gpio.WAKEUP1]]
|
|
|
+
|
|
|
+-- :充电芯片初始化任务
|
|
|
local function yhm27xxx()
|
|
|
sys.wait(1000)
|
|
|
- local result, data = yhm27xx.cmd(gpio_pin, sensor_addr, id_register)
|
|
|
+ local result, data = yhm27xx.cmd(gpio_pin, sensor_addr, id_register)-- 读取芯片ID
|
|
|
sys.wait(200)
|
|
|
log.info("result", result, "data", data)
|
|
|
- -- 设置充电电压为4V
|
|
|
- result, data = sensor.yhm27xx(gpio_pin, sensor_addr, V_ctrl_register, set_4V)
|
|
|
+
|
|
|
+ result, data = sensor.yhm27xx(gpio_pin, sensor_addr, V_ctrl_register, set_4V35)-- 设置充电电压(4.35V)
|
|
|
if result == true then
|
|
|
log.info("yhm27xxx 设置电压成功")
|
|
|
else
|
|
|
@@ -122,8 +135,8 @@ local function yhm27xxx()
|
|
|
end
|
|
|
sys.wait(200)
|
|
|
|
|
|
- -- 充电电流设置为1倍
|
|
|
- result, data = yhm27xx.cmd(gpio_pin, sensor_addr, I_ctrl_register, set_0I5)
|
|
|
+
|
|
|
+ result, data = yhm27xx.cmd(gpio_pin, sensor_addr, I_ctrl_register, set_I)-- 设置充电电流1倍(500mA)
|
|
|
if result == true then
|
|
|
log.info("yhm27xxx 设置电流成功")
|
|
|
else
|
|
|
@@ -145,25 +158,27 @@ local function yhm27xxx()
|
|
|
charge_status_table[tostring((Data_reg[6] & 0xE0) >> 5)])
|
|
|
end
|
|
|
log.info("yhm27xxx 寄存器0x00 功能:设置充电电压, 读取数据为:", V_table[tostring(Data_reg[1])])
|
|
|
- log.info("yhm27xxx 寄存器0x00 功能:设置充电电流, 读取数据为:", I_table[tostring(Data_reg[2])])
|
|
|
- log.info("yhm27xxx 寄存器0x05 功能:充电状态寄存器(只读),读取数据为:",
|
|
|
- charge_status_table[tostring((Data_reg[6] & 0xE0) >> 5)])
|
|
|
+ log.info("yhm27xxx 寄存器0x01 功能:设置充电电流, 读取数据为:", I_table[tostring((Data_reg[2] & 0xE0)>>5)])
|
|
|
+ log.info("yhm27xxx 寄存器0x05 功能:充电状态寄存器(只读),读取数据为:",charge_status_table[tostring((Data_reg[6] & 0xE0) >> 5)])
|
|
|
end
|
|
|
local adc_pin = adc.CH_VBAT -- adc.CH_VBAT
|
|
|
|
|
|
-- 新增:电池状态监控任务
|
|
|
function battery_voltage()
|
|
|
- -- 初始化ADC(管脚75)
|
|
|
+ -- 初始化ADC0(管脚75)
|
|
|
adc.open(adc_pin)
|
|
|
- -- 获取ADC通道CH_VBAT的值
|
|
|
+ -- 获取ADC通道的值
|
|
|
local vbat = adc.get(adc_pin)
|
|
|
- -- 打印ADC通道CH_VBAT的值
|
|
|
+ -- 打印ADC通道的值
|
|
|
log.info("vbat", vbat)
|
|
|
while true do
|
|
|
-- 1. 读取电池电压
|
|
|
local raw_value = adc.read(adc_pin) -- 读取ADC值
|
|
|
+ -- 计算电池电压
|
|
|
system_state.battery_voltage = (raw_value * 4) / 4096
|
|
|
+ -- 打印原始值
|
|
|
log.info("raw_value", raw_value)
|
|
|
+ -- 打印电池电压
|
|
|
log.info("battery_voltage", system_state.battery_voltage)
|
|
|
sys.wait(3000) -- 每秒更新一次
|
|
|
if not run_state then -- 等待结束,返回主界面
|
|
|
@@ -172,52 +187,63 @@ function battery_voltage()
|
|
|
end
|
|
|
end
|
|
|
|
|
|
-local function usb_connected() -- 2. 新增检测USB状态,测VBUS脚(即gpio.WAKEUP1)
|
|
|
- gpio.setup(vbus_pin, function(val) -- 判断VBUS脚是否有返回值
|
|
|
+local function usb_connected() -- 2. 新增检测USB状态,测VBUS脚(即gpio.WAKEUP1)
|
|
|
+ gpio.setup(vbus_pin, function(val) -- 判断VBUS脚是否有返回值
|
|
|
log.info("USB状态变化", val == 1 and "插入" or "拔出")
|
|
|
system_state.usb_connected = (val == 1)
|
|
|
- end, gpio.PULLUP, gpio.BOTH) -- 关键:上拉电阻+双沿触发
|
|
|
- gpio.debounce(vbus_pin, 500, 1) -- 添加消抖处理(500ms)
|
|
|
+ end, gpio.PULLUP, gpio.BOTH) -- 关键:上拉电阻+双沿触发
|
|
|
+ gpio.debounce(vbus_pin, 500, 1) -- 添加消抖处理(500ms)
|
|
|
|
|
|
system_state.usb_connected = (gpio.get(vbus_pin) == 1) -- 初始状态读取
|
|
|
log.info("USB初始状态", system_state.usb_connected and "已连接" or "未连接")
|
|
|
|
|
|
end
|
|
|
|
|
|
-local function charge_status()
|
|
|
+local function charge_status() -- 3. 读取充电状态
|
|
|
while true do
|
|
|
- -- 3. 读取充电状态
|
|
|
- -- 向传感器发送请求,获取传感器地址
|
|
|
+
|
|
|
+ -- 向传感器发送请求,获取传感器地址
|
|
|
+ log.info("yhm27xx teeee", gpio_pin, sensor_addr)
|
|
|
yhm27xx.reqinfo(gpio_pin, sensor_addr)
|
|
|
- -- 等待传感器返回数据,超时时间为3000毫秒
|
|
|
+ -- 等待传感器返回数据,超时时间为3000毫秒
|
|
|
local result, data = sys.waitUntil("YHM27XX_REG", 3000)
|
|
|
-- 打印返回结果和返回数据
|
|
|
- log.info("result", result, "data", data)
|
|
|
+ -- log.info("result", result, "data", data)
|
|
|
|
|
|
+ -- 如果result为真,则执行以下代码
|
|
|
if result then
|
|
|
+ -- 定义一个空表Data_reg
|
|
|
local Data_reg = {}
|
|
|
+ -- 循环读取data的前9个字节,并存储到Data_reg表中
|
|
|
for i = 1, 9 do
|
|
|
Data_reg[i] = data:byte(i)
|
|
|
end
|
|
|
-- 解析充电状态
|
|
|
+ -- 从Data_reg表的第6个字节中取出高5位,右移5位,得到status_code
|
|
|
local status_code = (Data_reg[6] & 0xE0) >> 5
|
|
|
+ -- 将status_code转换为字符串,并从charge_status_table表中查找对应的充电状态,如果找不到,则默认为"未知状态"
|
|
|
system_state.charge_status = charge_status_table[tostring(status_code)] or "未知状态"
|
|
|
+ -- 打印充电状态
|
|
|
log.info("充电状态", system_state.charge_status)
|
|
|
end
|
|
|
|
|
|
- -- 4. 更新最后读取时间
|
|
|
- system_state.last_update = os.time()
|
|
|
- if not run_state then -- 等待结束,返回主界面
|
|
|
- return
|
|
|
- end
|
|
|
- sys.wait(1000) -- 每秒更新
|
|
|
+ -- 4. 更新最后读取时间
|
|
|
+ system_state.last_update = os.time()
|
|
|
+ if not run_state then -- 等待结束,返回主界面
|
|
|
+ return
|
|
|
+ end
|
|
|
+ sys.wait(3000) -- 每秒更新
|
|
|
end
|
|
|
end
|
|
|
-- 以下为UI运行函数(添加电池信息显示)
|
|
|
+-- 电源管理测试函数
|
|
|
+-- 电源管理测试函数
|
|
|
function airpower.run()
|
|
|
|
|
|
+ -- 初始化电池电压
|
|
|
sys.taskInit(battery_voltage)
|
|
|
- sys.taskInit(yhm27xxx0)
|
|
|
+ -- 初始化yhm27xxx
|
|
|
+ sys.taskInit(yhm27xxx)
|
|
|
sys.taskInit(charge_status)
|
|
|
sys.taskInit(usb_connected)
|
|
|
|
|
|
@@ -254,6 +280,7 @@ function airpower.run()
|
|
|
|
|
|
end
|
|
|
|
|
|
+-- 触摸屏事件处理函数
|
|
|
function airpower.tp_handal(x, y, event)
|
|
|
if x > 100 and x < 180 and y > 360 and y < 440 then -- 返回主界面
|
|
|
run_state = false
|