引言

在之前的代码中,要连接的WIFI信息都已写死在代码里,这显然不能适应我们的需求。所以需要想个办法让用户可以配置这些信息。

WIFI工作模式

NodeMCU支持STATION,SOFTAP,STATIONAP,NULLMODE四种模式。

设置WIFI模式

wifi.setmode()

  • wifi.STATION 当设备需要连接到WIFI路由器时使用。常在访问Internet时使用。
  • wifi.SOFTAP 当设备需要作为热点时使用。在此模式下你的设备会创建一个本地局域网,并出现在WIFI列表。在默认情况下,NodeMCU在本地局域网地址为192.168.4.1,其他设备将被分配为下一个的可用IP,比如192.168.4.2。
  • wifi.STATIONAP 同时应用以上两者。在此模式下你可以在创建一个热点的同时连接到其他WIFI路由器。
  • wifi.NULLMODE 关闭WIFI。

所以可以添加一个按钮,当按钮按下时,转换模式为WIFI.STATIONAP,然后通过手机接入NodeMCU的热点,进入设置页面配置WIFI信息。就像配置路由器一样。

接线

  • 绿色的LED就是未来被远程控制的那颗,正极连接D1。

  • 黄色的LED用于显示当前的WIFI工作模式,正极连接D2。

  • 白色的按钮连接D3。

  • 负极连接GND。

接线完成后,定义这些引脚:

IO_LED = 1
IO_LED_AP = 2
IO_BTN_CFG = 3 gpio.mode(IO_LED, gpio.OUTPUT)
gpio.mode(IO_LED_AP, gpio.OUTPUT)
gpio.mode(IO_BTN_CFG, gpio.INT)

注意,IO_BTN_CFG被设置为了gpio.INT模式,也就是中断模式。

响应按钮

通过gpio.trig()设置响应中断的回调函数。

设置响应中断的回调函数

gpio.trig()

响应按钮抬起时的事件:

function onBtnEvent()
print('up~')
end
gpio.trig(IO_BTN_CFG, 'up', onBtnEvent)

上传代码。测试按下按钮,发现输出正常。

但存在一个问题:有时只按了一次,输出却不止一次。因为按钮的信号会有抖动。

这里提供一种去抖方法:

TMR_BTN = 6

function onBtnEvent()
gpio.trig(IO_BTN_CFG)
tmr.alarm(TMR_BTN, 500, tmr.ALARM_SINGLE, function()
gpio.trig(IO_BTN_CFG, 'up', onBtnEvent)
end) print('up~')
end
gpio.trig(IO_BTN_CFG, 'up', onBtnEvent)

思路是,在首次触发之后,清除按钮的回调函数,在0.5秒后,恢复回调。

开始与结束配置

正如之前所讲,平常运行时WIFI模式为wifi.STATION,当按下按钮后,WIFI模式转为wifi.STATIONAP,再次按下后恢复wifi.STATION

gpio.write(IO_LED_AP, gpio.LOW)

function switchCfg()
if wifi.getmode() == wifi.STATION then
wifi.setmode(wifi.STATIONAP)
gpio.write(IO_LED_AP, gpio.HIGH)
else
wifi.setmode(wifi.STATION)
gpio.write(IO_LED_AP, gpio.LOW)
end
end

注意,gpio.write(IO_LED_AP, gpio.LOW)在函数外部,目的是在NodeMCU开机时,重置AP信号灯为熄灭状态。

之后,修改上节按钮事件函数里的print('up~')为:

switchCfg()

这样就可以通过按钮来控制AP的开启关闭了。

配置热点信息

print('Setting up WIFI...')后添加下行代码,来配置热点名为 'mymcu' ,安全性为开放

wifi.ap.config({ ssid = 'mymcu', auth = AUTH_OPEN })

关于wifi.ap.config()的更多细节,请参阅:

配置热点信息

wifi.ap.config()

最后,删去之前写死在代码里的WIFI连接配置wifi.sta.config('MY_SSID', 'MY_PASSWORD')

因为随后,我们将提供操作界面,让用户自己来设置它们。

相关资源

你可以在NodeMCU-Tutorial下载到本文的相关资源和代码。

NodeMCU之旅(三):响应配置按钮的更多相关文章

  1. NodeMCU之旅(四):实现Web配置页面

    引言 利用Web页面做配置可以轻松适应用户的多种设备,如Android, IOS等.本文将介绍如何在NodeMCU中实现配置页面. 接线图请参考NodeMCU之旅(三):响应配置按钮. 配置页面后端 ...

  2. IIS下PHP的三种配置方式比较

    在Windows IIS 6.0下配置PHP,通常有CGI.ISAPI和FastCGI三种配置方式,这三种模式都可以在IIS 6.0下成功运行,下面我就讲一下这三种方式配置的区别和性能上的差异. 1. ...

  3. NodeMCU之旅(二):断线自动重连,闪烁连接状态

    事件监听器 NodeMCU采用了事件响应的方式.也就是说,只需为事件设置一个回调函数,当事件发生时,回调函数就会被调用. 注册事件监听器 wif.sta.eventMonReg() 开始监听 wifi ...

  4. EBS中启用OAF页面个性化三个配置

    启用OAF页面个性化三个配置(Profiles) FND:诊断英文为FND: Diagnostics,用于设置是否显示“关于此页” 个性化自助定义英文为Personalize Self-Service ...

  5. c3p0三种配置方式(automaticTestTable)

    c3p0的配置方式分为三种,分别是http://my.oschina.net/lyzg/blog/551331.setters一个个地设置各个配置项2.类路径下提供一个c3p0.properties文 ...

  6. Linux操作系统下三种配置环境变量的方法

    现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法. 1.修改/etc/profile文件 如果你的计算机仅仅作 ...

  7. AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(三):配置ActiveXForm运行环境

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  8. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  9. Linux操作系统下三种配置环境变量的方法——转载

    来源:赛迪网 作者:millio       现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法. 1.修改/e ...

随机推荐

  1. 【转】在 2016 年做 PHP 开发是一种什么样的体验?(一)

    原文: https://www.v2ex.com/t/312651 在 2016 年做 PHP 开发是一种什么样的体验?(一) 嘿,我最近接到一个网站开发的项目,不过老实说,我这两年没怎么接触编程,听 ...

  2. 【记录】haphost免费vps初始配置

    1.配置德国epel源 yum install yum-priorities rpm -Uvh http://ftp-stud.hs-esslingen.de/pub/epel/6/i386/epel ...

  3. 在IE6里面当元素浮动后再设置margin那么就会产生双倍边距

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 新手常见的python报错及解决方案

    此篇文章整理新手编写代码常见的一些错误,有些错误是粗心的错误,但对于新手而已,会折腾很长时间才搞定,所以在此总结下我遇到的一些问题.希望帮助到刚入门的朋友们.后续会不断补充. 目录 1.NameErr ...

  5. Java去除字符串中的空格

    特别注意了 Strim或者Trip都是只能去除头部和尾部的空字符串.中间的部分是不能够去除的! 推荐使用ApacheCommonse的StringUtils.deleteWhitespace(&quo ...

  6. Android5.1图库Gallery2代码分析数据加载流程

    图片数据加载流程. Gallery---->GalleryActivity------>AlbumSetPage------->AlbumPage--------->Photo ...

  7. IFields Interface 定义一个字段集合对象

    Description The Fields object represents a collection of columns in a table. The term field is synon ...

  8. C#使用FFmpeg 将视频格式转换成MP4示例

    一.常用视频格式分辨率 640x480p 720p格式,分辨率为1280×720p / 60Hz,行频为45kHz 1080p格式,分辨率为1920×1080逐行扫描,专业格式 二.FFmpeg部分参 ...

  9. CDOJ 1273 God Qing's circuital law

    暴力枚举+idea.做的时候mod写错了,写成了1000000009,找了两个多小时才发现...... a[1],a[2],a[3]....a[N] b[1],b[2],b[3]....b[N] 首先 ...

  10. iOS8学习笔记-构建多视图应用程序

    严格来说,凡是UIView的子类都可以称为视图,实际上IOS的图形界面就是视图包含视图的方案,绝大多数的控件都是UIView的子类,但是苹果公司定义的视图术语,通常是指具有相应视图控制器的uiview ...