0x00 前言

不知不觉一个月没有更新博客了/(ㄒoㄒ)/~~,因为这段时间都在忙着写毕业设计。嗯,就是本文的主题 NodeMCU,它是一款基于 Lua 的开源固件,能够在 ESP8266 这款 WiFi 芯片上使用。而我的毕设主题……嗯,又是随大流的智能家居,所以第一个要实现的模块就是智能插座,相对于繁琐的 C 语言,还是脚本语言对我胃口一点,所以花了几天学 Lua 然后就开搞了。今天来总结分享一下 NodeMCU 固件在编译、刷写和使用过程中的一点经验心得。

0x01 获得固件

文档便是最好的学习资料,NodeMCU 的文档还算齐全的,在文档的 Get started 里我们可以看见各个平台在开发过程中所需要的文档目录。下面我们来说一下获得固件的几种方式。

云平台构建

这是我被圈粉的原因之一,因为官方提供了一个在线构建固件的云平台,所以只需要轻松的勾选自己想要的模块然后填上邮箱,等服务器构建完毕后便会将固件通过邮件发送给你。真的是很赞的功能,因为不用自己编译(编译需要在 Linux 平台,所以比较麻烦)。

云平台地址: https://nodemcu-build.com/ FBI Waring:貌似 QQ 邮箱不被支持,所以填个别家的邮箱吧!

云端构建遇到的坑:虽然网页显示能够构建具有 LFS 功能的固件,但实际使用后却发现并没有开启 LFS 功能,当然不排除是我的姿势不对或者人品不好的原因,不过我觉得如果需要 LFS 功能的同学还是自己编译固件吧!遇坑日期:2018.10.20

编译固件

NodeMCU 固件项目地址

Docker 构建镜像项目地址

编译固件相对云平台就麻烦了点,因为需要在 Linux 平台上编译,所以对 Windows 用户不太友好,但可以通过虚拟机、win 10 的 Linux 子系统和 Docker 等工具解决。当然我感觉最方便是在 Linux 下通过官方提供 Docker 镜像进行编译,下面我们来聊一下这个过程。

首先获取固件源码:

直接从 GitHub 上 clone 项目的源码就好,因为项目有点大,所以速度有点不忍直视。

git clone –recurse-submodules https://github.com/nodemcu/nodemcu-firmware.git

拉取 Docker 镜像:

docker pull marcelstoer/nodemcu-build

修改编译固件选项:

我们可以通过修改源码目录里的 app/include/user_modules.h 这个头文件的内容可以选择需要编译到固件的模块,直接去掉需要模块的注释,把不需要的模块注释掉就好。

另外 app/include/user_config.h 是对固件的一些配置,有些重要的配置比如:波特率、LFS、默认 hostname 和 AP 模式默认的 ssid 等。

1
2
3
4
5
6
7
8
9
10
11
// 第 21 行,波特率,默认 115200
#define BIT_RATE_DEFAULT BIT_RATE_115200

// 第 48 行,LFS,默认被注释,不开启,解除注释便开启
//#define LUA_FLASH_STORE 0x10000

// 第 148 行,设备的 hostname
#define WIFI_STA_HOSTNAME "Panda NodeMCU"

// 第 155 行,AP 模式下的默认 ssid
#define ENDUSER_SETUP_AP_SSID "SetupGadget"

通过 Docker 编译固件

命令行进入固件源码目录,然后执行命令

docker run –rm -ti -v pwd:/opt/nodemcu-firmware marcelstoer/nodemcu-build build

等待编译完毕后进入源码目录的 bin 目录就可以看到了编译成功的固件了。

0x02 刷写固件

刷写固件我只推荐一个工具 esptool.py,一个 Python 编写的工具。所以机器必须先装好 Python 环境然后通过

pip install esptool

这条命令安装 esptool.py,推荐这个工具的原因是其它刷写固件的工具都太久没更新了,所以会刷不上最新版的固件。

刷写固件过程也很简单,先通过命令行进入固件的目录,然后执行下面的命令。

esptool.py –port write_flash -fm 0x00000

要注意的是 flash-mode 这个值,对于不同的芯片要选择不同的值,官网参考如下:

flash-mode is qio for most ESP8266 ESP-01/07 (512 kByte modules) and dio for most ESP32 and ESP8266 ESP-12 (>=4 MByte modules). ESP8285 requires dout.

对于 ESP8266 我们填 dio 就好。

有时候我们需要完全擦除 flash 后才能重新刷入新固件,擦除的命令如下:

esptool.py –port erase_flash

0x03 使用固件

通过上面的操作我们已经将固件刷写好了,之后其实就是开始开发我们的程序了。因为程序需要在开发板上运行所以我们需要将本地的代码上传到开发板,这里我推荐使用 ESPlorer 这个 IDE 进行上传和开发板。另外作者编写了一个简单的 FTP Server,可以先上传这个脚本然后就可以通过 FTP 的方式上传代码到开发板了(如果要使用 FTP Server 那么固件最好要开启 LFS 否则容易出现内存不足/(ㄒoㄒ)/~~ 详情请看此)。

0x04 总结

NodeMCU 真的是一个很不错的固件,从 15 年到现在都仍然很活跃,特别是最近出的 LFS 功能让我能够较轻松的写出一个较大的程序而不是像之前一样绞尽脑汁的想怎么省内存。Lua 比 C 语言的开发体验好太多 :-D,我觉得随着硬件的发展,同样价格的硬件功能会变得越来越强,这也使得通过高级语言编写嵌入式程序变为可能当然也给我们应用层的程序员更多工(wan)作(shua)的机会。