diff --git a/README.md b/README.md
index 1f32c6e6..d417e2d2 100644
--- a/README.md
+++ b/README.md
@@ -1,293 +1,1563 @@
-nodeMcu API说明
-=======
-version 0.1 2014-10-11
- up
-flash 错误
-----
- 注意:有些模块在烧写之后启动,串口输出 ERROR in flash_read: r=。。。
- 这是因为模块原来的flash内部没有擦除。
- 可使用blank.bin(4k),
- 重复烧入起始地址0x47000, 0x48000, 0x49000, 0x4a000扇区.
- 或者生成一个512k大小的blank512k.bin, 内容为全0xFF,从0x00000开始烧入。
- 烧入之后可以正常运行。
+# **nodeMcu API Instruction** #
+ version 0.1 2014-10-11
+ change log:
+ 2014-11-5
+ delete log operation api from node module
+ add log module
+ modify wifi module api
+ modify node.key long_press and short_press default function
+ key is triged only when key is released
+
+# Summary
+- Easy to access wireless router
+- Based on Lua 5.1.4,Developer are supposed to have experience in Lua Program language.
+- Try to use Event-Drive programming modal.
+- In-side timer,pwm,i2c,net,gpio,wifi module.
+- Serial Port BaudRate:74880
+- Re-indexing the 8266 pin,use the index to program gpio,i2c,pwm.
+- Index vs Pin-number Table:
+
+
+
+ IO index | ESP8266 pin | IO index | ESP8266 pin |
+
+
+ 0 | GPIO12 | 8 | GPIO0 |
+
+
+ 1 | GPIO13 | 9 | GPIO2 |
+
+
+ 2 | GPIO14 | 10 | GPIO4 |
+
+
+ 3 | GPIO15 | 11 | GPIO5 |
+
+
+ 4 | GPIO3 | | |
+
+
+ 5 | GPIO1 | | |
+
+
+ 6 | GPIO9 | | |
+
+
+ 7 | GPIO10 | |
+
+
+
+
+#Firmware Program
+Address
+: eagle.app.v6.flash.bin: 0x00000
+: eagle.app.v6.irom0text.bin: 0x10000
+: esp_init_data_default.bin: 0x7c000
+: blank.bin: 0x7e000
+
+
+#node module
+
+## node.restart()
+Description
+: module restart.
+
+Syntax
+: node.restart()
+
+Parameters
+: null
+
+Returns
+: null
+
+Example
+: ****
+```
+ node.restart();
+```
+
+See also
+: **-** []()
+
+
+## node.dsleep()
+Description
+: enter deep sleep mode for us micro seconds,restart when timed out
+ us: sleep time in micro second
+
+Syntax
+: node.dsleep(us)
+ Note: This function can only be used in the condition of connecting esp8266 PIN32(rst) and PIN8(XPD_DCDC) together.
+
+Parameters
+: us:sleep time in micro second
+
+Returns
+: null
+
+Example
+: ****
+```
+ node.dsleep(us);
+```
+
+See also
+: **-** []()
+
+
+## node.chipid()
+Description
+: return chip identifier
+
+Syntax
+: node.chipid()
+
+Parameters
+: null
+
+Returns
+: number:chip identifier
+
+Example
+: ****
+```
+ uint32 id = node.chipid();
+```
+
+See also
+: **-** []()
+
+
+## node.heap()
+Description
+: return the available RAM size in bytes
+
+Syntax
+: node.heap()
+
+Parameters
+: null
+
+Returns
+: number:system heap size left in bytes
+
+Example
+: ****
+```
+ uint32 heap_size = node.heap();
+```
+
+See also
+: **-** []()
+
+
+## node.key()
+Description
+: define button function.
+
+Syntax
+: node.key(type, function())
+
+Parameters
+: type: type is either string ”long” or ”short”. long: press the button for 3 seconds, short: press shortly(less than 3 seconds)
+ function(): user defined function for button. If null, cancling the user defined function, function are initialized to default.
+ Default function: long:change LED blinking rate, short:reset chip
+
+Returns
+: null
+
+Example
+:
+```
+ node.key(long, function(){print('hello world')})
+```
+
+See also
+: **-** []()
+
+
+## node.led()
+Description
+: setup the on/off time for led
+
+Syntax
+: node.key(type, function())
+
+Parameters
+: Low: LED off time, 0 for LED keeps on. Unit: milliseconds, time resolution: 80~100ms
+ High: LED off time. Unit: milliseconds, time resolution: 80~100ms
+
+Returns
+: null
+
+Example
+: ****
+```
+ //turn led on forever.
+ node.led(0,null);
+```
+
+See also
+: **-** []()
+
+#log module
+
+## log.format()
+Description
+: format flash for users.
+
+Syntax
+: log.format()
+
+Parameters
+: null
+
+Returns
+: null
+
+Example
+: ****
+```
+ //record log to init.lua. Call the file after system restart.
+ log.format()
+ log.startlog(“init.lua”, 1)
+ print(“hello world”)
+ log.stoplog()
+```
+
+See also
+: **-** [log.startlog()](#lg_startlog)
+: **-** [log.stoplog()](#lg_stoplog)
+
+
+## log.startlog()
+Description
+: start to log input
+
+Syntax
+: log.startlog(filename, noparse)
+
+Parameters
+: filename: log file, directories are not supported
+ noparse: 1 for lua VM doesn’t parse input, 0 for lua VM parse input
+
+Returns
+: null
+
+Example
+: ****
+```
+ //record log to init.lua. Call the file after system restart.
+ log.format()
+ log.startlog(“init.lua”, 1)
+ print(“hello world”)
+ log.stoplog()
+ //At this point, the content of init.lua is “print(“hello world”)”. When system restart, print(“hello world”) are excuted.
+```
+
+See also
+: **-** [log.format()](#lg_format)
+: **-** [log.stoplog()](#lg_stoplog)
+
+
+## log.stoplog()
+Description
+: stop log.
+
+Syntax
+: log.stoplog()
+
+Parameters
+: null
+
+Returns
+: null
+
+Example
+: ****
+```
+ //record log to init.lua. Call the file after system restart.
+ log.format()
+ log.startlog(“init.lua”, 1)
+ print(“hello world”)
+ log.stoplog()
+ //At this point, the content of init.lua is “print(“hello world”)”. When system restart, print(“hello world”) are excuted.
+```
+
+See also
+: **-** [log.format()](#lg_format)
+: **-** [log.startlog()](#lg_startlog)
+
+
+## log.open()
+Description
+: open the log file
+
+Syntax
+: log.open(filename)
+
+Parameters
+: filename: log file, directories are not supported
+
+Returns
+: null
+
+Example
+: ****
+```
+ //print the first line of 'init.lua'
+ log.open(“init.lua”)
+ print(log.readline())
+ log.close()
+```
+
+See also
+: **-** [log.close()](#lg_close)
+: **-** [log.readline()](#lg_readline)
+
+
+## log.close()
+Description
+: close the log file which opened before
+
+Syntax
+: log.close()
+
+Parameters
+: null
+
+Returns
+: null
+
+Example
+: ****
+```
+ //print the first line of 'init.lua'
+ log.open(“init.lua”)
+ print(log.readline())
+ log.close()
+```
+
+See also
+: **-** [log.open()](#lg_open)
+: **-** [log.readline()](#lg_readline)
+
+
+## log.readline()
+Description
+: read log file which is opened before line by line.
+
+Syntax
+: log.readline()
+
+Parameters
+: null
+
+Returns
+: log file content in string
+
+Example
+: ****
+```
+ //print the first line of 'init.lua'
+ log.open(“init.lua”)
+ print(log.readline())
+ log.close()
+```
+
+See also
+: **-** [log.open()](#lg_open)
+: **-** [log.close()](#lg_close)
-概述
-------
- 支持一键配置
+
+## log.list()
+Description
+: list all files.
+
+Syntax
+: log.list()
- 基于Lua 5.1.4,使用者需了解最简单的Lua语法。
+Parameters
+: null
- 采用事件驱动的编程模型。
+Returns
+: null
- 内置 timer,pwm,i2c,net,gpio,wifi module。
+Example
+: ****
+```
+ log.list();
+```
- 对模块的引脚进行编号;gpio,i2c,pwm等模块需要使用引脚编号进行索引。
+See also
+: **-** [log.format()](#lg_format)
-###目前的编号对应表格:
-||*h1*||*h2*||*h3*||*h4*||
-||1||2||3||4||
- IO索引编号 ESP8266实际IO IO索引编号 ESP8266实际IO
- 0 GPIO12 8 GPIO0
- 1 GPIO13 9 GPIO2
- 2 GPIO14 10 GPIO4
- 3 GPIO15 11 GPIO5
- 4 GPIO3
- 5 GPIO1
- 6 GPIO9
- 7 GPIO10
+#wifi module
+##CONSTANT
+: wifi.STATION, wifi.SOFTAP, wifi.STATIONAP
-###串口波特率
-9600
+
+## wifi.setmode(mode)
+Description
+: set wifi working mode.
-###固件烧写地址:
+Syntax
+: wifi.setmode(mode)
- eagle.app.v6.flash.bin:0x00000
- eagle.app.v6.irom0text.bin:0x10000
- esp_init_data_default.bin:0x7c000
- blank.bin:0x7e000
+Parameters
+: mode: value should be: wifi. STATION, wifi.SOFTAP or wifi.STATIONAP
- 第一次使用建议将blank512k.bin烧写在地址0x00000
+Returns
+: current mode after setup
-node module
-------
-node.restart()
+Example
+: ****
+```
+ wifi.setmode(wifi.STATION)
+```
- 描述:重新启动
+See also
+: **-** [wifi.getmode()](#wf_getmode)
-node.dsleep( us )
- 描述:深度睡眠 us 微秒,时间到之后将重新启动
- us:时间,单位微秒
+
+## wifi.getmode(mode)
+Description
+: get wifi working mode.
-node.chipid()
+Syntax
+: wifi.getmode()
- 描述:返回芯片id
- 返回:number
+Parameters
+: null
-node.heap()
+Returns
+: wifi working mode
- 描述:返回可用内存 in bytes
- 返回:系统heap剩余
+Example
+: ****
+```
+ print(wifi.getmode())
+```
-node.format()
+See also
+: **-** [wifi.setmode()](#wf_setmode)
- 描述:格式化用户flash区
-node.startlog( filename, noparse)
+
+## wifi.startsmart()
+Description
+: starts to auto configuration,if success set up ssid and pwd automatically .
- 描述:开始记录输入
- filename:log所保存的文件名,不支持目录
- noparse:1表示lua虚拟机不对输入进行解析,0表示lua虚拟机对输入进行解析
+Syntax
+: wifi.startsmart(channel, function succeed_callback())
-node.stoplog()
+Parameters
+: channel: 1~13,startup channel for searching, if null, default to 6. 20 seconds for each channel.
+ succeed_callback: callback function for success configuration, which is called after getting the password and the connection to AP.
- 描述:结束log
+Returns
+: null
-例子:录制log到init.lua文件,可以在系统启动之后自动调用该文件。
+Example
+: ****
+```
+ wifi.startsmart(6, cb())
+```
- node.format()
- node.startlog("init.lua", 1)
- print("hello world")
- node.stoplog()
+See also
+: **-** [wifi.stopsmart()](#wf_stopsmart)
-此时,文件init.lua内部将含有内容,重启之后,系统执行print("hello world")
-node.readlog( filename)
+
+## wifi.stopsmart()
+Description
+: stop the configuring process.
- 描述:读取文件
- filename:log文件名,不支持目录
- 返回:读取的内容,字符串形式
+Syntax
+: wifi.stopsmart()
-node.list()
+Parameters
+: null
- 描述:返回所有文件
- 返回:一个包含 <文件名:文件大小> pair 的map
+Returns
+: null
-wifi module
------------
-[up](#upupup)
+Example
+: ****
+```
+ wifi.stopsmart()
+```
-常量:wifi.STATION, wifi.SOFTAP, wifi.STATIONAP
+See also
+: **-** [wifi.startsmart()](#wf_startsmart)
-wifi.setmode(mode)
- 描述:设置wifi的工作模式
- mode:取值:wifi.STATION, wifi.SOFTAP或wifi.STATIONAP
- 返回设置之后的当前mode
+#wifi.sta module
-wifi.getmode()
+
+## wifi.sta.config()
+Description
+: set ssid and password in station mode.
- 描述:获取wifi的工作模式
- 返回:wifi.STATION, wifi.SOFTAP或wifi.STATIONAP
+Syntax
+: wifi.sta.config(ssid, password)
-wifi.startconfig( channel, function succeed_callback )
+Parameters
+: ssid: string which is less than 32 bytes.
+ password: string which is less than 64 bytes.
- 描述:开始智能配置,若成功自动设置ssid和pwd并退出
- channel:1~13,起始搜索信道。若不指定,默认为6,每个信道搜索20秒
- succeed_callback:配置成功后的回调函数,将在获取密码正确并连接上ap之后调用
-wifi.stopconfig()
+Returns
+: null
- 描述:中断智能配置
+Example
+: ****
+```
+ wifi.sta.config("myssid","mypassword")
+```
-wifi.station module
------------------
-wifi.station.setconfig(ssid, password)
+See also
+: **-** [wifi.sta.connect()](#ws_connect)
- 描述:设置station模式下的ssid和password
- ssid:字符串形式,长度小于32
- password:字符串形式,长度小于64
+: **-** [wifi.sta.disconnect()](#ws_disconnect)
-wifi.station.connect()
- 描述:station模式下连接至ap
+
+## wifi.sta.connect()
+Description
+: connect to AP in station mode.
-wifi.station.disconnect()
+Syntax
+: wifi.sta.connect()
- 描述:station模式下断开与ap的连接
+Parameters
+: null
-wifi.station.autoconnect(auto)
- 描述:station模式下设置自动连接至ap
- auto:0表示设置为不自动连,1表示设置为自动连接
+Returns
+: null
-wifi.station.getip()
+Example
+: ****
+```
+ wifi.sta.connect()
+```
- 描述:station模式下获取ip
- 返回:字符串形式的ip,如"192.168.0.2"
+See also
+: **-** [wifi.sta.disconnect()](#ws_disconnect)
-wifi.station.getmac()
+: **-** [wifi.sta.config()](#ws_config)
- 描述:station模式下获取mac
- 返回:字符串形式的mac,如"18-33-44-FE-55-BB"
-wifi.ap module
----------------
-wifi.ap.setconfig(cfg)
+
+## wifi.sta.disconnect()
+Description
+: disconnect from AP in station mode.
- 描述:设置station模式下的ssid和password
- cfg:设置需要的map
+Syntax
+: wifi.sta.disconnect()
-例子:
+Parameters
+: null
- cfg={}
- cfg.ssid="myssid"
- cfg.pwd="mypwd"
- wifi.ap.setconfig(cfg)
-wifi.ap.getip()
+Returns
+: null
- 描述:ap模式下获取ip
- 返回:字符串形式的ip,如"192.168.0.2"
+Example
+: ****
+```
+ wifi.sta.disconnect()
+```
-wifi.ap.getmac()
+See also
+: **-** [wifi.sta..config()](#ws_config)
- 描述:ap模式下获取mac
- 返回:字符串形式的mac,如"1A-33-44-FE-55-BB"
+: **-** [wifi.sta.connect()](#ws_connect)
-gpio module
------------
-常量:gpio.OUTPUT, gpio.INPUT, gpio.HIGH, gpio.LOW
-gpio.mode( pin, mode)
+
+## wifi.sta.autoconnect()
+Description
+: auto connect to AP in station mode.
- 描述:设置对应pin的输入输出模式,将该pin初始化为gpio模式。
- pin:0~11,IO索引编号
- mode:gpio.OUTPUT或者gpio.INPUT
+Syntax
+: wifi.sta.autoconnect(auto)
-gpio.read(pin)
+Parameters
+: auto: 0 for disable auto connecting. 1 for enable auto connecting
- 描述:读取对应pin的值
- pin:0~11,IO索引编号
- 返回:0表示低,1表示高
-gpio.write(pin, level)
+Returns
+: null
- 描述:设置对应pin的值
- pin:0~11,IO索引编号
- level:gpio.HIGH或者gpio.LOW
+Example
+: ****
+```
+ wifi.sta.autoconnect()
+```
-例子:
+See also
+: **-** [wifi.sta..config()](#ws_config)
- pin=1
- gpio.mode(pin, gpio.OUTPUT)
- gpio.write(pin, gpio.HIGH)
+: **-** [wifi.sta.connect()](#ws_connect)
-将索引1的pin设置为GPIO模式,并设置为高电平。
+: **-** [wifi.sta.disconnect()](#ws_disconnect)
-net module
----------------
-常量:net.TCP, net.UDP
-net.createServer(type)
+
+## wifi.sta.getip()
+Description
+: get ip address in station mode.
- 描述:建立一个服务器
- type:net.TCP或 net.UDP
- 返回:net.server子模块
+Syntax
+: wifi.sta.getip()
-net.createConnection(type)
+Parameters
+: null
- 描述:建立一个客户端
- type:net.TCP或 net.UDP
- 返回:net.socket子模块
-net.server module
--------------
-listen(port,[ip],function(net.socket))
+Returns
+: ip address in string, for example:"192.168.0.111"
- 描述:监听某端口
- port:端口号
- ip:可忽略,ip字符串
- function(net.socket): 回调函数,当有连接建立的时候,作为参数传给回调函数。
+Example
+: ****
+```
+ //print current ip
+ print(wifi.sta.getip())
+```
-例子:
+See also
+: **-** [wifi.sta..getmac()](#ws_getmac)
- sv=net.createServer(net.TCP, false)
- sv:listen(80,function(c)
- c:on("receive", function(sck, pl) print(pl) end)
- c:send("hello world")
- end)
-close()
+
+## wifi.sta.getmac()
+Description
+: get mac address in station mode.
- 描述:关闭服务器
+Syntax
+: wifi.sta.getmac()
-net.socket module
--------
-connect(port, ip)
+Parameters
+: null
- 描述:连接到某ip和端口
- port:端口号
- ip:ip字符串
-send( string, function(sent) )
+Returns
+: mac address in string, for example:"18-33-44-FE-55-BB"
- 描述:向连接发送数据
- string:需要发送的数据字符串
+Example
+: ****
+```
+ //print current mac address
+ print(wifi.sta.getmac())
+```
-on(event, function cb())
+See also
+: **-** [wifi.sta..getip()](#ws_getip)
- 描述:注册事件的回调函数
- event:字符串
- 可为:"connection","reconnection","disconnection","receive","sent"
- function cb(net.socket, [string]):回调函数。第一个参数为socket连接。
- 若event为"receive", 第二个参数为接收到数据,字符串形式。
-例子:
+#wifi.ap module
- sk=net.createConnection(net.TCP, false)
- sk:on("receive", function(sck, pl) print(pl) end )
- sk:connect(80,"115.239.210.27")
- sk:send("GET / HTTP/1.1\r\nHost: 115.239.210.27\r\n
- Connection: keep-alive\r\nAccept: */*\r\n\r\n")
+
+## wifi.ap.config()
+Description
+: set ssid and password in ap mode.
-close()
+Syntax
+: wifi.ap.config(cfg)
- 描述:关闭socket
+Parameters
+: cfg: lua table for setup ap.
+: Example:
+```
+ cfg={}
+ cfg.ssid="myssid"
+ cfg.pwd="mypwd"
+ wifi.ap.setconfig(cfg)
+```
-dns(domain, function cb(net.socket, ip) )
+Returns
+: null
+
+Example
+: ****
+```
+ wifi.ap.config(ssid, 'password')
+```
+
+See also
+: <>
+
+
+## wifi.ap.getip()
+Description
+: get ip in ap mode.
+
+Syntax
+: wifi.ap.getip()
+
+Parameters
+: null
+
+Returns
+: ip address in string, for example:"192.168.0.111"
+
+Example
+: ****
+```
+ wifi.ap.getip()
+```
+
+See also
+: **-** [wifi.ap..getmac()](#wa_getmac)
+
+
+
+## wifi.ap.getmac()
+Description
+: get mac address in ap mode.
+
+Syntax
+: wifi.ap.getmac()
+
+Parameters
+: null
+
+Returns
+: mac address in string, for example:"1A-33-44-FE-55-BB"
+
+Example
+: ****
+```
+ wifi.ap.getmac()
+```
+
+See also
+: **-** [wifi.ap.getip()](#wa_getip)
+
+
+#timer module
+
+## tmr.delay()
+Description
+: delay us micro seconds.
+
+Syntax
+: tmr.dealy(us)
+
+Parameters
+: us: delay time in micro second
+
+Returns
+: null
+
+Example
+: ****
+```
+ //delay 100us
+ tmr.delay(100)
+```
+
+See also
+: **-** [tmr.now()](#tm_now)
+
+
+
+## tmr.now()
+Description
+: return the current value of system counter: uint32, loopback, us.
+
+Syntax
+: tmr.now()
+
+Parameters
+: null
+
+Returns
+: uint32: value of counter
+
+Example
+: ****
+```
+ //print current value of counter
+ print(tmr.now())
+```
+
+See also
+: **-** [tmr.delay()](#tm_delay)
+
+
+
+## tmr.alarm()
+Description
+: alarm time.
+
+Syntax
+: tmr.alarm(interval, repeat, function do())
+
+Parameters
+: Interval: alarm time, unit: millisecond;
+ repeat: 0 for one time alarm, 1 for repeat;
+ function do(): callback function for alarm timed out.
+
+Returns
+: null
+
+Example
+: ****
+```
+ //print "hello world" every 1000ms
+ tmr.alarm(1000, 1, function() print(“hello world”) end )
+```
+
+See also
+: **-** [tmr.now()](#tm_now)
+
+
+
+## tmr.stop()
+Description
+: stop alarm.
+: Note: only one alarm is allowed, the previous one would be replaced if tmr.alarm() again before tmr.stop().
+
+Syntax
+: tmr.stop()
+
+Parameters
+: null.
+
+Returns
+: null
+
+Example
+: ****
+```
+ //print "hello world" every 1000ms
+ tmr.alarm(1000, 1, function() print(“hello world”) end )
+
+ //something else
+
+ //stop alarm
+ tmr.stop()
+```
+
+See also
+: **-** [tmr.now()](#tm_now)
+
+
+#GPIO module
+##CONSTANT
+: gpio.OUTPUT, gpio.INPUT, gpio.INT, gpio.HIGH, gpio.LOW
+
+
+
+## gpio.mode()
+Description
+: initialize pin to GPIO mode, set the pin in/out mode.
+
+Syntax
+: gpio.mode(pin, mode)
+
+Parameters
+: pin: 0~11,IO index
+ mode: gpio.OUTPUT or gpio.INPUT, or gpio.INT(interrupt mode)
+
+Returns
+: null
+
+Example
+: ****
+```
+ //set gpio 0 as output.
+ gpio.mode(0, gpio.OUTPUT)
+
+```
+
+See also
+: **-** [gpio.read()](#io_read)
+
+
+
+## gpio.read()
+Description
+: read pin value.
+
+Syntax
+: gpio.read(pin)
+
+Parameters
+: pin: 0~11,IO index
+
+Returns
+: number:0 for low, 1 for high
+
+Example
+: ****
+```
+ //read value of gpio 0.
+ gpio.read(0)
+```
+
+See also
+: **-** [gpio.mode()](#io_mode)
+
+
+
+## gpio.write()
+Description
+: set pin value.
+
+Syntax
+: gpio.write(pin)
+
+Parameters
+: pin: 0~11,IO index
+: level: gpio.HIGH or gpio.LOW
+
+Returns
+: null
+
+Example
+: ****
+```
+ //set pin index 1 to GPIO mode, and set the pin to high.
+ pin=1
+ gpio.mode(pin, gpio.OUTPUT)
+ gpio.write(pin, gpio.HIGH)
+```
+
+See also
+: **-** [gpio.mode()](#io_mode)
+
+: **-** [gpio.read()](#io_read)
+
+
+
+## gpio.trig()
+Description
+: set the interrupt callback function for pin.
+
+Syntax
+: gpio.trig(pin, type, function(level))
+
+Parameters
+: pin: 0~11,IO index
+ type: ”up”, “down”, “both”, “low”, “high”, which represent rising edge, falling edge, both edge, low level, high level trig mode separately.
+ function(level): callback function when triggered. The gpio level is the param.
+ Use previous callback function if undefined here.
+
+Returns
+: null
+
+Example
+: ****
+```
+ //use pin 0 as the input pulse width counter
+ pulse0 = 0
+ du = 0
+ gpio.mode(0,gpio.INT)
+ function pin0cb(level)
+ du = tmr.now() – pulse0
+ print(du)
+ pulse0 = tmr.now()
+ if level == 1 then gpio.trig(0, "down ") else gpio.trig(0, "up ") end
+ end
+ gpio.trig(0, "down ",pin0cb)
+
+```
+
+See also
+: **-** [gpio.mode()](#io_mode)
+
+: **-** [gpio.write()](#io_write)
+
+
+#PWM module
+
+## pwm.setup()
+Description
+: set pin to PWM mode. Only 3 pins can be set to PWM mode at the most.
+
+Syntax
+: pwm.setup(pin, clock, duty)
+
+Parameters
+: pin: 0~11,IO index
+ clock: 1~500,pwm frequency
+ duty: 0~100,pwm duty cycle in percentage
+
+Returns
+: null
+
+Example
+: ****
+```
+ //set pin index 0 as pwm output, frequency is 100Hz, duty cycle is 50-50..
+ pwm.setup(0, 100, 50)
+```
+
+See also
+: **-** [pwm.start()](#pw_start)
+
+
+
+## pwm.close()
+Description
+: quit PWM mode for specified pin.
+
+Syntax
+: pwm.close(pin)
+
+Parameters
+: pin: 0~11,IO index
+
+Returns
+: null
+
+Example
+: ****
+```
+ pwm.close(0)
+```
+
+See also
+: **-** [pwm.start()](#pw_start)
+
+
+
+## pwm.start()
+Description
+: pwm starts, you can detect the waveform on the gpio.
+
+Syntax
+: pwm.start(pin)
+
+Parameters
+: pin: 0~11,IO index
+
+Returns
+: null
+
+Example
+: ****
+```
+ pwm.start(0)
+```
+
+See also
+: **-** [pwm.stop()](#pw_stop)
+
+
+
+## pwm.stop()
+Description
+: pause the output of PWM waveform.
+
+Syntax
+: pwm.stop(pin)
+
+Parameters
+: pin: 0~11,IO index
+
+Returns
+: null
+
+Example
+: ****
+```
+ pwm.stop(0)
+```
+
+See also
+: **-** [pwm.start()](#pw_start)
+
+
+
+## pwm.setclock()
+Description
+: set pwm frequency for pin.
+: Note: setup pwm frequency will synchronously change others if there are any. Only one PWM frequency can be allowed for the system.
+
+Syntax
+: pwm.setclock(pin, clock)
+
+Parameters
+: pin: 0~11,IO index.
+ clock: 1~500, pwm frequency.
+
+Returns
+: null
+
+Example
+: ****
+```
+ pwm.setclock(0, 100)
+```
+
+See also
+: **-** [pwm.getclock()](#pw_getclock)
+
+
+
+## pwm.getclock()
+Description
+: get pwm frequency of pin.
+
+Syntax
+: pwm.getclock(pin)
+
+Parameters
+: pin: 0~11,IO index.
+
+Returns
+: number:pwm frequency of pin
+
+Example
+: ****
+```
+ print(pwm.getclock(0))
+```
+
+See also
+: **-** [pwm.setclock()](#pw_setclock)
+
+
+
+## pwm.setduty()
+Description
+: set duty clycle for pin.
+
+Syntax
+: pwm.setduty(pin, duty)
+
+Parameters
+: pin: 0~11,IO index
+: duty: 0~100,pwm duty cycle in percentage
+
+Returns
+: null
+
+Example
+: ****
+```
+ pwm.setduty(0, 50)
+```
+
+See also
+: **-** [pwm.getduty()](#pw_getduty)
+
+
+
+## pwm.getduty()
+Description
+: get duty clycle for pin.
+
+Syntax
+: pwm.getduty(pin)
+
+Parameters
+: pin: 0~11,IO index
+
+Returns
+: null
+
+Example
+: ****
+```
+ //D0 is connected to green led
+ //D1 is connected to blue led
+ //D2 is connected to red led
+ pwm.setup(0,500,50)
+ pwm.setup(1,500,50)
+ pwm.setup(2,500,50)
+ pwm.start(0)
+ pwm.start(1)
+ pwm.start(2)
+ function led(r,g,b)
+ pwm.setduty(0,g)
+ pwm.setduty(1,b)
+ pwm.setduty(2,r)
+ end
+ led(50,0,0) // set led to red
+ led(0,0,50) //set led to blue.
+
+```
+
+See also
+: **-** [pwm.setduty()](#pw_setduty)
+
+
+#net module
+##CONSTANT
+: net.TCP, net.UDP
+
+
+## net.createServer()
+Description
+: create a server.
+
+Syntax
+: net.createServer(type, secure)
+
+Parameters
+: type: net.TCP or net.UDP
+ secure: true or false, true for safe link, false for ordinary link
+
+Returns
+: net.server sub module
+
+Example
+: ****
+```
+ net.createServer(net.TCP, true)
+```
+
+See also
+: **-** [net.createConnection()](#nt_createConnection)
+
+
+
+## net.createConnection()
+Description
+: create a client.
+
+Syntax
+: net.createConnection(type, secure)
+
+Parameters
+: type: net.TCP or net.UDP
+ secure: true or false, true for safe link, false for ordinary link
+
+Returns
+: net.server sub module
+
+Example
+: ****
+```
+ net.createConnection(net.UDP, false)
+```
+
+See also
+: **-** [net.createServer()](#nt_createServer)
+
+
+#net.server module
+
+## listen()
+Description
+: listen on port from [ip] address.
+
+Syntax
+: net.server.listen(port,[ip],function(net.socket))
+
+Parameters
+: port: port number
+ ip:ip address string, can be omitted
+ function(net.socket): callback function, pass to Caller function as param if a connection is created successfully
+
+Returns
+: null
+
+Example
+: ****
+```
+ //create a server
+ sv=net.createServer(net.TCP, false)
+ //server listen on 80, if data received, print data to console, and send "hello world" to remote.
+ sv:listen(80,function(c)
+ c:on("receive", function(sck, pl) print(pl) end)
+ c:send("hello world")
+ end)
+```
+
+See also
+: **-** [net.createServer()](#nt_createServer)
+
+
+
+## close()
+Description
+: close server.
+
+Syntax
+: net.server.close()
+
+Parameters
+: null
+
+Returns
+: null
+
+Example
+: ****
+```
+ //create a server
+ sv=net.createServer(net.TCP, false)
+ //close server
+ sv:close()
+```
+
+See also
+: **-** [net.createServer()](#nt_createServer)
+
+
+#net.socket module
+
+## connect()
+Description
+: connect to remote.
+
+Syntax
+: connect(port, ip)
+
+Parameters
+: port: port number
+ ip: ip address in string
+
+Returns
+: null
+
+See also
+: **-** [net.socket:on()](#nk_on)
+
+
+
+## send()
+Description
+: send data to remote via connection.
+
+Syntax
+: send(string, function(sent))
+
+Parameters
+: string: data in string which will be sent to remote
+ function(sent): callback function for sending string
+
+Returns
+: null
+
+See also
+: **-** [net.socket:on()](#nk_on)
+
+
+
+## on()
+Description
+: register callback function for event.
+
+Syntax
+: on(event, function cb())
+
+Parameters
+: event: string, which can be: "connection","reconnection","disconnection","receive","sent"
+ function cb(net.socket, [string]): callback function. The first param is the socket.
+ If event is”receive”, the second param is received data in string.
+
+Returns
+: null
+
+Example
+: ****
+```
+ sk=net.createConnection(net.TCP, false)
+ sk:on("receive", function(sck, c) print(c) end )
+ sk:connect(80,"192.168.0.66")
+ sk:send("GET / HTTP/1.1\r\nHost: 192.168.0.66\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n")
+```
+
+See also
+: **-** [net.createServer()](#nt_createServer)
+
+
+
+## close()
+Description
+: close socket.
+
+Syntax
+: close()
+
+Parameters
+: null
+
+Returns
+: null
+
+See also
+: **-** [net.createServer()](#nt_createServer)
+
+
+
+## dns()
+Description
+: get domain ip
+
+Syntax
+: dns(domain, function(net.socket, ip))
+
+Parameters
+: domain: domain name.
+ function (net.socket, ip): callback function. The first param is the socket, the second param is the ip address in string.
+
+Returns
+: null
+
+See also
+: **-** [net.createServer()](#nt_createServer)
+
+
+#i2c module
+##CONSTANT
+: i2c.SLOW, i2c.TRANSMITTER, i2c. RECEIVER. FAST(400k)is not supported for now.
+
+
+## i2c.setup()
+Description
+: initialize i2c.
+
+Syntax
+: i2c.setup(id, pinSDA, pinSCL, speed)
+
+Parameters
+: id = 0
+ pinSDA: 0~11,IO index
+ pinSCL: 0~11,IO index
+ speed: i2c.SLOW
+
+Returns
+: null
+
+See also
+: **-** [i2c.read()](#ic_read)
+
+
+
+## i2c.start()
+Description
+: start i2c transporting.
+
+Syntax
+: i2c.start(id)
+
+Parameters
+: id = 0
+
+Returns
+: null
+
+See also
+: **-** [i2c.read()](#ic_read)
+
+
+
+## i2c.stop()
+Description
+: stop i2c transporting.
+
+Syntax
+: i2c.stop(id)
+
+Parameters
+: id = 0
+
+Returns
+: null
+
+See also
+: **-** [i2c.read()](#ic_read)
+
+
+
+## i2c.address()
+Description
+: setup i2c address and read/write mode.
+
+Syntax
+: i2c.address(id, device_addr, direction)
+
+Parameters
+: id=0
+ device_addr: device address.
+ direction: i2c.TRANSMITTER for writing mode , i2c. RECEIVER for reading mode
+
+Returns
+: null
+
+See also
+: **-** [i2c.read()](#ic_read)
+
+
+## i2c.write()
+Description
+: write data to i2c, data can be multi numbers, string or lua table.
+
+Syntax
+: i2c.write(id, data1, data2,...)
+
+Parameters
+: id=0
+ data: data can be numbers, string or lua table.
+
+Returns
+: null
+
+Example
+: ****
+```
+ i2c.write(0, "hello", "world")
+```
+
+See also
+: **-** [i2c.read()](#ic_read)
+
+
+
+## i2c.read()
+Description
+: read data for len bytes.
+
+Syntax
+: i2c.read(id, len)
+
+Parameters
+: id=0
+ len: data length
+
+Returns
+: string:data received.
+
+Example
+: ****
+```
+ id=0
+ sda=1
+ scl=0
+
+ //initialize i2c, set pin1 as sda, set pin0 as scl
+ i2c.setup(id,sda,scl,i2c.SLOW)
+
+ //user defined function: read from reg_addr content of dev_addr
+ 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)
+ c=i2c.read(id,1)
+ i2c.stop(id)
+ return c
+ end
+
+ //get content of register 0xAA of device 0x77
+ reg = read_reg(0x77, 0xAA)
+ pirnt(string.byte(reg))
+
+```
+
+See also
+: **-** [i2c.write()](#ic_write)
- 描述:获取domain的ip
- domain:字符串
- function cb(net.socket, ip):回调函数。
- 第一个参数为socket连接本身, 第二个为获取的ip, 字符串形式。
diff --git a/README1.md b/README1.md
new file mode 100644
index 00000000..649d7415
--- /dev/null
+++ b/README1.md
@@ -0,0 +1,292 @@
+nodeMcu API说明
+=======
+version 0.1 2014-10-11
+ up
+flash 错误
+----
+ 注意:有些模块在烧写之后启动,串口输出 ERROR in flash_read: r=。。。
+ 这是因为模块原来的flash内部没有擦除。
+ 可使用blank.bin(4k),
+ 重复烧入起始地址0x47000, 0x48000, 0x49000, 0x4a000扇区.
+ 或者生成一个512k大小的blank512k.bin, 内容为全0xFF,从0x00000开始烧入。
+ 烧入之后可以正常运行。
+
+概述
+------
+ 支持一键配置
+
+ 基于Lua 5.1.4,使用者需了解最简单的Lua语法。
+
+ 采用事件驱动的编程模型。
+
+ 内置 timer,pwm,i2c,net,gpio,wifi module。
+
+ 对模块的引脚进行编号;gpio,i2c,pwm等模块需要使用引脚编号进行索引。
+
+###目前的编号对应表格:
+
+ IO索引编号 ESP8266实际IO IO索引编号 ESP8266实际IO
+ 0 GPIO12 8 GPIO0
+ 1 GPIO13 9 GPIO2
+ 2 GPIO14 10 GPIO4
+ 3 GPIO15 11 GPIO5
+ 4 GPIO3
+ 5 GPIO1
+ 6 GPIO9
+ 7 GPIO10
+
+###串口波特率
+9600
+
+###固件烧写地址:
+
+ eagle.app.v6.flash.bin:0x00000
+ eagle.app.v6.irom0text.bin:0x10000
+ esp_init_data_default.bin:0x7c000
+ blank.bin:0x7e000
+
+ 第一次使用建议将blank512k.bin烧写在地址0x00000
+
+node module
+------
+node.restart()
+
+ 描述:重新启动
+
+node.dsleep( us )
+
+ 描述:深度睡眠 us 微秒,时间到之后将重新启动
+ us:时间,单位微秒
+
+node.chipid()
+
+ 描述:返回芯片id
+ 返回:number
+
+node.heap()
+
+ 描述:返回可用内存 in bytes
+ 返回:系统heap剩余
+
+node.format()
+
+ 描述:格式化用户flash区
+
+node.startlog( filename, noparse)
+
+ 描述:开始记录输入
+ filename:log所保存的文件名,不支持目录
+ noparse:1表示lua虚拟机不对输入进行解析,0表示lua虚拟机对输入进行解析
+
+node.stoplog()
+
+ 描述:结束log
+
+例子:录制log到init.lua文件,可以在系统启动之后自动调用该文件。
+
+ node.format()
+ node.startlog("init.lua", 1)
+ print("hello world")
+ node.stoplog()
+
+此时,文件init.lua内部将含有内容,重启之后,系统执行print("hello world")
+
+node.readlog( filename)
+
+ 描述:读取文件
+ filename:log文件名,不支持目录
+ 返回:读取的内容,字符串形式
+
+node.list()
+
+ 描述:返回所有文件
+ 返回:一个包含 <文件名:文件大小> pair 的map
+
+wifi module
+-----------
+[up](#upupup)
+
+常量:wifi.STATION, wifi.SOFTAP, wifi.STATIONAP
+
+wifi.setmode(mode)
+
+ 描述:设置wifi的工作模式
+ mode:取值:wifi.STATION, wifi.SOFTAP或wifi.STATIONAP
+ 返回设置之后的当前mode
+
+wifi.getmode()
+
+ 描述:获取wifi的工作模式
+ 返回:wifi.STATION, wifi.SOFTAP或wifi.STATIONAP
+
+wifi.startconfig( channel, function succeed_callback )
+
+ 描述:开始智能配置,若成功自动设置ssid和pwd并退出
+ channel:1~13,起始搜索信道。若不指定,默认为6,每个信道搜索20秒
+ succeed_callback:配置成功后的回调函数,将在获取密码正确并连接上ap之后调用
+
+wifi.stopconfig()
+
+ 描述:中断智能配置
+
+wifi.station module
+-----------------
+wifi.station.setconfig(ssid, password)
+
+ 描述:设置station模式下的ssid和password
+ ssid:字符串形式,长度小于32
+ password:字符串形式,长度小于64
+
+wifi.station.connect()
+
+ 描述:station模式下连接至ap
+
+wifi.station.disconnect()
+
+ 描述:station模式下断开与ap的连接
+
+wifi.station.autoconnect(auto)
+
+ 描述:station模式下设置自动连接至ap
+ auto:0表示设置为不自动连,1表示设置为自动连接
+
+wifi.station.getip()
+
+ 描述:station模式下获取ip
+ 返回:字符串形式的ip,如"192.168.0.2"
+
+wifi.station.getmac()
+
+ 描述:station模式下获取mac
+ 返回:字符串形式的mac,如"18-33-44-FE-55-BB"
+
+wifi.ap module
+---------------
+wifi.ap.setconfig(cfg)
+
+ 描述:设置station模式下的ssid和password
+ cfg:设置需要的map
+
+例子:
+
+ cfg={}
+ cfg.ssid="myssid"
+ cfg.pwd="mypwd"
+ wifi.ap.setconfig(cfg)
+
+wifi.ap.getip()
+
+ 描述:ap模式下获取ip
+ 返回:字符串形式的ip,如"192.168.0.2"
+
+wifi.ap.getmac()
+
+ 描述:ap模式下获取mac
+ 返回:字符串形式的mac,如"1A-33-44-FE-55-BB"
+
+gpio module
+-----------
+常量:gpio.OUTPUT, gpio.INPUT, gpio.HIGH, gpio.LOW
+
+gpio.mode( pin, mode)
+
+ 描述:设置对应pin的输入输出模式,将该pin初始化为gpio模式。
+ pin:0~11,IO索引编号
+ mode:gpio.OUTPUT或者gpio.INPUT
+
+gpio.read(pin)
+
+ 描述:读取对应pin的值
+ pin:0~11,IO索引编号
+ 返回:0表示低,1表示高
+
+gpio.write(pin, level)
+
+ 描述:设置对应pin的值
+ pin:0~11,IO索引编号
+ level:gpio.HIGH或者gpio.LOW
+
+例子:
+
+ pin=1
+ gpio.mode(pin, gpio.OUTPUT)
+ gpio.write(pin, gpio.HIGH)
+
+将索引1的pin设置为GPIO模式,并设置为高电平。
+
+net module
+---------------
+常量:net.TCP, net.UDP
+
+net.createServer(type)
+
+ 描述:建立一个服务器
+ type:net.TCP或 net.UDP
+ 返回:net.server子模块
+
+net.createConnection(type)
+
+ 描述:建立一个客户端
+ type:net.TCP或 net.UDP
+ 返回:net.socket子模块
+
+net.server module
+-------------
+listen(port,[ip],function(net.socket))
+
+ 描述:监听某端口
+ port:端口号
+ ip:可忽略,ip字符串
+ function(net.socket): 回调函数,当有连接建立的时候,作为参数传给回调函数。
+
+例子:
+
+ sv=net.createServer(net.TCP, false)
+ sv:listen(80,function(c)
+ c:on("receive", function(sck, pl) print(pl) end)
+ c:send("hello world")
+ end)
+
+close()
+
+ 描述:关闭服务器
+
+net.socket module
+-------
+connect(port, ip)
+
+ 描述:连接到某ip和端口
+ port:端口号
+ ip:ip字符串
+
+send( string, function(sent) )
+
+ 描述:向连接发送数据
+ string:需要发送的数据字符串
+
+on(event, function cb())
+
+ 描述:注册事件的回调函数
+ event:字符串
+ 可为:"connection","reconnection","disconnection","receive","sent"
+ function cb(net.socket, [string]):回调函数。第一个参数为socket连接。
+ 若event为"receive", 第二个参数为接收到数据,字符串形式。
+
+例子:
+
+ sk=net.createConnection(net.TCP, false)
+ sk:on("receive", function(sck, pl) print(pl) end )
+ sk:connect(80,"115.239.210.27")
+ sk:send("GET / HTTP/1.1\r\nHost: 115.239.210.27\r\n
+ Connection: keep-alive\r\nAccept: */*\r\n\r\n")
+
+close()
+
+ 描述:关闭socket
+
+dns(domain, function cb(net.socket, ip) )
+
+ 描述:获取domain的ip
+ domain:字符串
+ function cb(net.socket, ip):回调函数。
+ 第一个参数为socket连接本身, 第二个为获取的ip, 字符串形式。