索引
这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及。
微信小程序连接物联网(一):初始化ESP8266 NodeMCU
微信小程序连接物联网(二):NodeMCU Lua学习笔记
微信小程序连接物联网(三):微信小程序远程遥控宿舍开门 基于NodeMCU通过MQTT协议连接阿里云物联网平台
上一章是记录esp8266初始化的步骤, 这章记录使用NodeMCU Lua时的学习笔记。记录常见的用法,都是参考官方的api文档的。
最新的模块用法参考官方api文档:
https://nodemcu.readthedocs.io/en/master/
我学习nodemcu lua时看的视频:
b站av22926769
(由于视频与现在新的sdk版本不同,具体用法还得参考官方api文档)
Lua跟Python语法有点类似,很快就能入手,参考菜鸟教程的Lua教程:
菜鸟教程Lua语法
使用ESPlorer,这个是NodeMCU在lua脚本语言下的开发工具(前提要有jdk)
gpio
函数 | 说明 |
---|---|
gpio.mode() | 初始化引脚为GPIO模式,设置引脚的IN / OUT方向,以及可选的内部弱上拉电路。 |
gpio.read() | 读取数字GPIO引脚值。 |
gpio.write() | 设置数字GPIO引脚值。 |
点亮esp8266上的灯
esp8266上的灯默认是与d4口相接,而且是输入低电平时亮起,高电平不亮
pin = 4
gpio.mode(4, gpio.OUTPUT)
gpio.write(4, gpio.LOW)
设置D1口为高电平
pin=1
gpio.mode(pin, gpio.OUTPUT)
gpio.write(pin, gpio.HIGH)
PWM
函数 | 说明 |
---|---|
pwm.close() | 退出指定GPIO引脚的PWM模式。 |
pwm.getclock() | 获取引脚的选定PWM频率。 |
pwm.getduty() | 获取引脚的选定占空比。 |
pwm.setclock() | 设置PWM频率。 |
pwm.setduty() | 设置引脚的占空比。 |
pwm.setup() | 将引脚设置为PWM模式。 |
pwm.start() | PWM启动,波形被施加到GPIO引脚。 |
pwm.stop() | 暂停PWM波形的输出。 |
设置D1口频率为500Hz 占空比为512
pin = 1
pwm.setup(pin, 500, 512)
pwm.start(pin)
pwm.setduty(pin, 0) -- 改变D1口占空比为0
pwm.stop()
设置D3口的舵机 转动一定角度3秒后复原
初始化舵机的频率为50HZ,占空比为 40 / 1024。
(控制舵机这段代码不一定正确,但实际使用中测试正常。如果有错误请指出)
pin = 3
pwm.setup(pin, 50, 40)
pwm.start(pin)
tmr.create():alarm(3000, tmr.ALARM_SINGLE, function()
pwm.setduty(pin, 120)
pwm.stop(pin)
end)
HTTP
执行GET / POST / PUT / DELETE以及自定义请求的接口。
不能使用此模块进行并发HTTP请求,由于ESP8266的内存限制,支持的页面/正文大小受可用内存的限制。尝试接收大于此范围的页面将失败。
每个请求方法都采用一个回调,当从服务器接收到响应时将调用该回调。第一个参数是状态码,它可以是常规HTTP状态码,也可以是-1,以表示DNS,连接或内存不足故障或超时(当前为60秒)。
函数 | 说明 |
---|---|
http.delete() | 执行HTTP DELETE请求。 |
http.get() | 执行一个HTTP GET请求。 |
http.post() | 执行一个HTTP POST请求。 |
http.put() | 执行一个HTTP PUT请求。 |
http.request() | 对任何HTTP方法执行自定义HTTP请求。 |
http.get()
执行一个HTTP GET请求。请注意,不支持并发请求。使用http先确保连上了wifi
句法
http.get(url, headers, callback)
参数
url 要获取的网址,包括http://或https://前缀
headers 要附加的可选附加标头,包括\ r \ n;也许nil
callback 收到响应或发生错误时要调用的回调函数;它被调用,参数status_code,body和headers。如果发生错误,status_code则设置为-1。
返回
nil
例
http.get("http://httpbin.org/ip", nil, function(code, data)
if (code < 0) then
print("HTTP request failed")
else
print(code, data)
end
end)
http.post()
执行一个HTTP POST请求。请注意,不支持并发请求。
句法
http.post(url, headers, body, callback)
参数
url 要获取的网址,包括http://或https://前缀
headers 要附加的可选附加标头,包括\ r \ n;也可以nil
body 必须已经以适当的格式编码,但是可以为空
callback 收到响应或发生错误时要调用的回调函数;它被调用,参数status_code,body和headers。如果发生错误,status_code则设置为-1。
退货
nil
例
http.post('http://httpbin.org/post',
'Content-Type: application/json\r\n',
'{"hello":"world"}',
function(code, data)
if (code < 0) then
print("HTTP request failed")
else
print(code, data)
end
end)
WIFI
ESP8266支持3种工作模式
分别是”STA”、“AP”、“STA+AP”模式:
① STA模式:该模块通过路由器连接网络,手机或者电脑实现该设备的远程控制.
② AP模式:该模块作为热点,手机或者电脑连接wifi与该模块通信,实现局域网的无线控制
③ STA+AP模式:两种模式共存,既可以通过路由器连接到互联网,也可以作为WiFi热点,使其他设备连接到这个模块,实现广域网与局域网的无缝切换.
功能参考
函数 | 说明 |
---|---|
wifi.getmode() | 获取WiFi操作模式。 |
wifi.setmode() | 配置要使用的WiFi模式。 |
wifi.sta.config() | 设置WiFi站配置。 |
wifi.sta.connect() | 在站点模式下连接到已配置的AP。 |
wifi.sta.disconnect() | 在站点模式下与AP断开连接。 |
wifi.sta.getip() | 在工作站模式下获取IP地址,网络掩码和网关地址。 |
wifi.sta.getmac() | 在站点模式下获取MAC地址。 |
wifi.sta.status() | 获取工作站模式下的当前状态。 |
wifi.eventmon.register() | 注册/注销WiFi事件监视器的回调。 |
wifi.eventmon.unregister() | 取消注册WiFi事件监视器的回调。 |
wifi.eventmon.reason | 该表包含断开连接的原因。 |
例:连接名为f103的wifi
wifi.setmode(wifi.STATION)
station_cfg={}
station_cfg.ssid="f103"
station_cfg.pwd="11111111"
station_cfg.save=false
wifi.sta.config(station_cfg)
例:连接wifi回调事件
-- wifi eventmon
wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, function(T)
print("wifi connecting...")
end)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
ip = wifi.sta.getip()
print("wifi connect:" .. ip)
end)
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
print("wifi disconnect:" .. T.reason)
end)
时钟
函数 | 描述 |
---|---|
tmr.create() | 创建一个动态计时器对象。 |
tmr.delay() | 在处理器指定的微秒内忙循环。 |
tmr.now() | 返回系统计数器,以微秒为单位。 |
tmr.softwd() | 提供一个简单的软件看门狗,该看门狗需要在其过期之前重新设置或禁用,否则系统将重新启动。 |
tmr.time() | 返回系统正常运行时间,以秒为单位。 |
tmr.wdclr() | 喂系统看门狗。在while(True) 里加入防止MCU自动重启 |
tmr.create()
创建一个动态计时器对象;参见下面的方法表。
在控制功能中,可以使用动态计时器代替数字ID。也可以以面向对象的方式进行控制。
计时器对象支持的功能:
- t:alarm()
- t:interval()
- t:register()
- t:start()
- t:state()
- t:stop()
- t:unregister()
参数
没有
返回
timer 宾语
例
local mytimer = tmr.create()
mytimer:register(5000, tmr.ALARM_SINGLE, function (t) print("expired"); t:unregister() end)
mytimer:start()
计时器对象方法
tobj:alarm()
句法
tobj:alarm(interval_ms, mode, func())
参数
interval_ms 计时器间隔(以毫秒为单位)。最大值是6870947(1:54:30.947)。
mode 计时器模式:
- tmr.ALARM_SINGLE 一键式警报(无需致电unregister())
- tmr.ALARM_SEMI 手动重复报警(呼叫start()重新启动)
- tmr.ALARM_AUTO 自动重复报警
func(timer) 以计时器对象作为参数调用的回调函数
例:手动启动的时钟事件
Connect_timer = tmr.create()
Connect_timer:alarm(2000, tmr.ALARM_SEMI, function()
print("test..")
end)
Connect_timer:start()
例:一次性的时钟事件,相当于sleep(2000ms)再执行事件
tmr.create():alarm(2000, tmr.ALARM_SINGLE, function()
print("test..")
end)
例:一直执行的时钟。
tmr.create():alarm(8000, tmr.ALARM_AUTO, function()
print("test..")
end)