init: Air780EPM 官方 LuatOS 项目代码基线
- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
--[[
|
||||
@module main
|
||||
@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
|
||||
@version 001.999.000
|
||||
@date 2025.10.15
|
||||
@author 王城钧
|
||||
@usage
|
||||
1. rtc_app:无网络时初始化并每秒打印东八区本地时间与 UTC 时间,
|
||||
有网络时等待 NTP 授时后,同样每秒打印更新后的实时时间与 UTC 时间。
|
||||
]]
|
||||
|
||||
--[[
|
||||
必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
|
||||
PROJECT:项目名,ascii string类型
|
||||
可以随便定义,只要不使用,就行
|
||||
VERSION:项目版本号,ascii string类型
|
||||
如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
|
||||
X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
|
||||
因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为999
|
||||
如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
|
||||
]]
|
||||
PROJECT = "rtc_demo"
|
||||
VERSION = "001.999.000"
|
||||
|
||||
-- 在日志中打印项目名和项目版本号
|
||||
log.info("main", PROJECT, VERSION)
|
||||
|
||||
|
||||
|
||||
-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
|
||||
-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
|
||||
-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
|
||||
-- 启动errDump日志存储并且上传功能,600秒上传一次
|
||||
-- if errDump then
|
||||
-- errDump.config(true, 600)
|
||||
-- end
|
||||
|
||||
|
||||
-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
|
||||
-- 可以使用合宙的iot.openluat.com平台进行远程升级
|
||||
-- 也可以使用客户自己搭建的平台进行远程升级
|
||||
-- 远程升级的详细用法,可以参考fota的demo进行使用
|
||||
|
||||
|
||||
-- 启动一个循环定时器
|
||||
-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
|
||||
-- 方便分析内存使用是否有异常
|
||||
-- sys.timerLoopStart(function()
|
||||
-- log.info("mem.lua", rtos.meminfo())
|
||||
-- log.info("mem.sys", rtos.meminfo("sys"))
|
||||
-- end, 3000)
|
||||
|
||||
|
||||
--加载rtc时钟驱动模块
|
||||
require "rtc_app"
|
||||
|
||||
|
||||
-- 启动系统调度(必须放在最后)
|
||||
sys.run()
|
||||
@@ -0,0 +1,88 @@
|
||||
## 功能模块介绍:
|
||||
|
||||
1、main.lua:主程序入口;
|
||||
|
||||
2、rtc_app.lua:无网络时初始化并每秒打印东八区本地时间与 UTC 时间;有网络时等待 NTP 授时后,同样每秒打印更新后的东八区本地时间与 UTC 时间;
|
||||
|
||||
## 演示功能概述:
|
||||
|
||||
1、第一种场景演示:无网络情况下,rtc时钟初始化并每秒打印东八区本地时间与 UTC 时间。
|
||||
|
||||
2、第二种场景演示:连接上4G网络,等待 NTP 授时后每秒打印更新后的东八区本地时间与 UTC 时间。
|
||||
|
||||

|
||||
|
||||
1、Air780EPM核心板一块+可上网的sim卡一张:
|
||||
|
||||
* sim卡(若连入4G网络通过ntp服务器授时,获取实时时间;若只需要RTC实时时钟则不需要sim卡)
|
||||
|
||||
2、TYPE-C USB数据线一根 ,Air780EPM核心板和数据线的硬件接线方式为:
|
||||
|
||||
* Air780EPM核心板通过TYPE-C USB口供电;(供电拨动开关拨到ON侧)
|
||||
|
||||
* TYPE-C USB数据线直接插到开发板的TYPE-C USB座子,另外一端连接电脑USB口;
|
||||
|
||||
## 演示软件环境
|
||||
|
||||
1、 Luatools下载调试工具
|
||||
|
||||
2、 固件版本:LuatOS-SoC_V2016_Air780EPM_1,固件地址,如有最新固件请用最新 [780EPM固件下载](https://docs.openluat.com/air780epm/luatos/firmware/version/)
|
||||
|
||||
## 演示核心步骤
|
||||
|
||||
1、搭建好硬件环境
|
||||
|
||||
2、demo脚本代码rtc_app.lua中,按照自己的需求启用对应的task函数
|
||||
|
||||
4、Luatools烧录内核固件和修改后的demo脚本代码
|
||||
|
||||
5、烧录成功后,代码会自动运行,查看打印日志,如果正常运行,会打印ntp时间同步成功、本地时间以及RTC时间等信息,如下log显示:
|
||||
|
||||
选择运行rtc_task2()函数,打印日志如下:
|
||||
|
||||
```lua
|
||||
[2025-11-04 17:33:40.476][000000000.666] I/user.main rtc_demo 001.000.000
|
||||
[2025-11-04 17:33:40.479][000000000.674] I/user.rtc.timezone() 32
|
||||
[2025-11-04 17:33:40.488][000000000.675] I/user.rtc设置后时间 Tue Oct 28 19:10:53 2025
|
||||
[2025-11-04 17:33:45.924][000000008.846] D/mobile cid1, state0
|
||||
[2025-11-04 17:33:45.938][000000008.847] D/mobile bearer act 0, result 0
|
||||
[2025-11-04 17:33:45.956][000000008.847] D/mobile NETIF_LINK_ON -> IP_READY
|
||||
[2025-11-04 17:33:45.965][000000008.848] D/sntp query ntp.aliyun.com
|
||||
[2025-11-04 17:33:45.971][000000008.848] dns_run 676:ntp.aliyun.com state 0 id 1 ipv6 0 use dns server2, try 0
|
||||
[2025-11-04 17:33:45.985][000000008.895] D/mobile TIME_SYNC 0 (ntp授时成功)
|
||||
[2025-11-04 17:33:46.003][000000008.896] I/user.os.date() Tue Nov 4 17:33:45 2025
|
||||
[2025-11-04 17:33:46.025][000000008.897] I/user.循环rtc时间 {"year":2025,"min":33,"hour":9,"mon":11,"sec":45,"day":4}
|
||||
[2025-11-04 17:33:46.035][000000008.900] dns_run 693:dns all done ,now stop
|
||||
[2025-11-04 17:33:46.046][000000008.955] D/sntp Unix timestamp: 1762248825
|
||||
[2025-11-04 17:33:46.810][000000009.898] I/user.os.date() Tue Nov 4 17:33:45 2025
|
||||
[2025-11-04 17:33:46.820][000000009.899] I/user.循环rtc时间 {"year":2025,"min":33,"hour":9,"mon":11,"sec":45,"day":4}
|
||||
[2025-11-04 17:33:47.807][000000010.900] I/user.os.date() Tue Nov 4 17:33:46 2025
|
||||
[2025-11-04 17:33:47.808][000000010.901] I/user.循环rtc时间 {"year":2025,"min":33,"hour":9,"mon":11,"sec":46,"day":4}
|
||||
[2025-11-04 17:33:48.806][000000011.902] I/user.os.date() Tue Nov 4 17:33:47 2025
|
||||
[2025-11-04 17:33:48.813][000000011.903] I/user.循环rtc时间 {"year":2025,"min":33,"hour":9,"mon":11,"sec":47,"day":4}
|
||||
|
||||
|
||||
```
|
||||
|
||||
选择运行rtc_task1()函数,打印日志如下:
|
||||
|
||||
```lua
|
||||
[2025-11-11 13:47:52.540][000000000.643] I/user.main rtc_demo 001.000.000
|
||||
[2025-11-11 13:47:52.557][000000000.651] I/user.rtc.timezone() 32
|
||||
[2025-11-11 13:47:52.575][000000000.652] I/user.rtc初始时间 {"year":2025,"min":10,"hour":8,"mon":10,"sec":53,"day":28}
|
||||
[2025-11-11 13:47:52.615][000000000.652] I/user.rtc设置后的本地时间 Tue Oct 28 16:10:53 2025
|
||||
[2025-11-11 13:47:52.644][000000000.653] I/user.os.date() Tue Oct 28 16:10:53 2025
|
||||
[2025-11-11 13:47:52.667][000000000.653] I/user.循环rtc时间 {"year":2025,"min":10,"hour":8,"mon":10,"sec":53,"day":28}
|
||||
[2025-11-11 13:47:53.318][000000001.654] I/user.os.date() Tue Oct 28 16:10:53 2025
|
||||
[2025-11-11 13:47:53.335][000000001.655] I/user.循环rtc时间 {"year":2025,"min":10,"hour":8,"mon":10,"sec":53,"day":28}
|
||||
[2025-11-11 13:47:53.577][000000002.655] I/user.os.date() Tue Oct 28 16:10:54 2025
|
||||
[2025-11-11 13:47:53.586][000000002.656] I/user.循环rtc时间 {"year":2025,"min":10,"hour":8,"mon":10,"sec":54,"day":28}
|
||||
[2025-11-11 13:47:54.577][000000003.656] I/user.os.date() Tue Oct 28 16:10:55 2025
|
||||
[2025-11-11 13:47:54.618][000000003.657] I/user.循环rtc时间 {"year":2025,"min":10,"hour":8,"mon":10,"sec":55,"day":28}
|
||||
[2025-11-11 13:47:55.581][000000004.657] I/user.os.date() Tue Oct 28 16:10:57 2025
|
||||
[2025-11-11 13:47:55.597][000000004.658] I/user.循环rtc时间 {"year":2025,"min":10,"hour":8,"mon":10,"sec":57,"day":28}
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
--[[
|
||||
@module rtc_app
|
||||
@summary rtc时钟驱动模块
|
||||
@version 1.0
|
||||
@date 2025.10.28
|
||||
@author 王城钧
|
||||
@usage
|
||||
本文件为rtc时钟驱动模块,核心业务逻辑为:
|
||||
1、初始化RTC时钟,设置RTC时钟日期和时间,时区以及基准年;
|
||||
2、获取RTC时钟时间;
|
||||
3、每秒打印RTC时钟时间;
|
||||
|
||||
本文件没有对外接口,直接在其他功能模块中require "rtc_app"就可以加载运行;
|
||||
]]
|
||||
|
||||
--[[
|
||||
-- 本地时间是指:当前时区的时间,默认是东八区北京时间,可以通过rtc.timezone接口查询或者设置时区
|
||||
-- UTC/RTC时间是指:0时区的时间
|
||||
-- 东八区的时间是在UTC时间的基础上增加8个小时
|
||||
-- 本文件中的两段代码演示的是东八区和RTC时间的区别
|
||||
]]
|
||||
|
||||
-- RTC时钟演示(测试环境为无网络环境)
|
||||
local function rtc_task1()
|
||||
rtc.setBaseYear(1900) -- 设置基准年为1900年
|
||||
local result = rtc.timezone(32) -- 设置时区为东八区
|
||||
log.info("rtc.timezone()", result) -- 打印时区信息
|
||||
-- rtc.set({ year = 2025, mon = 10, day = 28, hour = 8, min = 10, sec = 53 }) -- 设置日期和时间
|
||||
rtc.set(1761639053) -- 设置时间戳(与上一行的设置效果相同,二选一即可)
|
||||
local t1 = rtc.get()
|
||||
log.info("rtc初始时间", json.encode(t1)) -- 打印当前日期和时间
|
||||
log.info("rtc设置后的本地时间", os.date()) -- 打印当前日期和时间
|
||||
while 1 do
|
||||
log.info("os.date()", os.date()) -- 打印RTC时钟时间
|
||||
local t = rtc.get() -- 获取rtc时间
|
||||
log.info("循环rtc时间", json.encode(t)) -- 打印当前rtc时间
|
||||
sys.wait(1000) -- 等待1s,然后再次获取rtc时间和实时时间
|
||||
end
|
||||
end
|
||||
|
||||
-- 获取基站和 NTP授时成功后的rtc时间
|
||||
local function rtc_task2()
|
||||
rtc.setBaseYear(1900) -- 设置基准年为1900年
|
||||
local result = rtc.timezone(32) -- 设置时区为东八区
|
||||
log.info("rtc.timezone()", result) -- 打印时区信息
|
||||
-- rtc.set({ year = 2025, mon = 10, day = 28, hour = 19, min = 10, sec = 53 }) -- 设置日期和时间
|
||||
rtc.set(1761678653) -- 设置时间戳(与上一行的设置效果相同,二选一即可)
|
||||
log.info("rtc设置后时间", os.date()) -- 打印当前日期和时间
|
||||
while not socket.adapter(socket.dft()) do
|
||||
log.warn("sntp_task_func", "wait IP_READY", socket.dft())
|
||||
-- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
|
||||
-- 或者等待1秒超时退出阻塞等待状态;
|
||||
-- 注意:此处的1000毫秒超时不要修改的更长;
|
||||
-- 因为当使用exnetif.set_priority_order配置多个网卡连接外网的优先级时,会隐式的修改默认使用的网卡
|
||||
-- 当exnetif.set_priority_order的调用时序和此处的socket.adapter(socket.dft())判断时序有可能不匹配
|
||||
-- 此处的1秒,能够保证,即使时序不匹配,也能1秒钟退出阻塞状态,再去判断socket.adapter(socket.dft())
|
||||
sys.waitUntil("IP_READY", 1000)
|
||||
end
|
||||
socket.sntp()
|
||||
sys.waitUntil("NTP_UPDATE", 5000)
|
||||
while 1 do
|
||||
log.info("os.date()", os.date()) -- 打印实时时间
|
||||
local t = rtc.get() -- 获取rtc时间
|
||||
log.info("循环rtc时间", json.encode(t))
|
||||
-- 打印当前rtc时间,当收到基站和 NTP授时的时候,rtc时间会自动更新为当前UTC时间(零时区),于北京时间(东八区)相差8小时
|
||||
sys.wait(1000) -- 等待1s,然后再次获取rtc时间和实时时间
|
||||
end
|
||||
end
|
||||
|
||||
-- 注意:以下两个任务每次测试时只能选择其一进行测试
|
||||
|
||||
-- 无网络情况下的rtc时间演示
|
||||
sys.taskInit(rtc_task1)
|
||||
|
||||
-- 获取基站和 NTP授时成功后的rtc时间
|
||||
-- sys.taskInit(rtc_task2)
|
||||
Reference in New Issue
Block a user