Merge pull request #138 from dvv/master

some example modules added
This commit is contained in:
Vowstar 2015-01-26 19:53:04 +08:00
commit d5047d66fb
4 changed files with 152 additions and 9 deletions

View File

@ -0,0 +1,84 @@
------------------------------------------------------------------------------
-- DHT11/22 query module
--
-- LICENCE: http://opensource.org/licenses/MIT
-- Vladimir Dronnikov <dronnikov@gmail.com>
--
-- Example:
-- print("DHT11", require("dht22").read(4))
-- print("DHT22", require("dht22").read(4, true))
-- NB: the very first read sometimes fails
------------------------------------------------------------------------------
local M
do
-- cache
local gpio = gpio
local val = gpio.read
local waitus = tmr.delay
--
local read = function(pin, dht22)
-- wait for pin value
local w = function(v)
local c = 255
while c > 0 and val(pin) ~= v do c = c - 1 end
return c
end
-- NB: we preallocate incoming data buffer
-- or precise timing in reader gets broken
local b = { 0, 0, 0, 0, 0 }
-- kick the device
gpio.mode(pin, gpio.INPUT, gpio.PULLUP)
gpio.write(pin, 1)
waitus(10)
gpio.mode(pin, gpio.OUTPUT)
gpio.write(pin, 0)
waitus(20000)
gpio.write(pin, 1)
gpio.mode(pin, gpio.INPUT, gpio.PULLUP)
-- wait for device presense
if w(0) == 0 or w(1) == 0 or w(0) == 0 then
return nil, 0
end
-- receive 5 octets of data, msb first
for i = 1, 5 do
local x = 0
for j = 1, 8 do
x = x + x
if w(1) == 0 then return nil, 1 end
-- 70us for 1, 27 us for 0
waitus(30)
if val(pin) == 1 then
x = x + 1
if w(0) == 0 then return nil, 2 end
end
end
b[i] = x
end
-- check crc. NB: calculating in receiver loop breaks timings
local crc = 0
for i = 1, 4 do
crc = (crc + b[i]) % 256
end
if crc ~= b[5] then return nil, 3 end
-- convert
local t, h
-- DHT22: values in tenths of unit, temperature can be negative
if dht22 then
h = b[1] * 256 + b[2]
t = b[3] * 256 + b[4]
if t > 0x8000 then t = -(t - 0x8000) end
-- DHT11: no negative temperatures, only integers
-- NB: return in 0.1 Celsius
else
h = 10 * b[1]
t = 10 * b[3]
end
return t, h
end
-- expose interface
M = {
read = read,
}
end
return M

View File

@ -0,0 +1,65 @@
------------------------------------------------------------------------------
-- DS18B20 query module
--
-- LICENCE: http://opensource.org/licenses/MIT
-- Vladimir Dronnikov <dronnikov@gmail.com>
--
-- Example:
-- for k, v in pairs(require("ds18b20").read(4)) do print(k, v) end
------------------------------------------------------------------------------
local M
do
local format_addr = function(a)
return ("%02x-%02x%02x%02x%02x%02x%02x"):format(
a:byte(1),
a:byte(7), a:byte(6), a:byte(5),
a:byte(4), a:byte(3), a:byte(2)
)
end
local read = function(pin, delay)
local ow = require("ow")
-- get list of relevant devices
local d = { }
ow.setup(pin)
ow.reset_search(pin)
while true do
tmr.wdclr()
local a = ow.search(pin)
if not a then break end
if ow.crc8(a) == 0 and
(a:byte(1) == 0x10 or a:byte(1) == 0x28)
then
d[#d + 1] = a
end
end
-- conversion command for all
ow.reset(pin)
ow.skip(pin)
ow.write(pin, 0x44, 1)
-- wait a bit
tmr.delay(delay or 100000)
-- iterate over devices
local r = { }
for i = 1, #d do
tmr.wdclr()
-- read rom command
ow.reset(pin)
ow.select(pin, d[i])
ow.write(pin, 0xBE, 1)
-- read data
local x = ow.read_bytes(pin, 9)
if ow.crc8(x) == 0 then
local t = (x:byte(1) + x:byte(2) * 256) * 625
-- NB: temperature in Celcius * 10^4
r[format_addr(d[i])] = t
d[i] = nil
end
end
return r
end
-- expose
M = {
read = read,
}
end
return M

View File

@ -6,9 +6,8 @@
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
require("http").createServer(80, function(req, res) require("http").createServer(80, function(req, res)
-- analyse method and url -- analyse method and url
print("+R", req.method, req.url) print("+R", req.method, req.url, node.heap())
-- setup handler of headers, if any -- setup handler of headers, if any
--[[
req.onheader = function(self, name, value) req.onheader = function(self, name, value)
-- print("+H", name, value) -- print("+H", name, value)
-- E.g. look for "content-type" header, -- E.g. look for "content-type" header,
@ -34,8 +33,7 @@ require("http").createServer(80, function(req, res)
res:finish() res:finish()
end end
end end
]]
-- or just do something not waiting till body (if any) comes -- or just do something not waiting till body (if any) comes
--res:finish("Hello, world!") --res:finish("Hello, world!")
res:finish("Salut, monde!") --res:finish("Salut, monde!")
end) end)

View File

@ -87,8 +87,6 @@ do
return res return res
end end
tmr.wdclr()
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
-- HTTP parser -- HTTP parser
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
@ -190,8 +188,6 @@ do
end end
end end
tmr.wdclr()
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
-- HTTP server -- HTTP server
------------------------------------------------------------------------------ ------------------------------------------------------------------------------