From b798580fa0394a36b7ea895336f43515f342229b Mon Sep 17 00:00:00 2001 From: funshine Date: Tue, 11 Nov 2014 12:31:45 +0800 Subject: [PATCH] 6 channel pwm, add file.seek() --- 0.9.2/512k-flash/eagle.app.v6.flash.bin | Bin 45744 -> 45824 bytes 0.9.2/512k-flash/eagle.app.v6.irom0text.bin | Bin 251492 -> 251628 bytes README.html | 1209 +++++++++++-------- README.md | 40 + 4 files changed, 717 insertions(+), 532 deletions(-) diff --git a/0.9.2/512k-flash/eagle.app.v6.flash.bin b/0.9.2/512k-flash/eagle.app.v6.flash.bin index 0f5d495f0bcd819cafd50df885eccb9a73938746..9c2632bc26b2767a213ec4d720012cd7284e9263 100644 GIT binary patch delta 4213 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 JLnof<{{vC}oU8x< delta 4107 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 delta 25518 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 diff --git a/README.html b/README.html index 1bb30d0a..a777785e 100644 --- a/README.html +++ b/README.html @@ -999,9 +999,77 @@ body .markdown-body page-break-after: avoid; } } -README

nodeMcu API Instruction

+README

nodeMcu API Instruction

version 0.2 2014-11-10

change log:

+

2014-11-11

+add file.seek() api to file module

+now max 6 pwm channel is supported

2014-11-10

change log module to file module

now file operation support multiple read/write

@@ -1070,8 +1138,9 @@ blank.bin: 0x7e000

Returns

nil

Example

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

See also

-

@@ -1087,8 +1156,9 @@ blank.bin: 0x7e000

Returns

nil

Example

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

See also

-

@@ -1103,8 +1173,9 @@ blank.bin: 0x7e000

Returns

number:chip ID

Example

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

See also

-

@@ -1119,8 +1190,9 @@ blank.bin: 0x7e000

Returns

number: system heap size left in bytes

Example

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

See also

-

@@ -1137,8 +1209,9 @@ 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

-

@@ -1154,9 +1227,10 @@ 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

-

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

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

@@ -1197,11 +1272,12 @@ 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()

@@ -1217,11 +1293,12 @@ 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()

@@ -1237,11 +1314,12 @@ mode:

Returns

file content in string, line by line

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

@@ -1258,12 +1336,13 @@ mode:

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

@@ -1280,12 +1359,13 @@ 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()

@@ -1301,847 +1381,912 @@ 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()

- file.writeline()

-

-

file.list()

+

+

file.seek()

Description

-

list all files.

+

Sets and gets the file position, measured from the beginning of the file, to the position given by offset plus a base specified by the string whence.

Syntax

-

file.list()

+

file.seek(whence, offset)

Parameters

-

nil

+

whence:

+“set”: base is position 0 (beginning of the file);

+“cur”: base is current position;(default value)

+“end”: base is end of file;

+offset: default 0

Returns

-

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

+

success: returns the final file position

+fail: returns nil

Example

-
    l = file.list();
-    for k,v in l do
-      print("name:"..k..", size:"..v)
-    end
-
+
    -- 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()

+- file.writeline()

+

+

file.list()

+

Description

+

list all files.

+

Syntax

+

file.list()

+

Parameters

+

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

See also

- file.remove()

wifi module

CONSTANT

wifi.STATION, wifi.SOFTAP, wifi.STATIONAP

wifi.setmode(mode)

-

Description

+

Description

setup wifi operation mode.

-

Syntax

+

Syntax

wifi.setmode(mode)

-

Parameters

+

Parameters

mode: value should be: wifi.STATION, wifi.SOFTAP or wifi.STATIONAP

-

Returns

+

Returns

current mode after setup

-

Example

-
    wifi.setmode(wifi.STATION)
-
+

Example

+
    wifi.setmode(wifi.STATION)
+
-

See also

+ +

See also

- wifi.getmode()

wifi.getmode(mode)

-

Description

+

Description

get wifi operation mode.

-

Syntax

+

Syntax

wifi.getmode()

-

Parameters

+

Parameters

nil

-

Returns

+

Returns

wifi operation mode

-

Example

-
    print(wifi.getmode())
-
+

Example

+
    print(wifi.getmode())
+
-

See also

+ +

See also

- wifi.setmode()

wifi.startsmart()

-

Description

+

Description

starts to auto configuration, if success set up ssid and pwd automatically .

-

Syntax

+

Syntax

wifi.startsmart(channel, function succeed_callback())

-

Parameters

+

Parameters

channel: 1~13, startup channel for searching, if nil, default to 6. 20 seconds for each channel.

succeed_callback: callback function called after configuration, which is called when got password and connected to AP.

-

Returns

-

nil

-

Example

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

See also

-

- wifi.stopsmart()

-

-

wifi.stopsmart()

-

Description

-

stop the configuring process.

-

Syntax

-

wifi.stopsmart()

-

Parameters

-

nil

Returns

nil

Example

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

See also

+

- wifi.stopsmart()

+

+

wifi.stopsmart()

+

Description

+

stop the configuring process.

+

Syntax

+

wifi.stopsmart()

+

Parameters

+

nil

+

Returns

+

nil

+

Example

+
    wifi.stopsmart()
+
+ + +

See also

- wifi.startsmart()

wifi.sta module

wifi.sta.config()

-

Description

+

Description

set ssid and password in station mode.

-

Syntax

+

Syntax

wifi.sta.config(ssid, password)

-

Parameters

+

Parameters

ssid: string which is less than 32 bytes.

password: string which is less than 64 bytes.

-

Returns

+

Returns

nil

-

Example

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

Example

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

See also

+ +

See also

- wifi.sta.connect()

- wifi.sta.disconnect()

wifi.sta.connect()

-

Description

-

connect to AP in station mode.

-

Syntax

-

wifi.sta.connect()

-

Parameters

-

nil

-

Returns

-

nil

-

Example

-
    wifi.sta.connect()
-
- -

See also

-

- wifi.sta.disconnect()

-- wifi.sta.config()

-

-

wifi.sta.disconnect()

Description

-

disconnect from AP in station mode.

+

connect to AP in station mode.

Syntax

-

wifi.sta.disconnect()

+

wifi.sta.connect()

Parameters

nil

Returns

nil

Example

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

See also

+

- wifi.sta.disconnect()

+- wifi.sta.config()

+

+

wifi.sta.disconnect()

+

Description

+

disconnect from AP in station mode.

+

Syntax

+

wifi.sta.disconnect()

+

Parameters

+

nil

+

Returns

+

nil

+

Example

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

See also

- wifi.sta.config()

- wifi.sta.connect()

wifi.sta.autoconnect()

-

Description

+

Description

auto connect to AP in station mode.

-

Syntax

+

Syntax

wifi.sta.autoconnect(auto)

-

Parameters

+

Parameters

auto: 0 to disable auto connecting. 1 to enable auto connecting

-

Returns

+

Returns

nil

-

Example

-
    wifi.sta.autoconnect()
-
+

Example

+
    wifi.sta.autoconnect()
+
-

See also

+ +

See also

- wifi.sta.config()

- wifi.sta.connect()

- wifi.sta.disconnect()

wifi.sta.getip()

-

Description

-

get ip address in station mode.

-

Syntax

-

wifi.sta.getip()

-

Parameters

-

nil

-

Returns

-

ip address in string, for example:”192.168.0.111”

-

Example

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

See also

-

- wifi.sta.getmac()

-

-

wifi.sta.getmac()

Description

-

get mac address in station mode.

+

get ip address in station mode.

Syntax

-

wifi.sta.getmac()

+

wifi.sta.getip()

Parameters

nil

Returns

-

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

+

ip address in string, for example:”192.168.0.111”

Example

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

See also

+

- wifi.sta.getmac()

+

+

wifi.sta.getmac()

+

Description

+

get mac address in station mode.

+

Syntax

+

wifi.sta.getmac()

+

Parameters

+

nil

+

Returns

+

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

+

Example

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

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 )
+
    -- print "hello world" every 1000ms
+    tmr.alarm(1000, 1, function() print("hello world") end )
+
- -- something else - - -- stop alarm - tmr.stop() -

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

+

See also

- i2c.write()

\ No newline at end of file diff --git a/README.md b/README.md index 5c839a54..6cf8eed8 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ ###version 0.2 2014-11-10 ###change log: +2014-11-11
+add file.seek() api to file module
+now max 6 pwm channel is supported
+ 2014-11-10
change log module to file module
now file operation support multiple read/write
@@ -411,6 +415,42 @@ nil **-** [file.open()](#fl_open)
**-** [file.writeline()](#fl_writeline) + +## file.seek() +####Description +Sets and gets the file position, measured from the beginning of the file, to the position given by offset plus a base specified by the string whence. + +####Syntax +file.seek(whence, offset) + +####Parameters +whence:
+"set": base is position 0 (beginning of the file);
+"cur": base is current position;(default value)
+"end": base is end of file;
+offset: default 0 + +####Returns +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() +``` + +####See also +**-** [file.open()](#fl_open)
+**-** [file.writeline()](#fl_writeline) + ## file.list() ####Description