SDK编译环境安装包的安装、编译与烧录教程
【支持最新版AT、IOT及LUA源码编译,附源码】
1、安装包Fans_ESP8266_SDK_Make.exe
下载地址:http://pan.baidu.com/s/1pJ6w1tD
安装后在C盘下生成三个文件夹:c:\python27、c:\usr、c:\ESP8266_SDK_Fans_V2.0【最新固件源代码】
2、安装
安装前确认之前没有安装过xtensa,如果安装过则请:
同时确定电脑的系统时间为最新的(不要设置成过去的日期和时间,如2013年1月1日。)
然后,点击Fans_ESP8266_SDK_Make.exe进行安装
注:一定要选择默认安装,即:C:\
点击安装
注:安装过程中提示,选择确定与允许即可。
完成安装后,将
C:\usr\xtensa\XtDevTools\install\tools\RC-2010.1-win32\XtensaTools\Tools\lic\license.dat
使用
编辑修改里面的两个HOSTID=后面的值为本电脑的MAC值(即物理地址),保存即可完成注册。
将SDK的源代码复制,这里分三种情况,具体操作如下:
(1)如果是AT源代码,则只需要拷贝AT文件夹里的三个文件夹driver、include、user到C:\usr\xtensa\esp_iot_sdk\app里面。
注:只拷贝这三个文件夹的文件,其他不需要。
(2)如果是IOT源代码,则需要拷贝以下几个文件夹:
到C:\usr\xtensa\esp_iot_sdk\app里面,其他的不需要拷贝。
(3)如果是LUA源代码,则需要拷贝以下几个文件夹:
到C:\usr\xtensa\esp_lua_sdk\app里面,其他的不需要拷贝。
然后,运行C:\usr\install里的xtensa_IOT或者xtensa_LUA
在命令提示符状态下输入:cd app
接着,输入make clean指令对编译环境进行清除(进行两次清除操作)。
然后输入make指令对源代码进行编译操作
编译成功后(无错误提示,特别是代码的编译错误),输入makebin,最终输出Fans_SDK_flash.bin固件。
编译成功,最终输出Fans_SDK_flash.bin固件。
(存放在C:\usr\xtensa\esp_iot_sdk\bin\Fans_SDK_flash.bin)
最后,将固件烧录。
固件接线方法:采用USB转TTL串口连接模块与PC
VCC----à3.3
GND--àGND
CH_PD--à3.3
GPIO0--àGND
RX--àTX
TX--àRX
其余引脚为空。
模块上电后,确保电脑的串口只有模块一个,然后输入burnbin,进入烧录,进度完成后,烧录固件完成。
或者使用ESP8266一键烧写工具-显MACv0.91-x86.exe进行烧录:
先把固件导入到INTERNAL://FLASH这个选项中。
导入后:
最后点击一键烧写:
附:
本安装包纯绿色安装,如果不需要这个编译环境,可以直接删除以下三个文件夹就完成卸载。
C:\usr
C:\python27
C:\ESP8266_SDK_Fans_V2.0【最新版SDK代码】
固件启动运行接线方法:采用USB转TTL串口连接模块与PC
VCC----à3.3
GND--àGND
CH_PD--à3.3
RX--àTX
TX--àRX
其余引脚为空。
如有什么问题请联系: Q群【ESP8266开发与应用】222651602
LUA源码开发教程
NodeMcu介绍:(一) 概述
NodeMcu是什么?
NodeMcu是一款运行于乐鑫ESP8266芯片之中的可编程固件。
它以lua语言为基础,同时提供了封装esp8266硬件操作的高级API,可以让开发者以类似于arduino的方式与底层硬件打交道,使软件开发人员轻松操作硬件设备;同时NodeMcu还提供了事件驱动型的网络API,Nodejs风格的编程方式更是让互联网开发人员如鱼得水。
目前NodeMcu推出的第一代开发板NodeMcu Dev Kit,对安信可科技推出的esp8266封装模块ESP12进行扩展,包括了:
D1~D10:均可复用为GPIO,PWM,I2C,1-Wire
A0:1路ADC
USB供电
USB转串口调试接口
可用RAM为20Kbyte;目前采用512K FLash,用户可用存储空间150Kbyte。同时使用NodeMcu Flash Programmer自动烧写固件。
低成本的ESP8266硬件、高度抽象NodeMcu API将助推众多开发者们的创造性想法,让您的原型开发快速推进!
NodeMcu介绍:(二)固件烧写
准备工作:
一、拿到NodeMcu的开发板
NodeMcu开发板基于乐鑫esp8266进行拓展,引出常用管脚,方便使用者进行基于NodeMcu-firmware的原型开发。
二、下载 NodeMcu Frimware Programmer
NodeMcu提供了烧写固件的专用工具,根据您的操作系统可以选择下载 32位操作系统版 或者 64位操作系统版1。
三、下载NodeMcu固件
最新版的NodeMcu固件,请点击此处下载。
四、一根micro-USB数据线
开始:
一、使用USB数据线连接计算机与NodeMcu开发板。
第一次连接时,计算机会弹出安装驱动的提示,请搜索下载CH340的驱动,可以在计算机->设备管理器中查看USB转serial是否安装成功。
二、运行NodeMcu Firmware Programmer烧写固件
NodeMcu Firmware Programmer(以下简称NFP)提供了NodeMcu Firmware的自动烧写功能,在成功连接计算机与NodeMcu开发板之后,打开NFP并选择Config选项,点击第一栏的 ,选择已经下载的NodeMcu固件。如图所示
然后选择“Operation”,出现如下图状态:
点击“Flash”,进行固件烧写。状态如下:
等待烧写结束,如下
至此,NodeMcu固件已经烧写至NodeMcu开发板。关闭NFP,断开USB连线。
三、打印Hello world
再次连接计算机与NodeMcu开发板,打开调试软件,推荐使用Tera Term,初次打开TeraTerm需进行简单配置,SeraialPort选择设备管理器中显示的CH340USB转串口的端口号。
点击OK进入主界面。
此时输入:
print("hello world")
NodeMcu响应如下:
至此,NodeMcu Firmware已经正式运行在NodeMCU开发板中,您可以通过我们提供的API及文档1进行原型开发,Good Luck!
NodeMcu介绍:(三)启动文件init.lua
启动过程中的init.lua
如图所示,当用户重新供电或者执行node.restart()函数之后,NodeMcu Firmware将会重新启动,启动过程中的最后一步是执行init.lua文件,如果在NodeMcu中不存在此文件,或者此文件内容不可执行,则会弹出如上图中的lua:cannot open init.lua。
如果用户想要在启动后自动执行用户自己的代码,那么可以在init.lua写入最简单的dofile("yourfile.lua")即可。NodeMcu在下次重新启动之后,便可自动跳转执行“yourfile.lua” ,达到类似于bootloader的作用,当然用户也可以在init.lua中写入其他的lua代码,如:可以进行wifi设置,获取ip等操作。
具体代码如下:
file.open("init.lua","w+")
file.writeline([[print("hello world")]])
file.close()
文件操作函数请参考API文档
Tera Term中显示如下
然后执行 node.restart(),NodeMcu将会重新启动,并自动执行init.lua,执行效果如下:
NodeMcu介绍:(四)下载*.lua文件
在前一篇文章中我们介绍了如何使用"init.lua"文件,要注意的是我们通过NodeMcu固件提供的file模块相关函数创建、修改并保存"init.lua"文件,我们的文件内容只有一行代码“print("hello world")",通过调试窗口TeraTerm即可进行上述操作,但是当文件中有较多的代码后,上述通过调试窗口逐行输入的方式就不合适了,下面我们就介绍一下如何通过NodeMcu Studio 2015进行代码下载。
关于NodeMcu Studio 2015
NodeMcu Studio 2015是用于NodeMcu固件下载用户代码的工具软件,目前仅支持Windows 7和Windows XP(需要安装.Net FramWork 4.0)。用户需要将已经编写好的*.lua代码复制到文件目录下的”Lua Programs“文件夹下,然后运行NodeMcu Studio 2015.exe,配置串口,并在文件栏中选择需要下载的文件,点击”Download“,下载至NodeMcu。
准备*.lua代码
用户需要预先编辑好要下载的lua代码文件,此处我们新建了"init.lua"和"list.lua",代码分别如下:
--init.lua
print("set up wifi mode")
wifi.setmode(wifi.STATION)
wifi.sta.config("SSID","PassWord")
--here SSID and PassWord should be modified according your wireless router
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function()
if wifi.sta.getip()== nil then
print("IP unavaiable, Waiting...")
else
tmr.stop(1)
print("Config done, IP is "..wifi.sta.getip())
--dofile("yourfile.lua")
end
end)
--list.lua
l = file.list();
for k,v in pairs(l) do
print("name:"..k..", size:"..v)
end
其中init.lua用于设置nodemcu wifi的工作模式并获取ip,再成功获取ip之后,可以选择执行dofile("yourfile.lua");list.lua文件用于列出nodemcu文件系统中当前的文件。将这两个文件复制到Lua Programs文件夹中。
运行NodeMcu Studio 2015.exe文件
运行软件,并在All Programs一栏中选择init.lua,点击Download,直至出现如下界面,文件成功下载至NodeMcu。
然后同样的,将list.lua文件也下载至NodeMcu中
关闭NodeMcu Studio 2015.exe
测试下载文件
打开TeraTerm,输入:
node.restart()
出现如下界面:
init文件执行成功。
然后执行:
dofile("list.lua")
执行结果:
列出当前文件为init.lua和list.lua
获取NodeMcu Studio 2015
现在,您可以通过我们提供的简单开发工具NodeMcu Studio 2015进行代码下载,获取地址:
NodeMcu Studio 2015.rar (19.7 KB)
现在就编辑你自己的lua代码,把想法付诸实现吧!
NodeMcu 编程示例:读取气压计bmp085的数据
bmp085介绍
BMP085大气压传感器是一款廉价的精密气压、温度传感器,使用I2C通讯协议,使用方便,其主要参数:
· 压力传感器范围:300-1100 hPa(对应海拔9000米 至 -500米)
· 分辨率: 0.03hpa/0.25米
· 温度传感器范围:-40℃ +85℃ ±2℃误差值
· I2C数据接口
· 3.3V 5V双电平方案
------------------------------------------------------------------------
-- BMP085 I2C module for NODEMCU
-- NODEMCU TEAM
-- LICENCE: http://opensource.org/licenses/MIT
-- Christee
------------------------------------------------------------------------
local moduleName = ...
local M = {}
_G[moduleName] = M
--default value for i2c communication
local id=0
--default oversampling setting
local oss = 0
--CO: calibration coefficients table.
local CO = {}
-- read reg for 1 byte
local function read_reg(dev_addr, reg_addr)
i2c.start(id)
i2c.address(id, dev_addr ,i2c.TRANSMITTER)
i2c.write(id,reg_addr)
i2c.stop(id)
i2c.start(id)
i2c.address(id, dev_addr,i2c.RECEIVER)
local c=i2c.read(id,1)
i2c.stop(id)
return c
end
--write reg for 1 byte
local function write_reg(dev_addr, reg_addr, reg_val)
i2c.start(id)
i2c.address(id, dev_addr, i2c.TRANSMITTER)
i2c.write(id, reg_addr)
i2c.write(id, reg_val)
i2c.stop(id)
end
--get signed or unsigned 16
--parameters:
--reg_addr: start address of short
--signed: if true, return signed16
local function getShort(reg_addr, signed)
local tH = string.byte(read_reg(0x77, reg_addr))
local tL = string.byte(read_reg(0x77, (reg_addr + 1)))
local temp = tH*256 + tL
if (temp > 32767) and (signed == true) then
temp = temp - 65536
end
return temp
end
-- initialize i2c
--parameters:
--d: sda
--l: scl
function M.init(d, l)
if (d ~= nil) and (l ~= nil) and (d >= 0) and (d <= 11) and (l >= 0) and ( l <= 11) and (d ~= l) then
sda = d
scl = l
else
print("iic config failed!") return nil
end
print("init done")
i2c.setup(id, sda, scl, i2c.SLOW)
--get calibration coefficients.
CO.AC1 = getShort(0xAA, true)
CO.AC2 = getShort(0xAC, true)
CO.AC3 = getShort(0xAE, true)
CO.AC4 = getShort(0xB0)
CO.AC5 = getShort(0xB2)
CO.AC6 = getShort(0xB4)
CO.B1 = getShort(0xB6, true)
CO.B2 = getShort(0xB8, true)
CO.MB = getShort(0xBA, true)
CO.MC = getShort(0xBC, true)
CO.MD = getShort(0xBE, true)
end
--get temperature from bmp085
--parameters:
--num_10x: bool value, if true, return number of 0.1 centi-degree
-- default value is false, which return a string , eg: 16.7
function M.getUT(num_10x)
write_reg(0x77, 0xF4, 0x2E);
tmr.delay(10000);
local temp = getShort(0xF6)
local X1 = (temp - CO.AC6) * CO.AC5 / 32768
local X2 = CO.MC * 2048/(X1 + CO.MD)
local r = (X2 + X1 + 8)/16
if(num_10x == true) then
return r
else
return ((r/10).."."..(r%10))
end
end
--get raw data of pressure from bmp085
--parameters:
--oss: over sampling setting, which is 0,1,2,3. Default value is 0
function M.getUP_raw(oss)
local os = 0
if ((oss == 0) or (oss == 1) or (oss == 2) or (oss == 3)) and (oss ~= nil) then
os = oss
end
local ov = os * 64
write_reg(0x77, 0xF4, (0x34 + ov));
tmr.delay(30000);
--delay 30ms, according to bmp085 document, wait time are:
-- 4.5ms 7.5ms 13.5ms 25.5ms respectively according to oss 0,1,2,3
local MSB = string.byte(read_reg(0x77, 0xF6))
local LSB = string.byte(read_reg(0x77, 0xF7))
local XLSB = string.byte(read_reg(0x77, 0xF8))
local up_raw = (MSB*65536 + LSB *256 + XLSB)/2^(8 - os)
return up_raw
end
--get calibrated data of pressure from bmp085
--parameters:
--oss: over sampling setting, which is 0,1,2,3. Default value is 0
function M.getUP(oss)
local os = 0
if ((oss == 0) or (oss == 1) or (oss == 2) or (oss == 3)) and (oss ~= nil) then
os = oss
end
local raw = M.getUP_raw(os)
local B5 = M.getUT(true) * 16 - 8;
local B6 = B5 - 4000
local X1 = CO.B2 * B6 / 4096
local X2 = CO.AC2
local X3 = (X1 + X2)*B6/2048
local B3 = CO.AC1*(2^os) + (X3*2^os + 2)/4 --local B3 = ((CO.AC1*4 + X3)*2^os + 2)/4
X1 = CO.AC3 -- * B6 /8192
X2 = CO.B1 * B6 /32768 -- * B6 / 8192
X3 = ((X1 + X2)*B6/8192 + 2)/4
local B4 = CO.AC4 * (X3 + 32768) / 32768
local B7 = (raw -B3) * (50000/2^os)
local p = B7/B4 * 2
X1 = (p/256)^2
X1 = (X1 *3038)/65536
X2 = (-7357 *p)/65536
p = p +(X1 + X2 + 3791)/16
return p
end
--get estimated data of altitude from bmp085
--parameters:
--oss: over sampling setting, which is 0,1,2,3. Default value is 0
function M.getAL(oss)
--Altitudi can be calculated by pressure refer to sea level pressure, which is 101325
--pressure changes 100pa corresponds to 8.43m at sea level
return (M.getUP(oss) - 101325)*843/10000
end
return M
bmp085采集代码以模块的形式编写,提供了5个对外调用的函数:
init(sda, scl) --初始化I2C总线
getUT() --返回温度
getUP_raw() --返回未校准的气压值
getUP() --返回校准后的气压值
getAL() --返回计算高度
将文件命名为bmp085.lua,并使用NodeMcu Studio 2015下载到NodeMcu中,然后打开TeraTerm进行测试。
调用bmp085模块,并获取数据
重新启动NodeMcu
node.restart()
当init.lua执行完毕之后,输入如下代码,引用bmp085模块:
b=require "bmp085"
执行初始化操作:
b.init(8,9) --这里要用户根据需求映射sda 和 scl到NodeMcu的 IO
然后调用getUT(), getUP(), getAL(),获取响应的数据,结果如下:
如上图,所处环境的温度19.0摄氏度,气压值102596Pa,海拔高度107m(高度为估算值)。
释放bmp085模块
模块引用完毕之后,请及时释放bmp85所占用的内存,释放方法为:
b = nil --此处b因为用户定义的变量
bmp085 = nil
package.loaded["bmp085"] = nil
释放之前和释放之后的内存对比: