自己开发微信小程序控制Air202模块(2)Air202部分开发

1、准备材料
一个LED灯、一个S5开发板、一个USB-TTL模块


2、将USB-TTL和S6开发板连接。
接线方式如下图

3、连接LED和开发板。我用的是IO6这个IO口,所以将LED一端接地一端接在IO6。使用普通的LED灯是建议串联一个1K的电阻,防止LED被烧坏。
4、编写Air202的程序。
main.lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
PROJECT = "ALIYUN"
VERSION = "2.0.0"

--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
require "sys"
require "net"
--每1分钟查询一次GSM信号强度
--每1分钟查询一次基站信息
net.startQueryAll(60000, 60000)
--加载网络指示灯功能模块
--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
require "netLed"
netLed.setup(true,pio.P1_1)
--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长

--加载错误日志管理功能模块【强烈建议打开此功能】
--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
require "errDump"
errDump.request("udp://ota.airm2m.com:9072")
--加载阿里云功能测试模块
require "testALiYun"

--启动系统框架
sys.init(0, 0)
sys.run()

testALiYun.lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
module(...,package.seeall)
require"aLiYun"
require"misc"
require"pm"
require"pins"

local PRODUCT_KEY = "a1sLSgWRLGZ"

local function getDeviceName()
return "869300031602869"
end

local function setDeviceSecret(s)
misc.setSn(s)
end

local function getDeviceSecret()
return "2wdomNTGLFZCPykcxCUWrEH3c1O8qGs9"
end

--阿里云客户端是否处于连接状态
local sConnected


---数据接收的处理函数
-- @string topic,UTF8编码的消息主题
-- @number qos,消息质量等级
-- @string payload,原始编码的消息负载
local function rcvCbFnc(topic,qos,payload)

log.info("testALiYun.rcvCbFnc:",topic,qos,payload)

local tjsondata,result,errinfo = json.decode(payload)---tjsondata数据,result 解析结果 true or false ,errinfo错误信息
key = tjsondata["params"]['LightSwitch']
log.info("key:",key)
data(key)


end

function data(key)--函数在全局中被引用时 不要加local
local led1 = pins.setup(pio.P0_6,0)
if key == 0 then
led1(0)
log.info("ledon")
else if key == 1 then
led1(1)
log.info("ledoff")
end
end

end
--- 连接结果的处理函数
-- @bool result,连接结果,true表示连接成功,false或者nil表示连接失败
local function connectCbFnc(result)
log.info("testALiYun.connectCbFnc",result)
sConnected = result
if result then
--订阅主题,不需要考虑订阅结果,如果订阅失败,aLiYun库中会自动重连
aLiYun.subscribe({["/sys/"..PRODUCT_KEY.."/"..getDeviceName().."/thing/service/property/set"]=0, ["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=1})
--注册数据接收的处理函数
aLiYun.on("receive",rcvCbFnc)
--PUBLISH消息测试
publishTest()
end
end

-- 认证结果的处理函数
-- @bool result,认证结果,true表示认证成功,false或者nil表示认证失败
local function authCbFnc(result)
log.info("testALiYun.authCbFnc",result)
end


function gpio4IntFnc(msg)
local beel = pins.setup(pio.P0_2,0)
log.info("testGpioSingle.gpio4IntFnc",msg,getGpio4Fnc())
--上升沿中断
if msg==cpu.INT_GPIO_POSEDGE then
--下降沿中断
beel(1)
log.info("ladi,miedeng")
else
beel(0)
publishTest(LockCloseData)
log.info("liang")
end
end

--GPIO4配置为中断,可通过getGpio4Fnc()获取输入电平,产生中断时,自动执行gpio4IntFnc函数
getGpio4Fnc = pins.setup(pio.P0_4,gpio4IntFnc)


--采用一机一密认证方案时:
--配置:ProductKey、获取DeviceName的函数、获取DeviceSecret的函数;其中aLiYun.setup中的第二个参数必须传入nil
aLiYun.setup(PRODUCT_KEY,nil,getDeviceName,getDeviceSecret)

--采用一型一密认证方案时:
--配置:ProductKey、ProductSecret、获取DeviceName的函数、获取DeviceSecret的函数、设置DeviceSecret的函数
--aLiYun.setup(PRODUCT_KEY,PRODUCE_SECRET,getDeviceName,getDeviceSecret,setDeviceSecret)

--setMqtt接口不是必须的,aLiYun.lua中有这个接口设置的参数默认值,如果默认值满足不了需求,参考下面注释掉的代码,去设置参数
--aLiYun.setMqtt(0)
aLiYun.on("auth",authCbFnc)
aLiYun.on("connect",connectCbFnc)

以上是两个Air的程序,只需要将里面ProductKey、DeviceName、DeviceSecret修改为自己的即可。

5、考虑到有刚接触luat的小伙伴,下面我们简单分析一下代码。

在这一段是我们连接阿里云MQTT后判断返回结果为真的情况下执行的。
连接成功后我们需要订阅阿里云MQTT下发的主题,也就是我们上一篇说到的Topic类。

然后我们启动数据接收处理函数

调用IO口控制函数,并根据参数key的值 0或1 来控制IO6口的高低电平。

上次更新 2021-01-28