From 6f9c17a29e8acdd150a78b4fd824c4fe112593f6 Mon Sep 17 00:00:00 2001 From: funshine Date: Wed, 19 Nov 2014 23:15:50 +0800 Subject: [PATCH] add adc module, wifi.sta.getap() api, update doc --- 0.9.2/512k-flash/nodemcu_512k.bin | Bin 520192 -> 520192 bytes README.html | 233 ++---- README.md | 2 +- nodemcu_api_cn.html | 1074 +++++++++++++-------------- nodemcu_api_cn.md | 59 +- nodemcu_api_en.html | 1143 ++++++++++++++--------------- nodemcu_api_en.md | 56 +- 7 files changed, 1227 insertions(+), 1340 deletions(-) diff --git a/0.9.2/512k-flash/nodemcu_512k.bin b/0.9.2/512k-flash/nodemcu_512k.bin index 7baff22f9781603aab1fd4512ca4f5ff1f006562..89bf0c289fc3818a095cd810fe2bfdd76ebef4b4 100644 GIT binary patch delta 32439 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 diff --git a/README.html b/README.html index 957a28ec..a5f358eb 100644 --- a/README.html +++ b/README.html @@ -1014,74 +1014,9 @@ body .markdown-body page-break-after: avoid; } } -README

NodeMcu

+README

NodeMcu

A lua based firmware for wifi-soc esp8266

-

version 0.9.2 build 2014-11-18

+

version 0.9.2 build 2014-11-19

Change log

change log

变更日志

@@ -1131,106 +1066,98 @@ for most esp8266 modules, just pull GPIO0 down and restart.

braudrate:9600

Start play

Connect to your ap

-
    print(wifi.sta.getip())
-    --0.0.0.0
-    wifi.setmode(wifi.STATION)
-    wifi.sta.config("SSID","password")
-    print(wifi.sta.getip())
-    --192.168.18.110
-
- +
    print(wifi.sta.getip())
+    --0.0.0.0
+    wifi.setmode(wifi.STATION)
+    wifi.sta.config("SSID","password")
+    print(wifi.sta.getip())
+    --192.168.18.110
+

Manipulate hardware like a arduino

-
    pin = 1
-    gpio.mode(pin,gpio.OUTPUT)
-    gpio.write(pin,gpio.HIGH)
-    print(gpio.read(pin))
-
- +
    pin = 1
+    gpio.mode(pin,gpio.OUTPUT)
+    gpio.write(pin,gpio.HIGH)
+    print(gpio.read(pin))
+

Write network application in nodejs style

-
    -- A simple http client
-    conn=net.createConnection(net.TCP, false) 
-    conn:on("receive", function(conn, payload) print(c) end )
-    conn:connect(80,"115.239.210.27")
-    conn:send("GET / HTTP/1.1\r\nHost: www.baidu.com\r\n"
-        .."Connection: keep-alive\r\nAccept: */*\r\n\r\n")
-
- +
    -- A simple http client
+    conn=net.createConnection(net.TCP, false) 
+    conn:on("receive", function(conn, payload) print(c) end )
+    conn:connect(80,"115.239.210.27")
+    conn:send("GET / HTTP/1.1\r\nHost: www.baidu.com\r\n"
+        .."Connection: keep-alive\r\nAccept: */*\r\n\r\n")
+

Or a simple http server

-
    -- A simple http server
-    srv=net.createServer(net.TCP) 
-    srv:listen(80,function(conn) 
-      conn:on("receive",function(conn,payload) 
-        print(payload) 
-        conn:send("<h1> Hello, NodeMcu.</h1>")
-      end) 
-    end)
-
- +
    -- A simple http server
+    srv=net.createServer(net.TCP) 
+    srv:listen(80,function(conn) 
+      conn:on("receive",function(conn,payload) 
+        print(payload) 
+        conn:send("<h1> Hello, NodeMcu.</h1>")
+      end) 
+    end)
+

Do something shining

-
  function led(r,g,b) 
-    pwm.setduty(0,r) 
-    pwm.setduty(1,g) 
-    pwm.setduty(2,b) 
-  end
-  pwm.setup(0,500,50) 
-  pwm.setup(1,500,50) 
-  pwm.setup(2,500,50)
-  pwm.start(0) 
-  pwm.start(1) 
-  pwm.start(2)
-  led(50,0,0) -- red
-  led(0,0,50) -- blue
-
- +
  function led(r,g,b) 
+    pwm.setduty(0,r) 
+    pwm.setduty(1,g) 
+    pwm.setduty(2,b) 
+  end
+  pwm.setup(0,500,50) 
+  pwm.setup(1,500,50) 
+  pwm.setup(2,500,50)
+  pwm.start(0) 
+  pwm.start(1) 
+  pwm.start(2)
+  led(50,0,0) -- red
+  led(0,0,50) -- blue
+
-
  lighton=0
-  tmr.alarm(1000,1,function()
-    if lighton==0 then 
-      lighton=1 
-      led(50,50,50) 
-    else 
-      lighton=0 
-      led(0,0,0) 
-    end 
-  end)
-
- +
  lighton=0
+  tmr.alarm(1000,1,function()
+    if lighton==0 then 
+      lighton=1 
+      led(50,50,50) 
+    else 
+      lighton=0 
+      led(0,0,0) 
+    end 
+  end)
+

If you want to run something when system started

-
  --init.lua will be excuted
-  file.open("init.lua","w")
-  file.writeline([[print("Hello, do this at the beginning.")]])
-  file.close()
-  node.restart()  -- this will restart the module.
-
- +
  --init.lua will be excuted
+  file.open("init.lua","w")
+  file.writeline([[print("Hello, do this at the beginning.")]])
+  file.close()
+  node.restart()  -- this will restart the module.
+

With below code, you can telnet to your esp8266 now

-
    -- a simple telnet server
-    s=net.createServer(net.TCP) 
-    s:listen(2323,function(c) 
-       con_std = c 
-       function s_output(str) 
-          if(con_std~=nil) 
-             then con_std:send(str) 
-          end 
-       end 
-       node.output(s_output, 0)   -- re-direct output to function s_ouput.
-       c:on("receive",function(c,l) 
-          node.input(l)           -- works like pcall(loadstring(l)) but support multiple separate line
-       end) 
-       c:on("disconnection",function(c) 
-          con_std = nil 
-          node.output(nil)        -- un-regist the redirect output function, output goes to serial
-       end) 
-    end)
-
- +
    -- a simple telnet server
+    s=net.createServer(net.TCP) 
+    s:listen(2323,function(c) 
+       con_std = c 
+       function s_output(str) 
+          if(con_std~=nil) 
+             then con_std:send(str) 
+          end 
+       end 
+       node.output(s_output, 0)   -- re-direct output to function s_ouput.
+       c:on("receive",function(c,l) 
+          node.input(l)           -- works like pcall(loadstring(l)) but support multiple separate line
+       end) 
+       c:on("disconnection",function(c) 
+          con_std = nil 
+          node.output(nil)        -- un-regist the redirect output function, output goes to serial
+       end) 
+    end)
+

Check this out

Tencent QQ group: 309957875

diff --git a/README.md b/README.md index 0281a8d8..66b74d9e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # **NodeMcu** # ###A lua based firmware for wifi-soc esp8266 -version 0.9.2 build 2014-11-18 +version 0.9.2 build 2014-11-19 # Change log [change log](https://github.com/funshine/nodemcu-firmware/wiki/nodemcu_api_en#change_log)
[变更日志](https://github.com/funshine/nodemcu-firmware/wiki/nodemcu_api_cn#change_log) diff --git a/nodemcu_api_cn.html b/nodemcu_api_cn.html index 8e6f4d0a..dbeeb515 100644 --- a/nodemcu_api_cn.html +++ b/nodemcu_api_cn.html @@ -1014,76 +1014,14 @@ body .markdown-body page-break-after: avoid; } } -nodemcu_api_cn

nodeMcu API说明

+nodemcu_api_cn

nodeMcu API说明

English Version

-

版本 0.9.2 build 2014-11-18

+

版本 0.9.2 build 2014-11-19

变更日志:

+

2014-11-19

+增加adc模块,adc.read(0)读取adc的值。

+wifi模块增加wifi.sta.getap() 函数,用于获取ap列表。

2014-11-18

修正tcp服务器不能使用:close()函数关闭tcp连接的问题。

tcp服务器: 服务器将关闭30s内未使用的闲置的连接。(修正前为180s)

@@ -1166,9 +1104,8 @@ node模块中删除了log函数。

返回值

nil

示例

-
    node.restart();
-
- +
    node.restart();
+

参见

-

@@ -1184,9 +1121,8 @@ node模块中删除了log函数。

返回值

nil

示例

-
    node.dsleep(us);
-
- +
    node.dsleep(us);
+

参见

-

@@ -1201,9 +1137,8 @@ node模块中删除了log函数。

返回值

number:芯片ID

示例

-
    id = node.chipid();
-
- +
    id = node.chipid();
+

参见

-

@@ -1218,9 +1153,8 @@ node模块中删除了log函数。

返回值

number: 系统剩余内存字节数

示例

-
    heap_size = node.heap();
-
- +
    heap_size = node.heap();
+

参见

-

@@ -1237,9 +1171,8 @@ function(): 用户自定义的按键回调函数。 如果为nil, 则取消用

返回值

nil

示例

-
    node.key("long", function(){print('hello world')})
-
- +
    node.key("long", function(){print('hello world')})
+

参见

-

@@ -1255,10 +1188,9 @@ High: LED打开时间,单位:毫秒,时间分辨率:80~100ms

返回值

nil

示例

-
    -- LED常亮.
-    node.led(0);
-
- +
    -- LED常亮.
+    node.led(0);
+

参见

-

@@ -1274,10 +1206,9 @@ High: LED打开时间,单位:毫秒,时间分辨率:80~100ms

返回值

nil

示例

-
    -- 注意:该函数不支持在命令行中使用。
-    sk:on("receive", function(conn, payload) node.input(payload) end)
-
- +
    -- 注意:该函数不支持在命令行中使用。
+    sk:on("receive", function(conn, payload) node.input(payload) end)
+

参见

-

@@ -1293,14 +1224,13 @@ serial_debug: 1:将输出送至串口; 0:输出不送至串口

返回值

nil

示例

-
    function tonet(str)
-      sk:send(str)
-      -- print(str) 错误!!! 千万不要在此函数中再使用print函数
-      -- 因为这样会导致函数的嵌套调用!!
-    end
-    node.ouput(tonet, 1)  -- serial also get the lua output.
-
- +
    function tonet(str)
+      sk:send(str)
+      -- print(str) 错误!!! 千万不要在此函数中再使用print函数
+      -- 因为这样会导致函数的嵌套调用!!
+    end
+    node.ouput(tonet, 1)  -- serial also get the lua output.
+

参见

-

@@ -1316,10 +1246,9 @@ serial_debug: 1:将输出送至串口; 0:输出不送至串口

返回值

nil

示例

-
    -- 删除foo.lua文件
-    file.remove("foo.lua")
-
- +
    -- 删除foo.lua文件
+    file.remove("foo.lua")
+

参见

- file.open()

@@ -1342,12 +1271,11 @@ mode:

返回值

nil

示例

-
    -- 打开'init.lua',并打印文件的第一行。
-    file.open("init.lua", "r")
-    print(file.readline())
-    file.close()
-
- +
    -- 打开'init.lua',并打印文件的第一行。
+    file.open("init.lua", "r")
+    print(file.readline())
+    file.close()
+

参见

- file.close()

@@ -1363,12 +1291,11 @@ mode:

返回值

nil

示例

-
    -- 打开'init.lua',并打印文件的第一行,然后关闭文件。
-    file.open("init.lua", "r")
-    print(file.readline())
-    file.close()
-
- +
    -- 打开'init.lua',并打印文件的第一行,然后关闭文件。
+    file.open("init.lua", "r")
+    print(file.readline())
+    file.close()
+

参见

- file.open()

@@ -1385,12 +1312,11 @@ mode:

逐行返回文件内容。返回值末尾包含EOL(‘\n’)

如果读到EOF返回nil。

示例

-
    -- 打开'init.lua',读取并打印文件的第一行,然后关闭文件。
-    file.open("init.lua", "r")
-    print(file.readline())
-    file.close()
-
- +
    -- 打开'init.lua',读取并打印文件的第一行,然后关闭文件。
+    file.open("init.lua", "r")
+    print(file.readline())
+    file.close()
+

参见

- file.open()

@@ -1407,13 +1333,12 @@ mode:

true: 写入成功

nil: 写入失败

示例

-
    -- 以'a+'的模式打开'init.lua'
-    file.open("init.lua", "a+")
-    -- 将'foo bar'写到文件的末尾
-    file.writeline('foo bar')
-    file.close()
-
- +
    -- 以'a+'的模式打开'init.lua'
+    file.open("init.lua", "a+")
+    -- 将'foo bar'写到文件的末尾
+    file.writeline('foo bar')
+    file.close()
+

参见

- file.open()

@@ -1430,13 +1355,12 @@ nil: 写入失败

true: 写入成功

nil: 写入失败

示例

-
    -- 以'a+'的模式打开'init.lua'
-    file.open("init.lua", "a+")
-    -- 将'foo bar'写到文件的末尾
-    file.writeline('foo bar')
-    file.close()
-
- +
    -- 以'a+'的模式打开'init.lua'
+    file.open("init.lua", "a+")
+    -- 将'foo bar'写到文件的末尾
+    file.writeline('foo bar')
+    file.close()
+

参见

- file.open()

@@ -1452,14 +1376,13 @@ nil: 写入失败

返回值

nil

示例

-
    -- 以'a+'的模式打开'init.lua'
-    file.open("init.lua", "a+")
-    -- 将'foo bar'写到文件的末尾
-    file.write('foo bar')
-    file.flush()
-    file.close()
-
- +
    -- 以'a+'的模式打开'init.lua'
+    file.open("init.lua", "a+")
+    -- 将'foo bar'写到文件的末尾
+    file.write('foo bar')
+    file.flush()
+    file.close()
+

参见

- file.open()

@@ -1480,18 +1403,17 @@ offset: default 0

成功: 返回当前的文件读写位置

失败: 返回nil

示例

-
    -- 以'a+'的模式打开'init.lua'
-    file.open("init.lua", "a+")
-    -- 将'foo bar'写到文件的末尾
-    file.write('foo bar')
-    file.flush()
-    --将文件读写位置设置在文件开始
-    file.seek("set")
-    --读取并打印文件的第一行
-    print(file.readline())
-    file.close()
-
- +
    -- 以'a+'的模式打开'init.lua'
+    file.open("init.lua", "a+")
+    -- 将'foo bar'写到文件的末尾
+    file.write('foo bar')
+    file.flush()
+    --将文件读写位置设置在文件开始
+    file.seek("set")
+    --读取并打印文件的第一行
+    print(file.readline())
+    file.close()
+

参见

- file.open()

@@ -1507,12 +1429,11 @@ offset: default 0

返回值

返回包含{文件名:文件大小}的lua table

示例

-
    l = file.list();
-    for k,v in pairs(l) do
-      print("name:"..k..", size:"..v)
-    end
-
- +
    l = file.list();
+    for k,v in pairs(l) do
+      print("name:"..k..", size:"..v)
+    end
+

参见

- file.remove()

@@ -1530,9 +1451,8 @@ offset: default 0

返回值

返回设置之后的mode值

示例

-
    wifi.setmode(wifi.STATION)
-
- +
    wifi.setmode(wifi.STATION)
+

参见

- wifi.getmode()

@@ -1547,9 +1467,8 @@ offset: default 0

返回值

返回wifi的工作模式

示例

-
    print(wifi.getmode())
-
- +
    print(wifi.getmode())
+

参见

- wifi.setmode()

@@ -1565,9 +1484,8 @@ succeed_callback: 配置成功的回调函数,配置成功并连接至AP后调

返回值

nil

示例

-
    wifi.startsmart(6, cb())
-
- +
    wifi.startsmart(6, cb())
+

参见

- wifi.stopsmart()

@@ -1582,9 +1500,8 @@ succeed_callback: 配置成功的回调函数,配置成功并连接至AP后调

返回值

nil

示例

-
    wifi.stopsmart()
-
- +
    wifi.stopsmart()
+

参见

- wifi.startsmart()

@@ -1601,9 +1518,8 @@ password: 字符串,长度小于64字节。

返回值

nil

示例

-
    wifi.sta.config("myssid","mypassword")
-
- +
    wifi.sta.config("myssid","mypassword")
+

参见

- wifi.sta.connect()

@@ -1619,9 +1535,8 @@ password: 字符串,长度小于64字节。

返回值

nil

示例

-
    wifi.sta.connect()
-
- +
    wifi.sta.connect()
+

参见

- wifi.sta.disconnect()

@@ -1637,9 +1552,8 @@ password: 字符串,长度小于64字节。

返回值

nil

示例

-
    wifi.sta.disconnect()
-
- +
    wifi.sta.disconnect()
+

参见

- wifi.sta.config()

@@ -1655,9 +1569,8 @@ password: 字符串,长度小于64字节。

返回值

nil

示例

-
    wifi.sta.autoconnect()
-
- +
    wifi.sta.autoconnect()
+

参见

- wifi.sta.config()

@@ -1674,10 +1587,9 @@ password: 字符串,长度小于64字节。

返回值

ip地址字符串,如:”192.168.0.111”

示例

-
    -- print current ip
-    print(wifi.sta.getip())
-
- +
    -- print current ip
+    print(wifi.sta.getip())
+

参见

- wifi.sta.getmac()

@@ -1692,674 +1604,688 @@ password: 字符串,长度小于64字节。

返回值

mac地址字符串,如:”18-33-44-FE-55-BB”

示例

-
    -- 打印当前的mac地址
-    print(wifi.sta.getmac())
-
- +
    -- 打印当前的mac地址
+    print(wifi.sta.getmac())
+

参见

- wifi.sta.getip()

+

+

wifi.sta.getap()

+

描述

+

扫描并列出ap,结果以一个lua table为参数传递给回调函数。

+

语法

+

wifi.sta.getap(function(table))

+

参数

+

function(table): 当扫描结束时,调用此回调函数

+ 扫描结果是一个lua table,key为ap的ssid,value为其他信息,格式:authmode,rssi,bssid,channel

+

返回值

+

nil

+

示例

+
    -- print ap list
+    function listap(t)
+      for k,v in pairs(t) do
+        print(k.." : "..v)
+      end
+    end
+    wifi.sta.getap(listap)
+
+ +

参见

+

- wifi.sta.getip()

wifi.ap 子模块

wifi.ap.config()

-

描述

+

描述

设置ap模式下的ssid和password

-

语法

+

语法

wifi.ap.config(cfg)

-

参数

+

参数

cfg: 设置AP的lua table

-

示例:

-
     cfg={}
-     cfg.ssid="myssid"
-     cfg.pwd="mypwd"
-     wifi.ap.setconfig(cfg)
-
+

示例:

+
     cfg={}
+     cfg.ssid="myssid"
+     cfg.pwd="mypwd"
+     wifi.ap.setconfig(cfg)
+
- -

返回值

+

返回值

nil

-

示例

-
    wifi.ap.config(ssid, 'password')
-
+

示例

+
    wifi.ap.config(ssid, 'password')
+
- -

参见

+

参见

-

wifi.ap.getip()

-

描述

-

ap模式下获取ip

-

语法

-

wifi.ap.getip()

-

参数

-

nil

-

返回值

-

ip地址字符串,如:”192.168.0.111”

-

示例

-
    wifi.ap.getip()
-
- - -

参见

-

- wifi.ap.getmac()

-

-

wifi.ap.getmac()

描述

-

ap模式下获取mac地址。

+

ap模式下获取ip

语法

-

wifi.ap.getmac()

+

wifi.ap.getip()

参数

nil

返回值

-

mac地址字符串,如:”1A-33-44-FE-55-BB”

+

ip地址字符串,如:”192.168.0.111”

示例

-
    wifi.ap.getmac()
-
- +
    wifi.ap.getip()
+

参见

+

- wifi.ap.getmac()

+

+

wifi.ap.getmac()

+

描述

+

ap模式下获取mac地址。

+

语法

+

wifi.ap.getmac()

+

参数

+

nil

+

返回值

+

mac地址字符串,如:”1A-33-44-FE-55-BB”

+

示例

+
    wifi.ap.getmac()
+
+ +

参见

- wifi.ap.getip()

timer 模块

tmr.delay()

-

描述

+

描述

延迟us微秒。

-

语法

+

语法

tmr.dealy(us)

-

参数

+

参数

us: 延迟时间,单位:微秒

-

返回值

+

返回值

nil

-

示例

-
    -- delay 100us
-    tmr.delay(100)
-
+

示例

+
    -- delay 100us
+    tmr.delay(100)
+
- -

参见

+

参见

- tmr.now()

tmr.now()

-

描述

+

描述

返回系统计数器的当前值,uint32,单位:us。

-

语法

+

语法

tmr.now()

-

参数

+

参数

nil

-

返回值

+

返回值

uint32: value of counter

-

示例

-
    -- 打印计数器的当前值。
-    print(tmr.now())
-
+

示例

+
    -- 打印计数器的当前值。
+    print(tmr.now())
+
- -

参见

+

参见

- tmr.delay()

tmr.alarm()

-

描述

+

描述

闹钟函数。

-注意: 只能允许存在一个闹钟,如果在调用tmr.stop()之前重复调用tmr.alarm(),以最后一次设置的为准,此前定义的闹钟都将失效。

-

语法

+

语法

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

-

参数

+

参数

Interval: 定时时间,单位:毫秒。

repeat: 0:一次性闹钟;1:重复闹钟。

function do(): 定时器到时回调函数。

-

返回值

-

nil

-

示例

-
    -- 每1000ms输出一个hello world
-    tmr.alarm(1000, 1, function() print("hello world") end )
-
- - -

参见

-

- tmr.now()

-

-

tmr.stop()

-

描述

-

停止闹钟功能。

-

语法

-

tmr.stop()

-

参数

-

nil.

返回值

nil

示例

-
    -- 每隔1000ms打印hello world
-    tmr.alarm(1000, 1, function() print("hello world") end )
-
-    -- 其它代码
-
-    -- 停止闹钟
-    tmr.stop()
-
- +
    -- 每1000ms输出一个hello world
+    tmr.alarm(1000, 1, function() print("hello world") end )
+

参见

- tmr.now()

+

+

tmr.stop()

+

描述

+

停止闹钟功能。

+

语法

+

tmr.stop()

+

参数

+

nil.

+

返回值

+

nil

+

示例

+
    -- 每隔1000ms打印hello world
+    tmr.alarm(1000, 1, function() print("hello world") end )
+
+    -- 其它代码
+
+    -- 停止闹钟
+    tmr.stop()
+
+ +

参见

+

- tmr.now()

GPIO 模块

-

常量

+

常量

gpio.OUTPUT, gpio.INPUT, gpio.INT, gpio.HIGH, gpio.LOW

gpio.mode()

-

描述

+

描述

将pin初始化为GPIO并设置输入输出模式。

-

语法

+

语法

gpio.mode(pin, mode)

-

参数

+

参数

pin: 0~11, IO编号

mode: 取值为:gpio.OUTPUT or gpio.INPUT, or gpio.INT(中断模式)

-

返回值

+

返回值

nil

-

示例

-
    -- 将GPIO0设置为输出模式
-    gpio.mode(0, gpio.OUTPUT)
-
+

示例

+
    -- 将GPIO0设置为输出模式
+    gpio.mode(0, gpio.OUTPUT)
 
+
-

参见

+

参见

- gpio.read()

gpio.read()

-

描述

+

描述

读取管脚电平高低。

-

语法

+

语法

gpio.read(pin)

-

参数

+

参数

pin: 0~11, IO编号

-

返回值

+

返回值

number:0:低电平, 1:高电平。

-

示例

-
    -- 读取GPIO0的电平
-    gpio.read(0)
-
+

示例

+
    -- 读取GPIO0的电平
+    gpio.read(0)
+
- -

参见

+

参见

- gpio.mode()

gpio.write()

-

描述

+

描述

设置管脚电平

-

语法

+

语法

gpio.write(pin)

-

参数

+

参数

pin: 0~11, IO编号

level: gpio.HIGH or gpio.LOW

-

返回值

+

返回值

nil

-

示例

-
    -- 设置GPIP1为输出模式,并将输出电平设置为高
-    pin=1
-    gpio.mode(pin, gpio.OUTPUT)
-    gpio.write(pin, gpio.HIGH)
-
+

示例

+
    -- 设置GPIP1为输出模式,并将输出电平设置为高
+    pin=1
+    gpio.mode(pin, gpio.OUTPUT)
+    gpio.write(pin, gpio.HIGH)
+
- -

参见

+

参见

- gpio.mode()

- gpio.read()

gpio.trig()

-

描述

+

描述

设置管脚中断模式的回调函数。

-

语法

+

语法

gpio.trig(pin, type, function(level))

-

参数

+

参数

pin: 0~11, IO编号

type: 取值为”up”, “down”, “both”, “low”, “high”, 分别代表上升沿、下降沿、双边沿、低电平、高电平触发方式。

function(level): 中断触发的回调函数,GPIO的电平作为输入参数。如果此处没有定义函数,则使用之前定义的回调函数。

-

返回值

+

返回值

nil

-

示例

-
    -- 使用GPIO0检测输入脉冲宽度
-    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)
-
+

示例

+
    -- 使用GPIO0检测输入脉冲宽度
+    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)
 
+
-

参见

+

参见

- gpio.mode()

- gpio.write()

PWM模块

pwm.setup()

-

描述

+

描述

设置管脚为pwm模式,最多支持6个pwm。

-

语法

+

语法

pwm.setup(pin, clock, duty)

-

参数

+

参数

pin: 0~11, IO编号

clock: 1~500, pwm频率

duty: 0~100, pwm占空比,百分比表示。

-

返回值

-

nil

-

示例

-
    -- 将管脚0设置为pwm输出模式,频率100Hz,占空比50-50
-    pwm.setup(0, 100, 50)
-
- - -

参见

-

- pwm.start()

-

-

pwm.close()

-

描述

-

退出pwm模式。

-

语法

-

pwm.close(pin)

-

参数

-

pin: 0~11, IO编号

返回值

nil

示例

-
    pwm.close(0)
-
- +
    -- 将管脚0设置为pwm输出模式,频率100Hz,占空比50-50
+    pwm.setup(0, 100, 50)
+

参见

- pwm.start()

-

-

pwm.start()

+

+

pwm.close()

描述

-

pwm启动,可以在对应的GPIO检测到波形。

+

退出pwm模式。

语法

-

pwm.start(pin)

+

pwm.close(pin)

参数

pin: 0~11, IO编号

返回值

nil

示例

-
    pwm.start(0)
-
- +
    pwm.close(0)
+

参见

-

- pwm.stop()

-

-

pwm.stop()

+

- pwm.start()

+

+

pwm.start()

描述

-

暂停pwm输出波形。

+

pwm启动,可以在对应的GPIO检测到波形。

语法

-

pwm.stop(pin)

+

pwm.start(pin)

参数

pin: 0~11, IO编号

返回值

nil

示例

-
    pwm.stop(0)
-
- +
    pwm.start(0)
+

参见

-

- pwm.start()

-

-

pwm.setclock()

+

- pwm.stop()

+

+

pwm.stop()

描述

-

设置pwm的频率

--Note: 设置pwm频率将会同步改变其他pwm输出的频率,当前版本的所有pwm仅支持同一频率输出。

+

暂停pwm输出波形。

语法

-

pwm.setclock(pin, clock)

+

pwm.stop(pin)

参数

-

pin: 0~11, IO编号

-clock: 1~500, pwm周期

+

pin: 0~11, IO编号

返回值

nil

示例

-
    pwm.setclock(0, 100)
-
- +
    pwm.stop(0)
+

参见

+

- pwm.start()

+

+

pwm.setclock()

+

描述

+

设置pwm的频率

+-Note: 设置pwm频率将会同步改变其他pwm输出的频率,当前版本的所有pwm仅支持同一频率输出。

+

语法

+

pwm.setclock(pin, clock)

+

参数

+

pin: 0~11, IO编号

+clock: 1~500, pwm周期

+

返回值

+

nil

+

示例

+
    pwm.setclock(0, 100)
+
+ +

参见

- pwm.getclock()

pwm.getclock()

-

描述

+

描述

获取pin的pwm工作频率

-

语法

+

语法

pwm.getclock(pin)

-

参数

+

参数

pin: 0~11, IO编号

-

返回值

+

返回值

number:pin的pwm工作频率

-

示例

-
    print(pwm.getclock(0))
-
+

示例

+
    print(pwm.getclock(0))
+
- -

参见

+

参见

- pwm.setclock()

pwm.setduty()

-

描述

+

描述

设置pin的占空比。

-

语法

+

语法

pwm.setduty(pin, duty)

-

参数

+

参数

pin: 0~11, IO编号

duty: 0~100, pwm的占空比,以百分数表示

-

返回值

-

nil

-

示例

-
    pwm.setduty(0, 50)
-
- - -

参见

-

- pwm.getduty()

-

-

pwm.getduty()

-

描述

-

获取pin的pwm占空比。

-

语法

-

pwm.getduty(pin)

-

参数

-

pin: 0~11, IO编号

返回值

nil

示例

-
    -- D0 连接绿色led
-    -- D1 连接蓝色led
-    -- D2 连接红色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) --  led显示红色
-    led(0,0,50) -- led显示蓝色
-
- +
    pwm.setduty(0, 50)
+

参见

+

- pwm.getduty()

+

+

pwm.getduty()

+

描述

+

获取pin的pwm占空比。

+

语法

+

pwm.getduty(pin)

+

参数

+

pin: 0~11, IO编号

+

返回值

+

nil

+

示例

+
    -- D0 连接绿色led
+    -- D1 连接蓝色led
+    -- D2 连接红色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) --  led显示红色
+    led(0,0,50) -- led显示蓝色
+
+
+ +

参见

- pwm.setduty()

net 模块

-

常量

+

常量

net.TCP, net.UDP

net.createServer()

-

描述

-

创建一个server。

-

语法

-

net.createServer(type, secure)

-

参数

-

type: 取值为:net.TCP 或者 net.UDP

-secure: 设置为true或者false, true代表安全连接,false代表普通连接。

-

返回值

-

net.server子模块

-

示例

-
    net.createServer(net.TCP, true)
-
- - -

参见

-

- net.createConnection()

-

-

net.createConnection()

描述

-

创建一个client。

+

创建一个server。

语法

-

net.createConnection(type, secure)

+

net.createServer(type, secure)

参数

type: 取值为:net.TCP 或者 net.UDP

secure: 设置为true或者false, true代表安全连接,false代表普通连接。

返回值

net.server子模块

示例

-
    net.createConnection(net.UDP, false)
-
- +
    net.createServer(net.TCP, true)
+

参见

+

- net.createConnection()

+

+

net.createConnection()

+

描述

+

创建一个client。

+

语法

+

net.createConnection(type, secure)

+

参数

+

type: 取值为:net.TCP 或者 net.UDP

+secure: 设置为true或者false, true代表安全连接,false代表普通连接。

+

返回值

+

net.server子模块

+

示例

+
    net.createConnection(net.UDP, false)
+
+ +

参见

- net.createServer()

net.server 子模块

listen()

-

描述

+

描述

侦听指定ip地址的端口。

-

语法

+

语法

net.server.listen(port,[ip],function(net.socket))

-

参数

+

参数

port: 端口号

ip:ip地址字符串,可以省略

function(net.socket): 连接创建成功的回调函数,可以作为参数传给调用函数。

-

返回值

-

nil

-

示例

-
    -- 创建一个server
-    sv=net.createServer(net.TCP, false)
-    -- server侦听端口80,如果收到数据将数据打印至控制台,并向远端发送‘hello world’
-    sv:listen(80,function(c)
-      c:on("receive", function(sck, pl) print(pl) end)
-      c:send("hello world")
-      end)
-
- - -

参见

-

- net.createServer()

-

-

close()

-

描述

-

关闭server

-

语法

-

net.server.close()

-

参数

-

nil

返回值

nil

示例

-
    -- 创建server
-    sv=net.createServer(net.TCP, false)
-    -- 关闭server
-    sv:close()
-
- +
    -- 创建一个server
+    sv=net.createServer(net.TCP, false)
+    -- server侦听端口80,如果收到数据将数据打印至控制台,并向远端发送‘hello world’
+    sv:listen(80,function(c)
+      c:on("receive", function(sck, pl) print(pl) end)
+      c:send("hello world")
+      end)
+

参见

- net.createServer()

+

+

close()

+

描述

+

关闭server

+

语法

+

net.server.close()

+

参数

+

nil

+

返回值

+

nil

+

示例

+
    -- 创建server
+    sv=net.createServer(net.TCP, false)
+    -- 关闭server
+    sv:close()
+
+ +

参见

+

- net.createServer()

net.socket 子模块

connect()

-

描述

+

描述

连接至远端。

-

语法

+

语法

connect(port, ip)

-

参数

+

参数

port: 端口号

ip: ip地址字符串

-

返回值

+

返回值

nil

-

参见

+

参见

- net.socket:on()

send()

-

描述

+

描述

通过连接向远端发送数据。

-

语法

+

语法

send(string, function(sent))

-

参数

+

参数

string: 待发送的字符串

function(sent): 发送字符串后的回调函数。

-

返回值

+

返回值

nil

-

参见

+

参见

- net.socket:on()

on()

-

描述

+

描述

向事件注册回调函数。

-

语法

+

语法

on(event, function cb())

-

参数

+

参数

event: 字符串,取值为: “connection”, “reconnection”, “disconnection”, “receive”, “sent”

function cb(net.socket, [string]): 回调函数。第一个参数是socket.

如果事件是”receive”, 第二个参数则为接收到的字符串。

-

返回值

+

返回值

nil

-

示例

-
    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")
-
+

示例

+
    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")
+
- -

参见

+

参见

- net.createServer()

close()

-

描述

+

描述

关闭socket。

-

语法

+

语法

close()

-

参数

+

参数

nil

-

返回值

+

返回值

nil

-

参见

+

参见

- net.createServer()

dns()

-

描述

+

描述

获取当前域的ip

-

语法

+

语法

dns(domain, function(net.socket, ip))

-

参数

+

参数

domain: 当前域的名称

function (net.socket, ip): 回调函数。第一个参数是socket,第二个参数是当前域的ip字符串。

-

返回值

+

返回值

nil

-

参见

+

参见

- net.createServer()

i2c模块

-

常量

+

常量

i2c.SLOW, i2c.TRANSMITTER, i2c. RECEIVER. FAST(400k)模式目前不支持。

i2c.setup()

-

描述

+

描述

初始化i2c。

-

语法

+

语法

i2c.setup(id, pinSDA, pinSCL, speed)

-

参数

+

参数

id = 0

pinSDA: 0~11, IO编号

pinSCL: 0~11, IO编号

speed: i2c.SLOW

-

返回值

+

返回值

nil

-

参见

+

参见

- i2c.read()

i2c.start()

-

描述

+

描述

启动i2c传输。

-

语法

+

语法

i2c.start(id)

-

参数

+

参数

id = 0

-

返回值

+

返回值

nil

-

参见

+

参见

- i2c.read()

i2c.stop()

-

描述

+

描述

停止i2c传输。

-

语法

+

语法

i2c.stop(id)

-

参数

+

参数

id = 0

-

返回值

+

返回值

nil

-

参见

+

参见

- i2c.read()

i2c.address()

-

描述

+

描述

设置i2c地址以及读写模式。

-

语法

+

语法

i2c.address(id, device_addr, direction)

-

参数

+

参数

id=0

device_addr: 设备地址。

direction: i2c.TRANSMITTER:写模式;i2c. RECEIVER:读模式。

-

返回值

+

返回值

nil

-

参见

+

参见

- i2c.read()

i2c.write()

-

描述

+

描述

向i2c写数据。数据可以是多个数字, 字符串或者lua table。

-

语法

+

语法

i2c.write(id, data1, data2,…)

-

参数

+

参数

id=0

data: 数据可以是多个数字, 字符串或者lua table。

-

返回值

+

返回值

nil

-

示例

-
    i2c.write(0, "hello", "world")
-
+

示例

+
    i2c.write(0, "hello", "world")
+
- -

参见

+

参见

- i2c.read()

i2c.read()

-

描述

+

描述

读取len个字节的数据。

-

语法

+

语法

i2c.read(id, len)

-

参数

+

参数

id=0

len: 数据长度。

-

返回值

+

返回值

string:接收到的数据。

-

示例

-
    id=0
-    sda=1
-    scl=0
+

示例

+
    id=0
+    sda=1
+    scl=0
 
-    -- 初始化i2c, 将pin1设置为sda, 将pin0设置为scl
-    i2c.setup(id,sda,scl,i2c.SLOW)
+    -- 初始化i2c, 将pin1设置为sda, 将pin0设置为scl
+    i2c.setup(id,sda,scl,i2c.SLOW)
 
-    -- 用户定义函数:读取地址dev_addr的寄存器reg_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
+    -- 用户定义函数:读取地址dev_addr的寄存器reg_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
 
-    -- 读取0x77的寄存器0xAA中的内容。
-    reg = read_reg(0x77, 0xAA)
-    pirnt(string.byte(reg))
-
+ -- 读取0x77的寄存器0xAA中的内容。 + reg = read_reg(0x77, 0xAA) + pirnt(string.byte(reg)) + -

参见

-

- i2c.write()

\ No newline at end of file +

参见

+

- i2c.write()

+

adc 模块

+

常量

+

+

+

adc.read()

+

描述

+

读取adc的值,esp8266只有一个10bit adc,id为0,最大值1024

+

语法

+

adc.read(id)

+

参数

+

id = 0

+

返回值

+

adc 值 10bit,最大1024.

+

参见

+

-

\ No newline at end of file diff --git a/nodemcu_api_cn.md b/nodemcu_api_cn.md index 16f3570b..a184b53b 100644 --- a/nodemcu_api_cn.md +++ b/nodemcu_api_cn.md @@ -1,8 +1,12 @@ # **nodeMcu API说明** # [English Version](https://github.com/funshine/nodemcu-firmware/wiki/nodemcu_api_en) -###版本 0.9.2 build 2014-11-18 +###版本 0.9.2 build 2014-11-19 ###变更日志: +2014-11-19
+增加adc模块,adc.read(0)读取adc的值。
+wifi模块增加wifi.sta.getap() 函数,用于获取ap列表。 + 2014-11-18
修正tcp服务器不能使用:close()函数关闭tcp连接的问题。
tcp服务器: 服务器将关闭30s内未使用的闲置的连接。(修正前为180s)
@@ -807,6 +811,36 @@ mac地址字符串,如:"18-33-44-FE-55-BB" ####参见 **-** [wifi.sta.getip()](#ws_getip) + +## wifi.sta.getap() +####描述 +扫描并列出ap,结果以一个lua table为参数传递给回调函数。 + +####语法 +wifi.sta.getap(function(table)) + +####参数 +function(table): 当扫描结束时,调用此回调函数
+ 扫描结果是一个lua table,key为ap的ssid,value为其他信息,格式:authmode,rssi,bssid,channel + + +####返回值 +nil + +####示例 + +```lua + -- print ap list + function listap(t) + for k,v in pairs(t) do + print(k.." : "..v) + end + end + wifi.sta.getap(listap) +``` + +####参见 +**-** [wifi.sta.getip()](#ws_getip) #wifi.ap 子模块 @@ -1707,4 +1741,25 @@ string:接收到的数据。 ``` ####参见 -**-** [i2c.write()](#ic_write) \ No newline at end of file +**-** [i2c.write()](#ic_write) + +#adc 模块 +##常量 +无 + + +## adc.read() +####描述 +读取adc的值,esp8266只有一个10bit adc,id为0,最大值1024 + +####语法 +adc.read(id) + +####参数 +id = 0
+ +####返回值 +adc 值 10bit,最大1024. + +####参见 +**-** []() diff --git a/nodemcu_api_en.html b/nodemcu_api_en.html index 3e0ac9a0..e5c9b0c7 100644 --- a/nodemcu_api_en.html +++ b/nodemcu_api_en.html @@ -1014,76 +1014,14 @@ body .markdown-body page-break-after: avoid; } } -nodemcu_api_en

nodeMcu API Instruction

+nodemcu_api_en

nodeMcu API Instruction

中文版本

-

version 0.9.2 build 2014-11-18

+

version 0.9.2 build 2014-11-19

change log:

+

2014-11-19

+add adc module, use adc.read(0) to read adc value, no tests made.

+add wifi.sta.getap() api to wifi.sta module, to get ap list.

2014-11-18

bug fixed: net.socket:connect() has no effect.

2014-11-18

@@ -1162,9 +1100,8 @@ key is triged only when key is released

Returns

nil

Example

-
    node.restart();
-
- +
    node.restart();
+

See also

-

@@ -1180,9 +1117,8 @@ key is triged only when key is released

Returns

nil

Example

-
    node.dsleep(us);
-
- +
    node.dsleep(us);
+

See also

-

@@ -1197,9 +1133,8 @@ key is triged only when key is released

Returns

number:chip ID

Example

-
    id = node.chipid();
-
- +
    id = node.chipid();
+

See also

-

@@ -1214,9 +1149,8 @@ key is triged only when key is released

Returns

number: system heap size left in bytes

Example

-
    heap_size = node.heap();
-
- +
    heap_size = node.heap();
+

See also

-

@@ -1233,9 +1167,8 @@ Default function: long: change LED blinking rate, short: reset chip

Returns

nil

Example

-
    node.key("long", function(){print('hello world')})
-
- +
    node.key("long", function(){print('hello world')})
+

See also

-

@@ -1251,10 +1184,9 @@ High: LED off time. Unit: milliseconds, time resolution: 80~100ms

Returns

nil

Example

-
    -- turn led on forever.
-    node.led(0);
-
- +
    -- turn led on forever.
+    node.led(0);
+

See also

-

@@ -1270,10 +1202,9 @@ same as pcall(loadstring(str)) but support multi seperated line.

Returns

nil

Example

-
    -- never use node.input() in console. no effect.
-    sk:on("receive", function(conn, payload) node.input(payload) end)
-
- +
    -- never use node.input() in console. no effect.
+    sk:on("receive", function(conn, payload) node.input(payload) end)
+

See also

-

@@ -1289,35 +1220,33 @@ serial_debug: 1 output also show in serial. 0: no serial output.

Returns

nil

Example

-
    function tonet(str)
-      sk:send(str)
-      -- print(str) WRONG!!! never ever print something in this function
-      -- because this will cause a recursive function call!!!
-    end
-    node.ouput(tonet, 1)  -- serial also get the lua output.
-
- - -
    -- a simple telnet server
-    s=net.createServer(net.TCP) 
-    s:listen(2323,function(c) 
-       con_std = c 
-       function s_output(str) 
-          if(con_std~=nil) 
-             then con_std:send(str) 
-          end 
-       end 
-       node.output(s_output, 0)   -- re-direct output to function s_ouput.
-       c:on("receive",function(c,l) 
-          node.input(l)           -- works like pcall(loadstring(l)) but support multiple separate line
-       end) 
-       c:on("disconnection",function(c) 
-          con_std = nil 
-          node.output(nil)        -- un-regist the redirect output function, output goes to serial
-       end) 
-    end)
-
+
    function tonet(str)
+      sk:send(str)
+      -- print(str) WRONG!!! never ever print something in this function
+      -- because this will cause a recursive function call!!!
+    end
+    node.ouput(tonet, 1)  -- serial also get the lua output.
+
+
    -- a simple telnet server
+    s=net.createServer(net.TCP) 
+    s:listen(2323,function(c) 
+       con_std = c 
+       function s_output(str) 
+          if(con_std~=nil) 
+             then con_std:send(str) 
+          end 
+       end 
+       node.output(s_output, 0)   -- re-direct output to function s_ouput.
+       c:on("receive",function(c,l) 
+          node.input(l)           -- works like pcall(loadstring(l)) but support multiple separate line
+       end) 
+       c:on("disconnection",function(c) 
+          con_std = nil 
+          node.output(nil)        -- un-regist the redirect output function, output goes to serial
+       end) 
+    end)
+

See also

-

@@ -1333,10 +1262,9 @@ serial_debug: 1 output also show in serial. 0: no serial output.

Returns

nil

Example

-
    -- remove "foo.lua" from file system.
-    file.remove("foo.lua")
-
- +
    -- remove "foo.lua" from file system.
+    file.remove("foo.lua")
+

See also

- file.open()

@@ -1359,12 +1287,11 @@ mode:

Returns

nil

Example

-
    -- open 'init.lua', print the first line.
-    file.open("init.lua", "r")
-    print(file.readline())
-    file.close()
-
- +
    -- open 'init.lua', print the first line.
+    file.open("init.lua", "r")
+    print(file.readline())
+    file.close()
+

See also

- file.close()

@@ -1380,12 +1307,11 @@ mode:

Returns

nil

Example

-
    -- open 'init.lua', print the first line.
-    file.open("init.lua", "r")
-    print(file.readline())
-    file.close()
-
- +
    -- open 'init.lua', print the first line.
+    file.open("init.lua", "r")
+    print(file.readline())
+    file.close()
+

See also

- file.open()

@@ -1402,12 +1328,11 @@ mode:

file content in string, line by line, include EOL(‘\n’)

return nil when EOF.

Example

-
    -- print the first line of 'init.lua'
-    file.open("init.lua", "r")
-    print(file.readline())
-    file.close()
-
- +
    -- print the first line of 'init.lua'
+    file.open("init.lua", "r")
+    print(file.readline())
+    file.close()
+

See also

- file.open()

@@ -1424,13 +1349,12 @@ return nil when EOF.

true: write ok.
nil: there is error

Example

-
    -- open 'init.lua' in 'a+' mode
-    file.open("init.lua", "a+")
-    -- write 'foo bar' to the end of the file
-    file.writeline('foo bar')
-    file.close()
-
- +
    -- open 'init.lua' in 'a+' mode
+    file.open("init.lua", "a+")
+    -- write 'foo bar' to the end of the file
+    file.writeline('foo bar')
+    file.close()
+

See also

- file.open()

@@ -1447,13 +1371,12 @@ nil: there is error

true: write ok.
nil: there is error

Example

-
    -- open 'init.lua' in 'a+' mode
-    file.open("init.lua", "a+")
-    -- write 'foo bar' to the end of the file
-    file.write('foo bar')
-    file.close()
-
- +
    -- open 'init.lua' in 'a+' mode
+    file.open("init.lua", "a+")
+    -- write 'foo bar' to the end of the file
+    file.write('foo bar')
+    file.close()
+

See also

- file.open()

@@ -1469,14 +1392,13 @@ nil: there is error

Returns

nil

Example

-
    -- open 'init.lua' in 'a+' mode
-    file.open("init.lua", "a+")
-    -- write 'foo bar' to the end of the file
-    file.write('foo bar')
-    file.flush()
-    file.close()
-
- +
    -- open 'init.lua' in 'a+' mode
+    file.open("init.lua", "a+")
+    -- write 'foo bar' to the end of the file
+    file.write('foo bar')
+    file.flush()
+    file.close()
+

See also

- file.open()

@@ -1497,16 +1419,15 @@ offset: default 0

success: returns the final file position

fail: returns nil

Example

-
    -- open 'init.lua' in 'a+' mode
-    file.open("init.lua", "a+")
-    -- write 'foo bar' to the end of the file
-    file.write('foo bar')
-    file.flush()
-    file.seek("set")
-    print(file.readline())
-    file.close()
-
- +
    -- open 'init.lua' in 'a+' mode
+    file.open("init.lua", "a+")
+    -- write 'foo bar' to the end of the file
+    file.write('foo bar')
+    file.flush()
+    file.seek("set")
+    print(file.readline())
+    file.close()
+

See also

- file.open()

@@ -1522,12 +1443,11 @@ fail: returns nil

Returns

a lua table which contains the {file name: file size} pairs

Example

-
    l = file.list();
-    for k,v in l do
-      print("name:"..k..", size:"..v)
-    end
-
- +
    l = file.list();
+    for k,v in l do
+      print("name:"..k..", size:"..v)
+    end
+

See also

- file.remove()

@@ -1545,9 +1465,8 @@ fail: returns nil

Returns

current mode after setup

Example

-
    wifi.setmode(wifi.STATION)
-
- +
    wifi.setmode(wifi.STATION)
+

See also

- wifi.getmode()

@@ -1562,9 +1481,8 @@ fail: returns nil

Returns

wifi operation mode

Example

-
    print(wifi.getmode())
-
- +
    print(wifi.getmode())
+

See also

- wifi.setmode()

@@ -1580,9 +1498,8 @@ succeed_callback: callback function called after configuration, which is called

Returns

nil

Example

-
    wifi.startsmart(6, cb())
-
- +
    wifi.startsmart(6, cb())
+

See also

- wifi.stopsmart()

@@ -1597,9 +1514,8 @@ succeed_callback: callback function called after configuration, which is called

Returns

nil

Example

-
    wifi.stopsmart()
-
- +
    wifi.stopsmart()
+

See also

- wifi.startsmart()

@@ -1616,9 +1532,8 @@ password: string which is less than 64 bytes.

Returns

nil

Example

-
    wifi.sta.config("myssid","mypassword")
-
- +
    wifi.sta.config("myssid","mypassword")
+

See also

- wifi.sta.connect()

@@ -1634,9 +1549,8 @@ password: string which is less than 64 bytes.

Returns

nil

Example

-
    wifi.sta.connect()
-
- +
    wifi.sta.connect()
+

See also

- wifi.sta.disconnect()

@@ -1652,9 +1566,8 @@ password: string which is less than 64 bytes.

Returns

nil

Example

-
    wifi.sta.disconnect()
-
- +
    wifi.sta.disconnect()
+

See also

- wifi.sta.config()

@@ -1670,9 +1583,8 @@ password: string which is less than 64 bytes.

Returns

nil

Example

-
    wifi.sta.autoconnect()
-
- +
    wifi.sta.autoconnect()
+

See also

- wifi.sta.config()

@@ -1689,10 +1601,9 @@ password: string which is less than 64 bytes.

Returns

ip address in string, for example:”192.168.0.111”

Example

-
    -- print current ip
-    print(wifi.sta.getip())
-
- +
    -- print current ip
+    print(wifi.sta.getip())
+

See also

- wifi.sta.getmac()

@@ -1707,674 +1618,688 @@ password: string which is less than 64 bytes.

Returns

mac address in string, for example:”18-33-44-FE-55-BB”

Example

-
    -- print current mac address
-    print(wifi.sta.getmac())
-
- +
    -- print current mac address
+    print(wifi.sta.getmac())
+

See also

- wifi.sta.getip()

+

+

wifi.sta.getap()

+

Description

+

scan and get ap list as a lua table into callback function.

+

Syntax

+

wifi.sta.getap(function(table))

+

Parameters

+

function(table): a callback function to receive ap table when scan is done

+ this function receive a table, the key is the ssid, value is other info in format: authmode,rssi,bssid,channel

+

Returns

+

nil

+

Example

+
    -- print ap list
+    function listap(t)
+      for k,v in pairs(t) do
+        print(k.." : "..v)
+      end
+    end
+    wifi.sta.getap(listap)
+
+ +

See also

+

- wifi.sta.getip()

wifi.ap module

wifi.ap.config()

-

Description

+

Description

set ssid and password in ap mode.

-

Syntax

+

Syntax

wifi.ap.config(cfg)

-

Parameters

+

Parameters

cfg: lua table to setup ap.

-

Example:

-
     cfg={}
-     cfg.ssid="myssid"
-     cfg.pwd="mypwd"
-     wifi.ap.setconfig(cfg)
-
+

Example:

+
     cfg={}
+     cfg.ssid="myssid"
+     cfg.pwd="mypwd"
+     wifi.ap.setconfig(cfg)
+
- -

Returns

+

Returns

nil

-

Example

-
    wifi.ap.config(ssid, 'password')
-
+

Example

+
    wifi.ap.config(ssid, 'password')
+
- -

See also

+

See also

-

wifi.ap.getip()

-

Description

-

get ip in ap mode.

-

Syntax

-

wifi.ap.getip()

-

Parameters

-

nil

-

Returns

-

ip address in string, for example:”192.168.0.111”

-

Example

-
    wifi.ap.getip()
-
- - -

See also

-

- wifi.ap.getmac()

-

-

wifi.ap.getmac()

Description

-

get mac address in ap mode.

+

get ip in ap mode.

Syntax

-

wifi.ap.getmac()

+

wifi.ap.getip()

Parameters

nil

Returns

-

mac address in string, for example:”1A-33-44-FE-55-BB”

+

ip address in string, for example:”192.168.0.111”

Example

-
    wifi.ap.getmac()
-
- +
    wifi.ap.getip()
+

See also

+

- wifi.ap.getmac()

+

+

wifi.ap.getmac()

+

Description

+

get mac address in ap mode.

+

Syntax

+

wifi.ap.getmac()

+

Parameters

+

nil

+

Returns

+

mac address in string, for example:”1A-33-44-FE-55-BB”

+

Example

+
    wifi.ap.getmac()
+
+ +

See also

- wifi.ap.getip()

timer module

tmr.delay()

-

Description

+

Description

delay us micro seconds.

-

Syntax

+

Syntax

tmr.dealy(us)

-

Parameters

+

Parameters

us: delay time in micro second

-

Returns

+

Returns

nil

-

Example

-
    -- delay 100us
-    tmr.delay(100)
-
+

Example

+
    -- delay 100us
+    tmr.delay(100)
+
- -

See also

+

See also

- tmr.now()

tmr.now()

-

Description

+

Description

return the current value of system counter: uint32, us.

-

Syntax

+

Syntax

tmr.now()

-

Parameters

+

Parameters

nil

-

Returns

+

Returns

uint32: value of counter

-

Example

-
    -- print current value of counter
-    print(tmr.now())
-
+

Example

+
    -- print current value of counter
+    print(tmr.now())
+
- -

See also

+

See also

- tmr.delay()

tmr.alarm()

-

Description

+

Description

alarm time.

-

Syntax

+

Syntax

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

-

Parameters

+

Parameters

Interval: alarm time, unit: millisecond

repeat: 0 - one time alarm, 1 - repeat

function do(): callback function for alarm timed out

-

Returns

-

nil

-

Example

-
    -- print "hello world" every 1000ms
-    tmr.alarm(1000, 1, function() print("hello world") end )
-
- - -

See also

-

- tmr.now()

-

-

tmr.stop()

-

Description

-

stop alarm.

--Note: only one alarm is allowed, the previous one would be replaced if tmr.alarm() called again before tmr.stop().

-

Syntax

-

tmr.stop()

-

Parameters

-

nil.

Returns

nil

Example

-
    -- print "hello world" every 1000ms
-    tmr.alarm(1000, 1, function() print("hello world") end )
-
-    -- something else
-
-    -- stop alarm
-    tmr.stop()
-
- +
    -- print "hello world" every 1000ms
+    tmr.alarm(1000, 1, function() print("hello world") end )
+

See also

- tmr.now()

+

+

tmr.stop()

+

Description

+

stop alarm.

+-Note: only one alarm is allowed, the previous one would be replaced if tmr.alarm() called again before tmr.stop().

+

Syntax

+

tmr.stop()

+

Parameters

+

nil.

+

Returns

+

nil

+

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()

GPIO module

CONSTANT

gpio.OUTPUT, gpio.INPUT, gpio.INT, gpio.HIGH, gpio.LOW

gpio.mode()

-

Description

+

Description

initialize pin to GPIO mode, set the pin in/out mode.

-

Syntax

+

Syntax

gpio.mode(pin, mode)

-

Parameters

+

Parameters

pin: 0~11, IO index

mode: gpio.OUTPUT or gpio.INPUT, or gpio.INT(interrupt mode)

-

Returns

+

Returns

nil

-

Example

-
    -- set gpio 0 as output.
-    gpio.mode(0, gpio.OUTPUT)
-
+

Example

+
    -- set gpio 0 as output.
+    gpio.mode(0, gpio.OUTPUT)
 
+
-

See also

+

See also

- gpio.read()

gpio.read()

-

Description

+

Description

read pin value.

-

Syntax

+

Syntax

gpio.read(pin)

-

Parameters

+

Parameters

pin: 0~11, IO index

-

Returns

+

Returns

number:0 - low, 1 - high

-

Example

-
    -- read value of gpio 0.
-    gpio.read(0)
-
+

Example

+
    -- read value of gpio 0.
+    gpio.read(0)
+
- -

See also

+

See also

- gpio.mode()

gpio.write()

-

Description

+

Description

set pin value.

-

Syntax

+

Syntax

gpio.write(pin)

-

Parameters

+

Parameters

pin: 0~11, IO index

level: gpio.HIGH or gpio.LOW

-

Returns

+

Returns

nil

-

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)
-
+

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

+

See also

- gpio.mode()

- gpio.read()

gpio.trig()

-

Description

+

Description

set the interrupt callback function for pin.

-

Syntax

+

Syntax

gpio.trig(pin, type, function(level))

-

Parameters

+

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

+

Returns

nil

-

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)
-
+

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

+

See also

- gpio.mode()

- gpio.write()

PWM module

pwm.setup()

-

Description

+

Description

set pin to PWM mode. Only 3 pins can be set to PWM mode at the most.

-

Syntax

+

Syntax

pwm.setup(pin, clock, duty)

-

Parameters

+

Parameters

pin: 0~11, IO index

clock: 1~500, pwm frequency

duty: 0~100, pwm duty cycle in percentage

-

Returns

-

nil

-

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()

-

-

pwm.close()

-

Description

-

quit PWM mode for specified pin.

-

Syntax

-

pwm.close(pin)

-

Parameters

-

pin: 0~11, IO index

Returns

nil

Example

-
    pwm.close(0)
-
- +
    -- set pin index 0 as pwm output, frequency is 100Hz, duty cycle is 50-50.
+    pwm.setup(0, 100, 50)
+

See also

- pwm.start()

-

-

pwm.start()

+

+

pwm.close()

Description

-

pwm starts, you can detect the waveform on the gpio.

+

quit PWM mode for specified pin.

Syntax

-

pwm.start(pin)

+

pwm.close(pin)

Parameters

pin: 0~11, IO index

Returns

nil

Example

-
    pwm.start(0)
-
- +
    pwm.close(0)
+

See also

-

- pwm.stop()

-

-

pwm.stop()

+

- pwm.start()

+

+

pwm.start()

Description

-

pause the output of PWM waveform.

+

pwm starts, you can detect the waveform on the gpio.

Syntax

-

pwm.stop(pin)

+

pwm.start(pin)

Parameters

pin: 0~11, IO index

Returns

nil

Example

-
    pwm.stop(0)
-
- +
    pwm.start(0)
+

See also

-

- pwm.start()

-

-

pwm.setclock()

+

- pwm.stop()

+

+

pwm.stop()

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.

+

pause the output of PWM waveform.

Syntax

-

pwm.setclock(pin, clock)

+

pwm.stop(pin)

Parameters

-

pin: 0~11, IO index.

-clock: 1~500, pwm frequency.

+

pin: 0~11, IO index

Returns

nil

Example

-
    pwm.setclock(0, 100)
-
- +
    pwm.stop(0)
+

See also

+

- pwm.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

+

nil

+

Example

+
    pwm.setclock(0, 100)
+
+ +

See also

- pwm.getclock()

pwm.getclock()

-

Description

+

Description

get pwm frequency of pin.

-

Syntax

+

Syntax

pwm.getclock(pin)

-

Parameters

+

Parameters

pin: 0~11, IO index.

-

Returns

+

Returns

number:pwm frequency of pin

-

Example

-
    print(pwm.getclock(0))
-
+

Example

+
    print(pwm.getclock(0))
+
- -

See also

+

See also

- pwm.setclock()

pwm.setduty()

-

Description

+

Description

set duty clycle for pin.

-

Syntax

+

Syntax

pwm.setduty(pin, duty)

-

Parameters

+

Parameters

pin: 0~11, IO index

duty: 0~100, pwm duty cycle in percentage

-

Returns

-

nil

-

Example

-
    pwm.setduty(0, 50)
-
- - -

See also

-

- pwm.getduty()

-

-

pwm.getduty()

-

Description

-

get duty clycle for pin.

-

Syntax

-

pwm.getduty(pin)

-

Parameters

-

pin: 0~11, IO index

Returns

nil

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.
-
- +
    pwm.setduty(0, 50)
+

See also

+

- pwm.getduty()

+

+

pwm.getduty()

+

Description

+

get duty clycle for pin.

+

Syntax

+

pwm.getduty(pin)

+

Parameters

+

pin: 0~11, IO index

+

Returns

+

nil

+

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()

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()

-

-

net.createConnection()

Description

-

create a client.

+

create a server.

Syntax

-

net.createConnection(type, secure)

+

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.createConnection(net.UDP, false)
-
- +
    net.createServer(net.TCP, true)
+

See also

+

- net.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()

net.server module

listen()

-

Description

+

Description

listen on port from [ip] address.

-

Syntax

+

Syntax

net.server.listen(port,[ip],function(net.socket))

-

Parameters

+

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

-

nil

-

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()

-

-

close()

-

Description

-

close server.

-

Syntax

-

net.server.close()

-

Parameters

-

nil

Returns

nil

Example

-
    -- create a server
-    sv=net.createServer(net.TCP, false)
-    -- close server
-    sv:close()
-
- +
    -- 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()

+

+

close()

+

Description

+

close server.

+

Syntax

+

net.server.close()

+

Parameters

+

nil

+

Returns

+

nil

+

Example

+
    -- create a server
+    sv=net.createServer(net.TCP, false)
+    -- close server
+    sv:close()
+
+ +

See also

+

- net.createServer()

net.socket module

connect()

-

Description

+

Description

connect to remote.

-

Syntax

+

Syntax

connect(port, ip)

-

Parameters

+

Parameters

port: port number

ip: ip address in string

-

Returns

-

nil

-

See also

-

- net.socket: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

nil

See also

- net.socket: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

+

nil

+

See also

+

- net.socket:on()

on()

-

Description

+

Description

register callback function for event.

-

Syntax

+

Syntax

on(event, function cb())

-

Parameters

+

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

+

Returns

nil

-

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")
-
+

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

+

See also

- net.createServer()

close()

-

Description

-

close socket.

-

Syntax

-

close()

-

Parameters

-

nil

-

Returns

-

nil

-

See also

-

- net.createServer()

-

-

dns()

Description

-

get domain ip

+

close socket.

Syntax

-

dns(domain, function(net.socket, ip))

+

close()

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.

+

nil

Returns

nil

See also

- net.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

+

nil

+

See also

+

- net.createServer()

i2c module

CONSTANT

i2c.SLOW, i2c.TRANSMITTER, i2c. RECEIVER. FAST(400k)is not supported for now.

i2c.setup()

-

Description

+

Description

initialize i2c.

-

Syntax

+

Syntax

i2c.setup(id, pinSDA, pinSCL, speed)

-

Parameters

+

Parameters

id = 0

pinSDA: 0~11, IO index

pinSCL: 0~11, IO index

speed: i2c.SLOW

-

Returns

-

nil

-

See also

-

- i2c.read()

-

-

i2c.start()

-

Description

-

start i2c transporting.

-

Syntax

-

i2c.start(id)

-

Parameters

-

id = 0

Returns

nil

See also

- i2c.read()

-

-

i2c.stop()

+

+

i2c.start()

Description

-

stop i2c transporting.

+

start i2c transporting.

Syntax

-

i2c.stop(id)

+

i2c.start(id)

Parameters

id = 0

Returns

nil

See also

- i2c.read()

-

-

i2c.address()

+

+

i2c.stop()

Description

-

setup i2c address and read/write mode.

+

stop i2c transporting.

Syntax

-

i2c.address(id, device_addr, direction)

+

i2c.stop(id)

Parameters

-

id=0

-device_addr: device address.

-direction: i2c.TRANSMITTER for writing mode , i2c. RECEIVER for reading mode

+

id = 0

Returns

nil

See also

- i2c.read()

-

-

i2c.write()

+

+

i2c.address()

Description

-

write data to i2c, data can be multi numbers, string or lua table.

+

setup i2c address and read/write mode.

Syntax

-

i2c.write(id, data1, data2,…)

+

i2c.address(id, device_addr, direction)

Parameters

id=0

-data: data can be numbers, string or lua table.

+device_addr: device address.

+direction: i2c.TRANSMITTER for writing mode , i2c. RECEIVER for reading mode

Returns

nil

-

Example

-
    i2c.write(0, "hello", "world")
-
- -

See also

- i2c.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

+

nil

+

Example

+
    i2c.write(0, "hello", "world")
+
+ +

See also

+

- i2c.read()

i2c.read()

-

Description

+

Description

read data for len bytes.

-

Syntax

+

Syntax

i2c.read(id, len)

-

Parameters

+

Parameters

id=0

len: data length

-

Returns

+

Returns

string:data received.

-

Example

-
    id=0
-    sda=1
-    scl=0
+

Example

+
    id=0
+    sda=1
+    scl=0
 
-    -- initialize i2c, set pin1 as sda, set pin0 as scl
-    i2c.setup(id,sda,scl,i2c.SLOW)
+    -- 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
+    -- 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))
-
+ -- get content of register 0xAA of device 0x77 + reg = read_reg(0x77, 0xAA) + pirnt(string.byte(reg)) + -

See also

-

- i2c.write()

\ No newline at end of file +

See also

+

- i2c.write()

+

adc module

+

CONSTANT

+

none

+

+

adc.read()

+

Description

+

read adc value of id, esp8266 has only one 10bit adc, id=0

+

Syntax

+

adc.read(id)

+

Parameters

+

id = 0

+

Returns

+

adc value

+

See also

+

-

\ No newline at end of file diff --git a/nodemcu_api_en.md b/nodemcu_api_en.md index d8f24c99..37fb253b 100644 --- a/nodemcu_api_en.md +++ b/nodemcu_api_en.md @@ -1,8 +1,12 @@ # **nodeMcu API Instruction** # [中文版本](https://github.com/funshine/nodemcu-firmware/wiki/nodemcu_api_cn) -###version 0.9.2 build 2014-11-18 +###version 0.9.2 build 2014-11-19 ###change log: +2014-11-19
+add adc module, use adc.read(0) to read adc value, no tests made.
+add wifi.sta.getap() api to wifi.sta module, to get ap list. + 2014-11-18
bug fixed: net.socket:connect() has no effect. @@ -824,6 +828,36 @@ mac address in string, for example:"18-33-44-FE-55-BB" ####See also **-** [wifi.sta.getip()](#ws_getip) + +## wifi.sta.getap() +####Description +scan and get ap list as a lua table into callback function. + +####Syntax +wifi.sta.getap(function(table)) + +####Parameters +function(table): a callback function to receive ap table when scan is done
+ this function receive a table, the key is the ssid, value is other info in format: authmode,rssi,bssid,channel + + +####Returns +nil + +####Example + +```lua + -- print ap list + function listap(t) + for k,v in pairs(t) do + print(k.." : "..v) + end + end + wifi.sta.getap(listap) +``` + +####See also +**-** [wifi.sta.getip()](#ws_getip) #wifi.ap module @@ -1728,3 +1762,23 @@ string:data received. ####See also **-** [i2c.write()](#ic_write) +#adc module +##CONSTANT +none + + +## adc.read() +####Description +read adc value of id, esp8266 has only one 10bit adc, id=0 + +####Syntax +adc.read(id) + +####Parameters +id = 0
+ +####Returns +adc value + +####See also +**-** []()