ESP8266介绍

ESP8266是乐鑫设计,安可信生产的一块极便宜的WIFI模块,说是WIFI模块,是因为很多时候他被当作WIFI的发射接收模块和其他单片机配合使用,但实际上,他本身就是一块单片机,内置超低功耗 Tensilica L106 32 位 RISC 处理器,CPU 时钟速度最高可达 160 MHz,还有数量不等的IO端口(芯片是一样的,不同型号封装引出的管脚不同),所以在对IO管脚要求不是非常多的情况,直接用一块ESP8266就已经是完整的一个单片机方案。

说便宜,例如上面这块ESP-12F模块在网上可以用几块钱买到,加上某厂家5元包邮的电路板打样,自己焊几个电阻电容就完事,对于DIY来说实在很香。对于焊工不太好的朋友,一块山寨的开发板包括5V转3.3V电源(芯片是3.3V输入),USB刷机调试接口,也就是十几元包邮的样子。十多块钱的小东西要用WIFI,这应该是唯一的选择了。

ESP8266有自己的SDK,也支持Arduino开发,如果对程序的延迟非常敏感,就只能选择上面这些C++的开发环境,例如之前我用8266加上DWM1000做测距,就不太可能用NodeMCU。因为NodeMCU是一个Lua语言的运行环境,刷上NodeMCU固件大家可以愉快地用Lua进行编程,不用一次又一次地编译调试,几乎不会出现C/C++的什么指针,内存泄露问题,代价就是运行速度比C++开发的程序要慢一些。但对于大部分只是控制GPIO,WIFI时钟对时,或者传感器状态上报之类的应用,差1秒2秒又有什么关系呢?轻松开发才是最重要的……

NodeMCU开发有多简单?看个例子,11行代码就可以建立WIFI热点,并提供一个最简单的HTTP服务器。运行成功后,用手机或者电脑连上WIFI热点:testap,密码:12345678,然后打开浏览器即可成功访问http://192.168.4.1/

wifi.setmode(wifi.SOFTAP)
local apcfg={ssid="testap", pwd="12345678",}
wifi.ap.config(apcfg)
srv = net.createServer(net.TCP)
srv:listen(80, function(conn)
    conn:on("receive", function(sck, payload)
        print(payload)
        sck:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1> Hello, NodeMCU.</h1>")
    end)
    conn:on("sent", function(sck) sck:close() end)
end)

更多API说明参考https://nodemcu.readthedocs.io/en/master/

编译NodeMCU固件

好了,闲话说了一堆,言归正传谈下编译NodeMCU固件和刷机的问题,NodeMCU最简单的编译办法是去https://nodemcu-build.com/,按需选择要支持的模块,点击编译,一般不用10分钟,编译好的固件链接就会发到邮箱里。
NodeMCU编译时可供选择的模块

大部分情况下,没有必要自己来编译固件。但如果我们对程序运行空间要求比较高(例如需要TLS支持),内存比较紧张,还不至于要回到C++那边完全重写,这时候就要用到LFS大法(具体LFS的解释和用法以后再说),但LFS镜像就非要自己编译不可了,所以还是要弄一个编译环境。

搭建编译环境办法有好几种,用docker是最方便的,都2020年,不懂的强烈建议学一下。只要有一个可以跑docker的环境,无论Linux,Mac,Windows子系统都可以,能够在github下载代码,事情就很简单了。

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

修改nodemcu-firmware/app/include/user_modules.h文件选择自己想要的模块(可以参考前面nodemcu-build网站的说明);支持LFS,修改nodemcu-firmware/app/include/user_config.h,去掉以下注释

//#define LUA_FLASH_STORE                   0x10000

如果程序不需要浮点运算,修改nodemcu-firmware/app/include/user_config.h,去掉以下的注释,固件运行效率会高一些

//#define LUA_NUMBER_INTEGRAL
docker run --rm -ti -v `pwd`/nodemcu-firmware:/opt/nodemcu-firmware marcelstoer/nodemcu-build build

此时编译的结果在nodemcu-firmware/bin目录里,文件名类似nodemcu_integer_release_日期-xxxx.bin,这就是刷机用的固件

刷机工具从https://github.com/marcelstoer/nodemcu-pyflasher/releases下载

编译LFS镜像

如果要编译LFS镜像(这是我们这次折腾的主要目标),在刚才的目录下

mkdir luasrc
cp lua代码 luasrc
docker run --rm -ti -v `pwd`/nodemcu-firmware:/opt/nodemcu-firmware -v `pwd`/luasrc:/opt/lua marcelstoer/nodemcu-build lfs-image

此时编译的LFS镜像在刚才新建立的luasrc目录里

代码上传运行工具

现在可以用https://esp8266.ru/esplorer/来上传和运行Lua程序代码和LFS镜像(没看错,LFS镜像不是固件,是当做某种特殊的代码上传使用的)

对于不方便上上述各种网站的朋友,这里有一份打包好的资源
链接:https://pan.baidu.com/s/1hvdAToW7VKGra2Aa69spsQ
提取码:ag60
以linux系统为例,把nodemcu-build.tgz和nodemcu-firmware.tgz放在/opt目录下,运行

cd /opt
zcat nodemcu-build.tgz|docker load 
tar xzf nodemcu-firmware.tgz

即可跳过前面提到的下载源码步骤,直接开始编译。

在制作nodemcu-firmware时,除了选择必要模块和系统文件,往往需要将编写的lua程序和文档直接制作成硬件,方便批量烧录进芯片。这就需要用到spiffsimg一个包含多个lua文件的bin文件了。 具体spiffsimg介绍见https://github.com/nodemcu/nodemcu-firmware/blob/master/docs/en/spiffs.md 先进入/nodemcu-firmware/tools/spiffsimg/目录 然后执行: 然后在目录中会生成一个s
打开虚拟机后首先运行./mount.sh,密码是乐鑫英文:espressif,cd到挂载的SDK目录即可操作。 官方推荐不要改动,在D盘根目录创建VM文件夹,在VM文件夹中创建share文件夹 RTOS_SDK编译步骤: 1.在SDK根目录创建app文件夹,这个文件夹就是放自己写的固件的,名字可以随便起,然后将“examples”中的模板代码拷贝进来,将文件夹名称改... sudo apt-get update sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial 系统软件安装: echo "install esp-open-sdk depanden... GPIO0 默认是工作模式(不接线)。如果接了低电平就是下载模式(给模块刷固件!!)所以接低电平。CH_PD接高电平,其余除了TX,RX外可以不接线.. 剩余的其实和我的这篇文章差不多了 NodeMCU初探 首先是先下载需要用到的工具和固件 链接:http://pan.baidu.com...