ds18b20: negatives handled

This commit is contained in:
Vladimir Dronnikov 2015-01-31 11:27:24 +03:00
parent 278e3541d3
commit 169699b93a
1 changed files with 27 additions and 19 deletions

View File

@ -5,10 +5,11 @@
-- Vladimir Dronnikov <dronnikov@gmail.com> -- Vladimir Dronnikov <dronnikov@gmail.com>
-- --
-- Example: -- Example:
-- for k, v in pairs(require("ds18b20").read(4)) do print(k, v) end -- require("ds18b20").read(4, function(r) for k, v in pairs(r) do print(k, v) end end)
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
local M local M
do do
local bit = bit
local format_addr = function(a) local format_addr = function(a)
return ("%02x-%02x%02x%02x%02x%02x%02x"):format( return ("%02x-%02x%02x%02x%02x%02x%02x"):format(
a:byte(1), a:byte(1),
@ -16,7 +17,7 @@ do
a:byte(4), a:byte(3), a:byte(2) a:byte(4), a:byte(3), a:byte(2)
) )
end end
local read = function(pin, delay) local read = function(pin, cb, delay)
local ow = require("ow") local ow = require("ow")
-- get list of relevant devices -- get list of relevant devices
local d = { } local d = { }
@ -37,25 +38,32 @@ do
ow.skip(pin) ow.skip(pin)
ow.write(pin, 0x44, 1) ow.write(pin, 0x44, 1)
-- wait a bit -- wait a bit
tmr.delay(delay or 100000) tmr.alarm(0, delay or 100, 0, function()
-- iterate over devices -- iterate over devices
local r = { } local r = { }
for i = 1, #d do for i = 1, #d do
tmr.wdclr() tmr.wdclr()
-- read rom command -- read rom command
ow.reset(pin) ow.reset(pin)
ow.select(pin, d[i]) ow.select(pin, d[i])
ow.write(pin, 0xBE, 1) ow.write(pin, 0xBE, 1)
-- read data -- read data
local x = ow.read_bytes(pin, 9) local x = ow.read_bytes(pin, 9)
if ow.crc8(x) == 0 then if ow.crc8(x) == 0 then
local t = (x:byte(1) + x:byte(2) * 256) * 625 local t = (x:byte(1) + x:byte(2) * 256)
-- NB: temperature in Celcius * 10^4 -- negatives?
r[format_addr(d[i])] = t if bit.isset(t, 15) then t = 1 - bit.bxor(t, 0xffff) end
d[i] = nil -- NB: temperature in Celsius * 10^4
t = t * 625
-- NB: due 850000 means bad pullup. ignore
if t ~= 850000 then
r[format_addr(d[i])] = t
end
d[i] = nil
end
end end
end cb(r)
return r end)
end end
-- expose -- expose
M = { M = {