• NodeMCU 物联网开发快速上手


    NodeMCU 物联网开发快速上手

    来源 http://tinylab.org/nodemcu-kickstart/

    Wu Zhangjin 创作于 2015/12/20

    By Falcon of TinyLab.org 2015-12-20 19:25:59

    1 NodeMCU 简介

    NodeMCU 是一款开源的物联网开发平台,其固件和开发板均开源,自带 WIFI 模块。基于该平台,用几行简单的 Lua 脚本就能开发物联网应用。

    其主要特点如下:

    • 像 Arduino 一样操作硬件 IO 提供硬件的高级接口,可以将应用开发者从繁复的硬件配置、寄存器操作中解放出来。用交互式 Lua 脚本,像 Arduino 一样编写硬件代码!

    • 用 Nodejs 类似语法写网络应用 事件驱动型 API 极大的方便了用户进行网络应用开发,使用类似 Nodejs 的方式编写网络代码,并运行于 5mm*5mm 大小的 MCU 之上,加快您的物联网开发进度。

    • 超低成本的 WIFI 模块 用于快速原型的开发板,集成了售价低于 10 人民币 WIFI 芯片 ESP8266,为您提供性价比最高的物联网应用开发平台。

    基于乐鑫 ESP8266 的 NodeMCU 开发板,具有 GPIO、PWM、I2C、1-Wire、ADC 等功能,结合 NodeMCU 固件为您的原型开发提供最快速的途径。

    NodeMCU 最新版为 1.0,如下图:

    其硬件详细配置如下:

    • 核心模组为 ESP8266
      • MCU 为 Xtensa L106
      • RAM 50K
      • Flash 512K
      • D1~D10:10 GPIO, 每个都能配置为 PWM, I2C, 1-wire
      • FCC 认证的 WIFI 模块,内置 PCB 天线,可作为 AP
    • CP2102 USB 串口,即插即用(官方驱动支持 Windows, OS X,Linux 以及 VMware)

    该平台自 2014 年问世以来,就受到广大物联网开发者喜爱。虽然该平台有上述诸多特性,但是文档方面还是有所欠缺,所以泰晓科技计划跟 NodeMCU 合作,逐步推出一系列文章,介绍该平台的开发环境搭建、SDK 使用、硬件 DIY 精品案例分享等,从而让更多的开发者快速上手和使用该平台。

    作为整个系列的第一篇,咱们主要介绍各平台开发环境搭建,SDK 基本使用和简单案例展示等。

    在具体展开之前,大家可以从参考资料浏览下该平台的一些基本资源,在下文基本都会介绍到。

    2 购买 NodeMCU

    泰晓为 NodeMCU 的国内代理,购买地址为:泰晓开源小店

    如果需要周边配件,可以从 NodeMCU 官方淘宝店 购买。

    3 选择开发系统

    NodeMCU 目前支持的开发主机系统类型涵盖 Windows,Linux 和 Mac OS X,也支持通过 VMware 虚拟机搭建的 Linux 环境。

    需要提到的是,如果用虚拟机的话,请优先用 VMware 而不是 VirtualBox。虽然用 VirtualBox 也能够通过串口虚拟化 进行 Lua 开发,但是由于 VirtualBox 无法虚拟 uhci 的 cp210x,所以 VirtualBox 中的 Linux 上就无法直接烧录固件,会很不方便。

    下面是我们推荐的优选开发环境:

    • 纯 Linux(首推 Lubuntu)
    • 在 Mac OS X 上安装 VMware,在 VMware 中运行 Linux(首推 Lubuntu)
    • 在 Windows 上安装 VMware,在 VMware 中运行 Linux(首推 Lubuntu)

    本文主要介绍上述三种,实际上核心还是 Linux 开发环境,后面两个只要额外安装 VMware 并在主机上也安装上 USB 串口驱动即可。

    如果大家手头没有 Linux 环境,那么建议通过 VMware 来安装 Linux,这样更安全可靠,避免搞坏原来的系统。

    VMware 可以从官方下载,安装好以后再从 Ubuntu 官方下载 Lubuntu 14.04 ISO,之后启动 VMware 来安装 Lubuntu。安装时先创建/Add 一个 Lubuntu(Create a custom virtual machine -> Linux -> Ubuntu 64bit),之后通过设置/Settings 选择 Startup Disk 从 CD/DVD 启动安装,选择刚下载的 ISO,安装成功后,再通过 Startup Disk 选回从 Hard Disk(SCSI) 启动即可。

    至于纯 Windows 或者纯 Mac OS X 环境,都不推荐,因为在 Linux 下,一条命令就可以安装所需的大部分工具,而在 Windows 和 Mac OS X 会浪费掉大量的时间去不同地方找不同工具,然后再花费更多倍的时间去解决各类软件编译和安装问题,事倍功半。而且 OS X 对于基本的开发环境,往往还存在收费服务,实在是不友好,珍惜生命,远离它们!

    但是如果真地厚爱它们,大家还是可以通过参考后续资料,尤其是 Noduino/Noduino SDK 相关部分,很详细地介绍到了 Windows 和 Mac OS X 的开发环境,另外,参考资料中的其他软件或者工具基本都有提供 README.md 对各自的安装做了说明,请予以参考。

    4 安装串口驱动

    在选定开发系统后,接下来就是要安装串口驱动,打通开发主机与 NodeMCU 板子的通信,以便烧录固件、执行命令或者上传 Lua 程序。

    因为 NodeMCU 1.0 采用了 cp2102 USB 串口,其驱动完美支持 Windows,Linux,OS X 和 VMWare,所以各个平台下载 CP210x 安装上即可。

    对于 VMware + Linux,除了在开发主机上安装好串口驱动外,需要在插入 USB 串口以后,根据提示,允许 VMware 控制该 USB 串口,也可以通过设置/Settings 的 USB & Bluetooth 来进行设置。

    安装好再确认下串口驱动是否正常加载:

    1. $ dmesg
    2. [13784.667753] usb 2-2.2: new full-speed USB device number 8 using uhci_hcd
    3. [13784.775474] usb 2-2.2: New USB device found, idVendor=10c4, idProduct=ea60
    4. [13784.775477] usb 2-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    5. [13784.775479] usb 2-2.2: Product: CP2102 USB to UART Bridge Controller
    6. [13784.775481] usb 2-2.2: Manufacturer: Silicon Labs
    7. [13784.775482] usb 2-2.2: SerialNumber: 0001
    8. [13784.935711] cp210x 2-2.2:1.0: cp210x converter detected
    9. [13785.019977] usb 2-2.2: reset full-speed USB device number 8 using uhci_hcd
    10. [13785.225496] usb 2-2.2: cp210x converter now attached to ttyUSB0
    11. $ ls -l /dev/ttyUSB0
    12. crw-rw---- 1 root dialout 188, 0 12 21 21:55 /dev/ttyUSB0

    接着需要安装一个串口通信工具,在 Linux 下推荐 minicom。

    1. $ sudo apt-get install minicom

    使用 minicom 之前,需要明确 NodeMCU 1.0 的串口属性。

    NodeMCU 1.0 的启动时波特率为 74880,但是启动后就切到了 9600,如果直接用 9600,则开头会看到一串乱码之后恢复正常。而刷固件时可以通过 esptool 自己设置波特率,NodeMCU 1.0 那边会根据用户设置自动配置波特率,比如说设置成 115200,921600 都可以。

    串口设备在不同系统下名字有些差异,在 Linux 下为 /dev/ttyUSBn,在 Mac OS X 下为 /dev/cu.SLAB_USBtoUART 和 /dev/tty.SLAB_USBtoUART,Windows 下为 COMn

    其他配置为常见的:8N1,即 Bits:8;Parity:None;Stop Bits:1。另外,Hardware Flow Control 和 Software Flow Control 均为 No。

    5 下载并烧录最新固件

    从 NodeMCU Firmware Release 下载最新固件,以 float 为例(注:integer 不支持 float,但节省了 11 KB):

    1. $ wget -c https://github.com/nodemcu/nodemcu-firmware/releases/download/0.9.6-dev_20150704/nodemcu_float_0.9.6-dev_20150704.bin

    接着咱们把烧录工具 esptool.py 下载下来。同时安装其他必要工具。

    1. $ sudo apt-get install git python python-serial python-setuptools
    2. $ git clone https://github.com/themadinventor/esptool.git
    3. $ cd esptool
    4. $ python setup.py install

    在烧录固件之前需要通过如下操作进入 NodeMCU 的固件烧录模式:

    • 按住 FLASH 按键(这里不松开)
    • 按下 RST 按键并松开
    • 松开 FLASH 按键

    接着通过 esptool.py 烧录固件:

    1. $ sudo esptool.py --port /dev/ttyUSB0 write_flash -fm dio -fs 32m -ff 40m 0x00000 nodemcu_float_0.9.6-dev_20150704.bin

    烧录完以后记得按下 RST 重启进入新固件。

    esptool.py 烧写时默认的通信波特率为 115200,为了加速烧写速度,可以通过 --baud 921600 设置为 921600。

    需要提到的是,如果不想保留固件中原有的各类 Lua 程序,可以在启动后格式化文件系统(file.format(),见后文),也可以在烧录前刷掉整个固件:

    1. $ sudo esptool.py --port /dev/ttyUSB0 erase_flash

    当文件系统被破坏或者某个 Lua 程序出错以后导致系统不断重启时,擦除整个 Flash 几乎是必要的(实际也可以擦除文件系统所在的区块或者重写该区块),当然,还有一些另类的办法,后面会补充。

    6 基本操作演示

    烧录完以后按下 RST 按钮重启 NodeMCU,再启动 minicom 就可以进入 Lua 交互式命令行:

    1. $ minicom -D /dev/ttyUSB0
    2. > print('Hello, NodeMCU 1.0')
    3. Hello, NodeMCU 1.0
    4. > gpio.mode(0, gpio.OUTPUT)
    5. > gpio.write(0, gpio.LOW)
    6. > gpio.write(0, gpio.HIGH)
    7. > file.format()
    8. > node.restart()

    上面几条命令分别完成:

    • 打印了一串字符串
    • 开/关了靠近 USB 口的 LED(靠近 Wifi 模块的 LED 的 pin 为 4)
    • 格式化文件系统
    • 最后重启了 NodeMCU

    如果嫌不够酷,可以参考 NodeMCU API 手册 可以做更多有趣的操作。

    接下来,创建一个初始化程序:init.lua,它在 NodeMCU 启动后自动执行。

    咱们通过该程序在 NodeMCU 启动后立即点亮 LED:

    1. > file.open('init.lua','w')
    2. > file.writeline('gpio.mode(0,gpio.OUTPUT)')
    3. > file.writeline('gpio.write(0,gpio.LOW)')
    4. > file.close()
    5. > node.restart()

    init.lua 是 NodeMCU 启动时默认执行的第一个程序,有点类似 Linux 上的 init 程序。通过它还可以加载其他程序来完成特定的功能。

    咱们再做一个复杂一点的操作,在 init.lua 里头调用(dofile)一个 user.lua 来点亮 LED:

    1. > file.open('init.lua','w')
    2. > file.writeline('dofile("user.lua")')
    3. > file.close()
    4. > file.open('user.lua','w')
    5. > file.writeline('gpio.mode(0,gpio.OUTPUT)')
    6. > file.writeline('gpio.write(0,gpio.LOW)')
    7. > file.close()
    8. > node.restart()

    读出 init.lua 看下效果:

    1. > file.open('init.lua','r')
    2. > print(file.readline())
    3. dofile("user.lua")
    4. > file.close()

    当 user.lua 脚本出错时可能导致系统不停地重启,这个时候除了擦除整个 Flash 外,还可以通过 init.lua 做个简单的容错处理:

    1. if gpio.read(2) == 1:
    2. file.format()
    3. else
    4. dofile('user.lua')
    5. end

    一旦系统出错,只要拉高 GPIO 2 就可以格式化文件系统。

    暂时先到这里吧,后面会逐步介绍更多实例。

    7 上传 Lua 程序

    上面演示的是命令行操作,这里再介绍如何把在主机端写好的 Lua 程序上传到 NodeMCU 上。

    测试过两个工具都可以用来上传 Lua 程序,分别是:

    • luatool.py:可用于命令行传送 Lua 脚本,无须复杂的图形化工具支持,同时支持通过串口和 Telnet 上传
    • nodemcu.py:除了不支持通过 Telnet 上传外,基本功能同 luatool,只是操作方式稍有差异

    下载上述工具:

    1. $ git clone https://github.com/4refr0nt/luatool.git
    2. $ git clone https://github.com/md5crypt/nodemcu.py.git

    两个都可以进行文件传输,第二个还可以作为串口终端,两个都依赖 pySerial,第二个还需要安装 clipboard:

    1. $ easy_install clipboard

    在上传前咱们写一个简单的 init.lua 脚本,该脚本用于点亮另外一个 LED:

    1. print('Hello, NodeMCU 1.0')
    2. gpio.mode(4, gpio.OUTPUT)
    3. gpio.write(4, gpio.LOW)

    7.1 luatool.py

    通过 luatool.py 传送,传送完立马重启:

    1. $ cd luatool/luatool/
    2. $ sudo ./luatool.py -p /dev/ttyUSB0 -b 9600 -f init.lua -r

    查看帮助,可以看到更多用法:

    1. $ sudo ./luatool.py -h
    2. Usage: luatool.py [-h] [-p PORT] [-b BAUD] [-f SRC] [-t DEST] [-c] [-r] [-d]
    3. [-v] [-a] [-l] [-w] [-i] [--delete DELETE] [--ip IP]
    4. ESP8266 Lua script uploader.
    5. optional arguments:
    6. -h, --help show this help message and exit
    7. -p PORT, --port PORT Device name, default /dev/ttyUSB0
    8. -b BAUD, --baud BAUD Baudrate, default 9600
    9. -f SRC, --src SRC Source file on computer, default main.lua
    10. -t DEST, --dest DEST Destination file on MCU, default to source file name
    11. -c, --compile Compile lua to lc after upload
    12. -r, --restart Restart MCU after upload
    13. -d, --dofile Run the Lua script after upload
    14. -v, --verbose Show progress messages.
    15. -a, --append Append source file to destination file.
    16. -l, --list List files on device
    17. -w, --wipe Delete all lua/lc files on device.
    18. -i, --id Query the modules chip id.
    19. --delete DELETE Delete a lua/lc file from device.
    20. --ip IP Connect to a telnet server on the device (--ip
    21. IP[:port])

    7.2 nodemcu.py

    通过 nodemcu.py 上传:

    1. $ cd nodemcu.py/
    2. $ python ./nodemcu.py /dev/ttyUSB0 9600
    3. > :file init.lua init.lua
    4. > node.restart()

    查看帮助,更多用法:

    1. > :help
    2. :help
    3. :uart [boudrate] - dynamic boudrate change
    4. :load src - evaluate file content
    5. :file dst src - write local file src to dst
    6. :paste [file] - evaluate clipboard content
    7. or write it to file if given
    8. :cross-compile dst [file] - compile file or clipboard using
    9. luac-cross and save to dst
    10. :execute [file] - cross-compile and execute clipboard or
    11. file content without saving to flash
    12. :soft-compile dst [file] - compile file or clipboard on device
    13. and save do dst. This call should handle
    14. lager files than file.compile

    8 Lua 程序示例

    这里仅仅展示几则基本的 Lua 程序,方便大家快速上手。更多例子请参考 NodeMCU Firmware 下的 Lua examples:

    也可以在后面下载的 nodemcu-firmware/examples,nodemcu-firmware/lua_examples 找到这些例子:

    8.1 启动后不断闪烁 LED

    上面其实已经演示了 LED 的基本操作,这里再介绍一个 timer module 的 API:tmr.alarm():

    tmr.alarm(id, interval, repeat, function do())

    id: 0~6, alarmer id. Interval: alarm time, unit: millisecond repeat: 0 - one time alarm, 1 - repeat function do(): callback function for alarm timed out

    咱们基于它实现一个 blink.lua:

    1. print('Blink Demo')
    2. lighton=0
    3. led=0
    4. gpio.write(led, gpio.HIGH)
    5. tmr.alarm(0,1000,1,function()
    6. if lighton==0 then
    7. lighton=1
    8. gpio.mode(led, gpio.OUTPUT)
    9. gpio.write(led, gpio.LOW)
    10. else
    11. lighton=0
    12. gpio.write(led, gpio.HIGH)
    13. end
    14. end)
    15. gpio.mode(led, gpio.INPUT)

    上传 blink.lua 并立即执行:

    1. $ sudo ./luatool.py -p /dev/ttyUSB0 -b 9600 -f blink.lua -d

    8.2 远程控制 LED 闪烁

    对于物联网来讲,远程控制很关键。咱们这里演示如何通过 Wifi 开启一个服务端口 8888 用于控制 LED,remote_led.lua

    1. -- 开启 Wifi 并获得 NodeMCU IP 地址
    2. -- ssid pwd 分别为自家路由器的 SSID 和访问密码
    3. local ssid="SSID"
    4. local pwd="password"
    5. ip=wifi.sta.getip()
    6. print(ip)
    7. if not ip then
    8. wifi.setmode(wifi.STATION)
    9. wifi.sta.config(ssid,pwd)
    10. print(wifi.sta.getip())
    11. end
    12. -- 开启一个 8888 的端口
    13. -- 并通过 node.input() 调用 Lua 解释器控制 LED
    14. srv=net.createServer(net.TCP)
    15. srv:listen(8888,function(conn)
    16. conn:on("receive",function(conn,payload)
    17. node.input("gpio.mode(0, gpio.OUTPUT)")
    18. node.input("gpio.write(0, gpio.LOW)")
    19. end)
    20. end)

    上传 Lua 程序到服务器执行:

    1. $ sudo ./luatool.py -p /dev/ttyUSB0 -b 9600 -f remote_led.lua -d

    查看 NodeMCU 获取的 IP 地址:

    1. $ sudo minicom -D /dev/ttyUSB0
    2. > print(wifi.sta.getip())
    3. 192.168.0.104 255.255.255.0 192.168.0.1

    并测试:

    1. $ sudo apt-get install lynx
    2. $ lynx 192.168.0.104:8888

    8.3 开启一个 Telnet 服务

    先从 NodeMCU.com 下载该例子,telnetd.lua

    1. -- a simple telnet server
    2. s=net.createServer(net.TCP,180)
    3. s:listen(2323,function(c)
    4. function s_output(str)
    5. if(c~=nil)
    6. then c:send(str)
    7. end
    8. end
    9. node.output(s_output, 0)
    10. -- re-direct output to function s_ouput.
    11. c:on("receive",function(c,l)
    12. node.input(l)
    13. --like pcall(loadstring(l)), support multiple separate lines
    14. end)
    15. c:on("disconnection",function(c)
    16. node.output(nil)
    17. --unregist redirect output function, output goes to serial
    18. end)
    19. print("Welcome to NodeMCU world.")
    20. end)

    上传并执行:

    1. $ sudo ./luatool.py -p /dev/ttyUSB1 -b 9600 -f telnetd.lua -d

    通过 telnet 连接:

    1. $ sudo apt-get install telnet
    2. $ telnet 192.168.0.104 2323
    3. Trying 192.168.0.104...
    4. Connected to 192.168.0.104.
    5. Escape character is '^]'.
    6. Welcome to NodeMCU world.
    7. > print('Hello, NodeMCU Telnet')
    8. Hello, NodeMCU Telnet
    9. >

    有了 telnet 服务,咱就可以不依赖串口而是直接通过 Wifi 上传 Lua 脚本了:

    1. $ cat test.lua
    2. print('Upload via telnet service')
    3. $ sudo ./luatool.py --ip 192.168.0.104:2323 -f test.lua -d -v

    9 下载编译工具链

    社区已经有编译好的工具链并有同学已经打包到 github,下载、安装和配置如下:

    1. $ git clone https://github.com/icamgo/xtensa-toolchain.git
    2. $ cd xtensa-toolchain && ./gen.py
    3. $ echo "export PATH=$PWD/xtensa-lx106-elf/bin:$PWD/bin:$PATH" >> ~/.bashrc
    4. $ . ~/.bashrc

    之后就可以使用 xtensa-lx106-elf-gcc 编译器了。

    10 编译 NodeMCU Firmware

    10.1 采用泰晓科技的仓库

    NodeMCU 的官方仓库,在使用预编译的 Xtensa 工具链编译时有很多问题。

    泰晓科技对 Firmware 源码进行一一修复后,就可以用上述预编译的 Xtensa 工具链进行编译和烧录:

    1. $ git clone https://github.com/tinyclub/nodemcu-firmware.git
    2. $ make -j5
    3. $ sudo make flash

    如果串口地址不是默认的 /dev/ttyUSB0,那么可以这样配置:

    1. $ sudo COMPORT=/dev/ttyUSB1 make flash

    10.2 编译 NodeMCU 官方源

    如果一定要用官方源,详细步骤如下:

    在编译 NodeMCU Firmware 时需要额外下载一个 xtensa 头文件目录以及一个 libhal 库,否则编译时会出现如下错误:

    fatal error: xtensa/corebits.h: No such file or directory

    xtensa-toolchain/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld: cannot find -lhal collect2: error: ld returned 1 exit status

    可以依次下载 NodeMCU Firmware,ESP8266_RTOS_SDK(含 xtensa 头文件)以及 libhal.a:

    1. $ git clone https://github.com/nodemcu/nodemcu-firmware.git
    2. $ git clone https://github.com/espressif/ESP8266_RTOS_SDK.git
    3. $ wget -c https://github.com/esp8266/esp8266-wiki/raw/master/libs/libhal.a

    然后把这些头文件和库放到正确的位置:

    1. $ cp -r ESP8266_RTOS_SDK/extra_include/xtensa/ nodemcu-firmware/app/user/
    2. $ cp libhal.a nodemcu-firmware/sdk/esp_iot_sdk_v1.4.0/lib/libhal.a

    编译:

    1. $ cd nodemcu-firmware/
    2. $ make

    之后是烧录,但是默认烧录(make flash)后无法正常启动,需要命令行中额外传递 -fm dio -fs 32m -ff 40m 参数:

    1. $ sudo esptool.py --port /dev/ttyUSB0 write_flash -fm dio -fs 32m -ff 40m 0x00000 ./bin/0x00000.bin 0x10000 ./bin/0x10000.bin

    执行上述命令前记得依次:按下 FLASH,按下 RST,松开 RST,松开 FLASH,以便进入烧录模式。

    10.3 制作单一文件的固件

    NodeMCU 发布时是单一文件的固件,这个是怎么制作的呢?

    实际上它是通过 .travis.yml 配置在线编译服务:http://www.travis-ci.org/ 实现的,该服务可以作为 github 的插件配置并把编译好的内容发布回 github。

    在 .travis.yml 文件中,可以看到 srec_cat 命令,这个就是用来打包的:

    1. $ cat .travis.yml | grep srec_cat
    2. - srec_cat -output ${file_name_float} -binary 0x00000.bin -binary -fill 0xff 0x00000 0x10000 0x10000.bin -binary -offset 0x10000
    3. - srec_cat -output ${file_name_integer} -binary 0x00000.bin -binary -fill 0xff 0x00000 0x10000 0x10000.bin -binary -offset 0x10000

    上述两条命令分别是用来打包支持 float 和仅支持 integer 的固件包,咱们可以自己用上述命令制作一个:

    1. $ sudo apt-get install srecord
    2. $ cd bin
    3. $ srec_cat -output nodemcu_firmware.bin -binary 0x00000.bin -binary -fill 0xff 0x00000 0x10000 0x10000.bin -binary -offset 0x10000

    编译完的 nodemcu_firmware.bin 就跟从 NodeMCU 官方下载的一样可以直接一条命令烧录:

    1. $ sudo esptool.py --port /dev/ttyUSB0 write_flash -fm dio -fs 32m -ff 40m 0x00000 nodemcu_firmware.bin

    10.4 精细配置

    为了更精细地控制 NodeMCU 固件的大小,可以配置是否支持浮点,也可以配置所需的模块。

    上面看到有 float 和 integer 之分:

    1. $ cat .travis.yml | grep EXTRA_
    2. - make EXTRA_CCFLAGS="-DBUILD_DATE='"'$BUILD_DATE'"'" all
    3. - make EXTRA_CCFLAGS="-DLUA_NUMBER_INTEGRAL -DBUILD_DATE='"'$BUILD_DATE'"'"

    要编译成仅支持 integer 可以在编译时定义宏 LUA_NUMBER_INTEGRAL 或者在 app/include/user_config.h 打开如下定义:

    1. #define LUA_NUMBER_INTEGRAL

    上面默认是没定义的,即默认编译出来是支持 float 的,但是 integer 比 float 的固件小 11k 左右,可以节省一些空间来存放用户的 Lua 程序。

    另外,通过 app/include/user_modules.h 可以仅仅打开所需的模块,例如要去掉 MQTT:

    1. // #define LUA_USE_MODULES_MQTT

    10.5 在线编译

    如果不想搭建编译环境,也可以在线编译。

    • https://travis-ci.org/ 如果需要修改代码,可以用该方案。只需要把修改提交到自己的 github 仓库,并通过 github 配置好 .travis.yml 即可。

    • http://nodemcu-build.com 该方案适合直接采用 NodeMCU 源,并且不做修改的情况,它提供了 Web 界面可以简单方便地选择所需模块。

    11 制作 Xtensa 交叉编译器

    虽然有现成的工具链可用,但是如果还是想浪费时间从头编译一套也无妨。

    社区有开发一套 esp-open-sdk,集成了 crosstool-NG, gcc-xtensa, newlib-xtensa 和 lx106-hal 等工具,借助它可以自助编译一套 Xtensa 工具链。

    下载后的 README.md 针对各平台有较详细的说明,咱们只介绍 Ubuntu 14.04 下如何编译。由于编译过程需要下载大量软件包,编译过程会相当慢,需要有足够耐心。

    1. $ sudo apt-get install make unrar autoconf automake libtool gcc g++ gperf flex bison texinfo gawk ncurses-dev libexpat-dev python python-serial sed git
    2. $ git clone https://github.com/pfalcon/esp-open-sdk.git
    3. $ cd esp-open-sdk
    4. $ make

    同样配置好 PATH 环境变量后就可使用:

    1. $ echo "export PATH=$PWD/xtensa-lx106-elf/bin:$PWD/esptool/:$PATH" >> ~/.bashrc
    2. $ . ~/.bashrc

    12 使用 Noduino SDK

    前面所有的内容都在介绍 NodeMCU 官方的 Lua SDK,其实 ESP8266 官方也有提供 SDK,第三方也有提供,这里再介绍一个基于 ESP8266 官方但是做了更好封装的 Noduino SDK:

    下载 Noduino SDK:

    1. $ git clone git://github.com/icamgo/noduino-sdk.git

    下载工具链(包括 esptool 和 xtensa-toolchain)和 ESP8266 官方的 RTOS SDK:

    1. $ cd noduino-sdk
    2. $ git submodule init
    3. Submodule 'rtos/esp32' (git://github.com/espressif/esp32_rtos_sdk.git) registered for path 'rtos/esp32'
    4. Submodule 'rtos/esp8266' (git://github.com/espressif/esp8266_rtos_sdk.git) registered for path 'rtos/esp8266'
    5. Submodule 'toolchain' (git://github.com/icamgo/xtensa-toolchain.git) registered for path 'toolchain'
    6. $ git submodule update
    7. $ cd toolchain
    8. $ ./gen.py

    实例演示:

    1. $ cd ../examples/noduino/blink/
    2. $ make && make flash

    13 使用 Arduino IDE

    Noduino 封装为了 Arduino IDE 可用的简易包,不同于可独立使用的 Noduino SDK,该包需要集成进 Arduino IDE 使用,这个对于习惯 Arduino 或者喜欢 IDE 环境的同学是福音。

    先从 arduino.cc 下载并安装 Arduino IDE,安装后进入:

    1. $ cd /PATH/TO/arduino
    2. $ cd hardware
    3. $ mkdir esp8266com
    4. $ cd esp8266com
    5. $ git clone git://github.com/icamgo/Noduino.git esp8266
    6. # fetch the toolchain of esp8266
    7. $ cd esp8266
    8. $ git submodule init
    9. $ git submodule update
    10. $ cd tools/xtensa-toolchain
    11. $ ./gen.py

    之后启动或者重启 Arduino,在菜单 Tools 里头选择 Board 为 NodeMCU 1.0,并确认串口正确,默认为 /dev/ttyUSB0,比如说 /dev/ttyUSB1

    接着通过菜单 File 中的 Examples 找到 esp8266 的 Blink。

    最后,按下 Arduino IDE 的“上传”按钮编译和烧录 Blink 到板子上,效果跟上面的 Lua 例子一样,会闪烁 LED 。

    14 参考资料

    ===================== End

  • 相关阅读:
    八数码问题--bfs
    子集生成——增量构造法
    回溯法
    子集生成——二进制法
    子集生成
    dfs 记忆搜索——注意剪枝方式
    pyhon---信息的爬取与提取---bs4,BeautifulSoup,re库
    008sudo用户管理
    007Linux在线升级yum
    006NFS与TFTP服务器
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/13875192.html
Copyright © 2020-2023  润新知