最终效果视频

硬件

ESP8266模块 (这是一个系列。本文使用ESP8266 12-E NodeMCU套件作为例子)

USB数据线

烧录固件

ESP8266可以烧录各种不同的固件,本文使用NodeMCU固件。

  1. 首先下载博主编译好的NodeMCU固件,解压得到nodemcu-release-18-modules-2022-09-23-15-31-36-float.bin后面会用到。
  2. 下载ESP8266烧录软件ESP8266Flasher,解压得到ESP8266Flasher32.exe
  3. 按住ESP8266上的Flash按钮的同时用USB线连接上电脑 (一定要按住Flash按钮不放的同时给模块上电才能进入烧录模式)
  4. 运行ESP8266Flasher32.exe
  5. 切换到config标签,点击第一行的齿轮图标选择固件文件
  6. 切换回首页并点击按钮开始烧录,如果步骤3操作无误就能看到进度条在走了。等待进度条走完。
  7. 拔下USB线并重新插上电脑。这一次不需要按住flash按钮。

至此固件烧录完毕。

程序文件上传工具ESPlorer和使用说明

  1. 下载工具。
  2. 解压后双击ESPlorer.bat启动工具。(如果不能正常启动请先安装Java运行环境,百度Java即可)
  3. 工具界面如下,看上去有点复杂,但其实大部分功能不用管。
  4. 电脑连接上8266模块,工具右侧选择正确的端口以后点击Open按钮打开串口。波特率用115200。
  5. 右侧窗口会显示一些启动信息,如果没有尝试点击几次右侧下方的Heap按钮。(这会向8266发送一条简单的命令,如果正常会有信息的回显)
  6. 右侧FS Info:显示8266文件系统相关信息,总空间,各文件大小,剩余可用空间等。
  7. 右侧Reload:刷新显示8266中的文件列表。如果以前没有上传过应该是空的。
  8. 右侧下方一排预定义命令按钮,可查询关于芯片的基本信息,右侧的Reset是复位。
  9. 左侧下方Upload:上传文件(程序文件),上传以后会出现在右侧文件列表中。

硬件连接

本文的示例程序直接使用板载的LED灯(GPIO2低电平点亮),所以你不需要做任何硬件连接。

附:这个模块的引脚图如下,供参考。

关于ESP8266引脚的详细说明请参见博主的另一篇文章

程序

NodeMCU这个固件使用Lua脚本语言写程序。而NodeMCU固件里提供了很多常用的库函数。

编程的基本思想就是调用库函数实现你需要的功能。

NodeMCU是一个开源的系统,库也是开源的,种类和数量非常多,但由于硬件Flash的size制约,不可能一次将所有的库有包含进来。所以应该挑选你需要的库,自己编译固件

博主编译的固件里包含了以下库:

adc, color_utils, enduser_setup, file, gpio, http, net, node, ow, pixbuf, pwm, spi, tmr, uart, websocket, wifi, ws2812, ws2812_effects

本文主要会用到gpio,tmr,wifi这3个库。

快速上手

  1. 下载博主准备好的程序文件
  2. 解压缩得到 init.lua / index.html / httpServer.lua 这3个文件
  3. 用文本编辑器(最好不要用记事本)打开init.lua,修改最上面的wifi名和密码,改成你家里的WiFi,保存。
  4. 用ESPlorer上传上面的3个文件到8266,上传顺序无所谓。上传以后会出现在右侧列表中。
  5. 点工具里的Reset按钮或重新给模块上电重启模块即可自动连上wifi并启动服务
  6. 检视工具右侧信息栏显示8266获取到的IP地址(或者通过路由器后台查看)
  7. 用手机浏览器(电脑也可以)打开 http://上面获取到的IP地址 ,即可看到远程控制页面。(比如,我这里获取到的IP地址是 192.168.0.11,那么网址就应该是 http://192.168.0.11

现在你可以通过这个页面控制LED灯的开/关了。

程序说明

本文不是Lua语言的教程,只对关键部分做一些说明。

系统在上电后会自动查找名为init.lua的文件,如果存在则自动运行这个脚本。

也就是说init.lua就是NodeMCU的入口程序。

关于Lua语言请参考这里

NodeMCU包含的所有官方库的一览表以及说明文档在这里

连接wifi

使用wifi库,上电后首先设置好ssid和密码后进入工作站模式(另一种叫AP模式,用8266本身创建一个热点,本文不讨论)

上电以后使用tmr库定期尝试获取IP,一直到获取IP成功为止。

一旦获取到了IP表示连接wifi成功,于是启动HTTP服务(调用httpServer.lua这个脚本)。

Http服务配置

主要是定义下面这些内容

  • 接收http请求的入口(也就是网址中域名后面的路径部分)
  • 接收到请求后的处理
  • 处理完成后设置http的应答内容

比如,本文范例程序中定义了3个http请求的入口: on / off / status,分别用来 开灯 / 关灯 / 获取当前状态。

下面以开灯的http请求为例,

第2行中的 /on 就是一个入口的名字,实际访问是就用域名加上/on 即可。该行的其他内容是固定写法,照抄即可。

第4行是接收到 /on 这个http请求后要做的事情,这里是调用gpio库函数将LED引脚拉低,也就是亮灯。

第7行是设置http应答的类型,默认是html/text也就是网页文本,这是最常见的用于浏览网页的http应答类型。本例使用json类型,告诉浏览器要以json的格式来解析这次的应答内容。(json是一种在前后端传递数据时被广泛使用的一种纯文本的数据结构,具体本文不细说了)

第10行是发送具体的应答内容,这里发送的就是json数据格式,包含两个属性值。

-- 定义开灯用的url
httpServer:use('/on', function(req, res)
    -- 亮灯
    gpio.write(LED, gpio.LOW)

    -- http应答类型(json)
    res:type('application/json')

    -- 发送http应答
    res:send('{"ret":"OK", "msg":"已开灯"}')
end)

远程控制用的网页

http服务默认会调用index.html这个文件作为网站的首页(也就是 http://ESP8266的IP地址 )。

我制作的这个网页可以显示当前点灯状态,以及 开 / 关灯。

  • 打开这个网页时,会自动访问 http://.../status 获取当前点灯状态。
  • 当灯处于关闭状态时,会显示 开灯 按钮,点击按钮会访问 http://.../on (开灯),并重新获取状态。
  • 当灯处于打开状态时,会显示 关灯 按钮,点击按钮会访问 http://.../off (关灯),并重新获取状态。
  • 为了美观准备了不同的背景图片以显示开关灯的状态。

本文不是网页制作的教程,有关网页制作相关可以参考这里

手机访问控制页面

家里局域网访问

浏览器打开 http://ESP8266的IP地址 即可,也可以直接访问 http://ESP8266的IP地址/onhttp://ESP8266的IP地址/off 来控制LED

使用域名,内网穿透实现随处访问

这个不是一句两句说得清,是另一个网络技术话题了,本文略过。

小结

虽然本文只是远程控制了一颗LED,但只要掌握了这个方法,完全可以实现更复杂的IOT应用。

下一篇,我将在本文的基础上演示如何利用iPhone手机的Siri助手进行语音控制。

(本文完)

Last modification:December 25, 2023
If you think my article is useful to you, please feel free to appreciate