Lua脚本开发简单快速,在Cat.1和MCU开发应用中已历经验证并广受好评。所以LuatOS社群经常有人问:合宙推出的口袋神器——IoT Power,可以脚本开发吗?
答案肯定是可以。今天我们就来看看,当IoT Power遇上Lua脚本开发,会擦出怎样的火花~
浅谈IoT Power的Lua脚本开发应用
合宙IoT Power专为工程师朋友量身打造,外观近似ZIPPO打火机大小——既是一款高性能高精度的迷你型可调电源, 也是兼备记录分析功能的低功耗电流分析仪。
● 测量二极管伏安特性曲线
二极管伏安特性,初中物理课就学过的一个基本物理法则,相信大家都再熟悉不过了。可是通常测量这个曲线很麻烦,要不停的调整电压并记录电流然后绘图。
调整电压看电流,这不正是IoT Power的强项嘛!那我们只需要写脚本慢慢升高电压,然后读取电流自动绘图就行了。
说干就干,写个脚本:
▼ 上下滚动,查看全部 ▼
手机横屏查看更方便
Lua
--该脚本可以测量二极管伏安特性曲线 --测试前请先关闭输出,然后将二极管正负极分别连接至IoT Power
--最终将生成一张图片
apiMessageBox("提示", "请先选择需要保存图表的文件位置")
local path = apiGetSavePath("png")
if not apiSetDevice(0, 0, false) then apiMessageBox("警告", "获取不到信息,请确保你已连接设备!") print("脚本已退出") return
end
--开个任务来测
sys.taskInit( function() sys.wait(1000) --结果存这里 local c = {} local v = {} print("开始测试") for i =
1
,
do --mA档位时 apiSetDevice(i / 10, 1, true) sys.wait(500) local tc, tv = apiGetCV() if tc and tv then if not (#v > 0 and tv < v[#v]) then table.insert(c, tc) table.insert(v, tv) print("got", tc, tv) end end end for i = 4, 50 do --A档位时 apiSetDevice(i, 1, true) sys.wait(500) local tc, tv = apiGetCV() if tc and tv and tv > v[#v] then table.insert(c, tc) table.insert(v, tv) print("got", tc, tv) end end if path then print(apiPlot(v, c, "二极管伏安曲线", "电压(V)", "电流(mA)",19
500
,
, 500
path
))
print("测试结束!文件已保存在", path) end apiSetDevice(0, 0, false) end)
运行一下看看效果:
● 模拟电池放电曲线
在真实世界里电池的电压下降不是线性的,所以经常会遇到电池前面一段很耐用,但是到了一定电压以后,电压开始快速下降。
这种过程原来很难模拟,但是有了脚本就不一样了。我们可以通过脚本模拟电池放电曲线,达到和真实电池一样的电压变化。
▼ 上下滚动,查看全部 ▼ 手机横屏查看更方便
Lua
--模拟电池放电脚本
--请根据实际需求修改这里的变量值
--请先连接设备,再运行脚本
--最大电流限制,单位mA
local
maxCurrent = 1000
--电池电量(单位mWh),这里假定0.37Wh(3.7V 100mAh)
local
power = 0.37
* 1000
--例子数据:
--瓦时和毫安时换算
--Wh=V×mAh÷1000
--mAh=Wh÷V×1000
--电量从100%到0%,每10%的电压(除了最后四个为15
%、10%、5%、0%)
local
vt = {
4.2
,
4.08
,
4
,
3.93
,
3.87
,
3.82
,
3.79
,
3.77
,
3.73
,
3.7
,
3.68
,
3.
5
,
2.5
}
--获取使用过多少电量后的电池电压
--传入值0-100,传入整型数字
function
getVoltagePercent(used)
if
used >= 100
then
return
vt[#vt]
end
if
used < 80
th
en
--剩余电量大于20%
local
now = ma
th
.fl
oor
(used / 10
)
local
offset = (used % 10
) / 10
return
vt[now + 1
] - (vt[now + 1
] - vt[now + 2
]) * offset
else
--剩余电量小于20%
local
now = math
.floor
((used - 80
) / 5
)
local
offset = (used % 5
) / 5
return
vt[now + 9
] - (vt[now + 9
] - vt[now + 10
]) * offset
end
end
sys.taskInit(
function
()
print
("开始测试!")
local
totalPower = 0
local
lastPower = apiGetPower()
local
lastv = 0
while
true do
local
pNow = apiGetPower()
local
p = pNow - lastPower
--防止比上次小
if
p > 0 then
totalPower = totalPower + p
end
lastPower = pNow
--算一下现在用了多少电
local
used = math
.floor
(totalPower / power * 100
)
--获取当前电压
local
v = getVoltagePercent(used)
--和上次电压不同的时候,就设置一下电压
if
v ~= lastv then
local
r = apiSetDevice(maxCurrent, v, true)
if not
r then
print
("电压设置失败,请检查数据和设备连接")
end
end
lastv = v
print
("已使用电量" .. totalPower .. "mWh," .. used .. "%,输出电压" .. v .. "V")
sys.wait(2000
)
end
end
)
● 模拟电池内阻
电池放电过程中不仅仅是电压的下降,实际上内阻也会发生变化。特别是一些低功耗设备的锂亚电池,电压下降以后内阻很大导致输出电流很小,当设备进行无线发射时会遇到电流不够导致重启。这种现象在研发阶段很难模拟,就会导致设备实际工作时长和理论值偏差较大。
通过IoT Power脚本,我们可以设置在不同电压下的最大电流模拟电池内阻,达到和真实世界一样的情况,方便在研发期及时发现问题。
IoT Power使用及技术交流
在最新版本的IoT Power上位机的脚本控制页面,即可看到模拟电池放电和测量二极管伏安曲线的两个示例脚本。
最新客户端/使用说明: https://iotpower.luatos.com/
可根据实际需求,新建自己的脚本自由发挥;相关Lua接口在帮助文档页面查找。
审核编辑 :李倩
全部0条评论
快来发表一下你的评论吧 !