Lua可以说是目前嵌入式方案中,资源占用 最小 、运行效率 最高 、语法 最简洁 的一门脚本语言。对于编程小白来说,它适合作为你的编程入门语言,因为语法简单。对于会c语言的老手来说,觉得有点别扭,需要打破以前的思维编程习惯。
LuatOS-Air = Lua + AT, LuatOS-Air推出的物联网开源架构,依托于 通信模块做简易快捷的开发,将传统的AT命令用Lua语言封装成API,并提供各种功能应用的demo, 大大减少用户的开发成本。开发者可以通过调用API轻松,便捷的实现TTS、GPS、SOCKET、MQTT、OTA等功能。
GPS
- require "gpsv2"
- module(..., package.seeall)
- sys.taskInit(function(...)
- gpsv2.open(2, 115200, 2, 5)
- while true do
- log.info("testGps isFix:", gpsv2.isFix())
- log.info("testGps lng,lat:", gpsv2.getIntLocation())
- log.info("testGps message:", gpsv2.getAltitude(), gpsv2.getSpeed(),
- gpsv2.getAzimuth(), gpsv2.getUsedSateCnt(), gpsv2.getViewedSateCnt())
- sys.wait(1000)
- end
- end)
复制代码
开发板的硬件原理图:VS打开文件夹,直接修改就好了,无需编译。但是不知道哪里出问题,编程怎么反馈?还有待探索。感觉靠经验较多了。
main.lua
- --必须在这个位置定义PROJECT和VERSION变量
- --PROJECT:ascii string类型,可以随便定义,只要不使用,就行
- --VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
- PROJECT = "GPIO"
- VERSION = "1.0.0"
- --加载日志功能模块,并且设置日志输出等级
- --如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
- require "log"
- LOG_LEVEL = log.LOGLEVEL_TRACE
- --[[
- 如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
- 如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
- 1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
- 2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
- ]]
- --log.openTrace(true,1,115200)
- require "sys"
- require "net"
- --每1分钟查询一次GSM信号强度
- --每1分钟查询一次基站信息
- net.startQueryAll(60000, 60000)
- --此处关闭RNDIS网卡功能
- --否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
- --如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
- --注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
- ril.request("AT+RNDISCALL=0,1")
- --加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
- --此功能模块不是必须的,根据项目需求决定是否加载
- --使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
- --使用说明参考demo/console下的《console功能使用说明.docx》
- --require "console"
- --console.setup(2, 115200)
- --加载网络指示灯和LTE指示灯功能模块
- --根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
- --合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
- -- require "netLed"
- -- pmd.ldoset(2,pmd.LDO_VLCD)
- -- netLed.setup(true,pio.P0_1,pio.P0_4)
- --网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
- --如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
- --LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
- --加载错误日志管理功能模块【强烈建议打开此功能】
- --如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
- require "errDump"
- errDump.request("udp://ota.airm2m.com:9072")
- --加载远程升级功能模块【强烈建议打开此功能,如果使用了阿里云的OTA功能,可以不打开此功能】
- --如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
- --PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
- --require "update"
- --update.request()
- --加载GPIO功能测试模块
- require "testGpioSingle"
- --启动系统框架
- sys.init(0, 0)
- sys.run()
复制代码
testGpioSingle.lua
- --- 模块功能:GPIO功能测试.
- -- [url=home.php?mod=space&uid=40524]@author[/url] openLuat
- -- [url=home.php?mod=space&uid=2811445]@Module[/url] gpio.testGpioSingle
- -- [url=home.php?mod=space&uid=285243]@license[/url] MIT
- -- [url=home.php?mod=space&uid=855824]@copyright[/url] openLuat
- -- [url=home.php?mod=space&uid=1054466]@release[/url] 2018.03.27
- require"pins"
- module(...,package.seeall)
- --[[
- 有些GPIO需要打开对应的ldo电压域才能正常工作,电压域和对应的GPIO关系如下
- pmd.ldoset(x,pmd.LDO_VSIM1) -- GPIO 29、30、31
- pmd.ldoset(x,pmd.LDO_VLCD) -- GPIO 0、1、2、3、4
- pmd.ldoset(x,pmd.LDO_VMMC) -- GPIO 24、25、26、27、28
- x=0时:关闭LDO
- x=1时:LDO输出1.716V
- x=2时:LDO输出1.828V
- x=3时:LDO输出1.939V
- x=4时:LDO输出2.051V
- x=5时:LDO输出2.162V
- x=6时:LDO输出2.271V
- x=7时:LDO输出2.375V
- x=8时:LDO输出2.493V
- x=9时:LDO输出2.607V
- x=10时:LDO输出2.719V
- x=11时:LDO输出2.831V
- x=12时:LDO输出2.942V
- x=13时:LDO输出3.054V
- x=14时:LDO输出3.165V
- x=15时:LDO输出3.177V
- ]]
- local level = 0
- pmd.ldoset(2,pmd.LDO_VLCD)
- -- GPIO1配置为输出,默认输出低电平,可通过setGpio1Fnc(0或者1)设置输出电平
- local setGpio1Fnc = pins.setup(pio.P0_1,0)
- sys.timerLoopStart(function()
- level = level==0 and 1 or 0
- setGpio1Fnc(level)
- log.info("GPIO1的状态:",level)
- end,1000)
- -- GPIO19配置为输入,可通过getGpio19Fnc()获取输入电平
- local getGpio19Fnc = pins.setup(pio.P0_19)
- sys.timerLoopStart(function()
- log.info("GPIO19的状态",getGpio19Fnc())
- end,1000)
- -- GPIO18配置为中断,可通过getGpio18Fnc()获取输入电平,产生中断时,自动执行gpio18IntFnc函数
- -- 产生中断时自动调用intFnc(msg)函数:上升沿中断时:msg为cpu.INT_GPIO_POSEDGE;下降沿中断时:msg为cpu.INT_GPIO_NEGEDGE
- function gpio18IntFnc(msg)
- log.info("GPIO18中断回调",msg,getGpio18Fnc())
- if msg==cpu.INT_GPIO_POSEDGE then
- log.info("GPIO18中断回调", "上升沿中断")
- else
- log.info("GPIO18中断回调", "下降沿中断")
- end
- end
- getGpio18Fnc = pins.setup(pio.P0_18,gpio18IntFnc)
复制代码
烧录运行
0ba86fa6aa18ac717d0426914818c451
0
|
|
|
|