123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- --------------------------------------------------------------------------------
- -- DS18B20 one wire module for NODEMCU
- -- NODEMCU TEAM
- -- LICENCE: http://opensource.org/licenses/MIT
- -- Vowstar <vowstar@nodemcu.com>
- -- 2015/02/14 sza2 <sza2trash@gmail.com> Fix for negative values
- --------------------------------------------------------------------------------
- -- Set module name as parameter of require
- local modname = ...
- local M = {}
- _G[modname] = M
- --------------------------------------------------------------------------------
- -- Local used variables
- --------------------------------------------------------------------------------
- -- DS18B20 dq pin
- local pin = nil
- -- DS18B20 default pin
- local defaultPin = 9
- --------------------------------------------------------------------------------
- -- Local used modules
- --------------------------------------------------------------------------------
- -- Table module
- local table = table
- -- String module
- local string = string
- -- One wire module
- local ow = ow
- -- Timer module
- local tmr = tmr
- -- Limited to local environment
- setfenv(1,M)
- --------------------------------------------------------------------------------
- -- Implementation
- --------------------------------------------------------------------------------
- C = 0
- F = 1
- K = 2
- function setup(dq)
- pin = dq
- if(pin == nil) then
- pin = defaultPin
- end
- ow.setup(pin)
- end
- function addrs()
- setup(pin)
- tbl = {}
- ow.reset_search(pin)
- repeat
- addr = ow.search(pin)
- if(addr ~= nil) then
- table.insert(tbl, addr)
- end
- tmr.wdclr()
- until (addr == nil)
- ow.reset_search(pin)
- return tbl
- end
- function readNumber(addr, unit)
- result = nil
- setup(pin)
- flag = false
- if(addr == nil) then
- ow.reset_search(pin)
- count = 0
- repeat
- count = count + 1
- addr = ow.search(pin)
- tmr.wdclr()
- until((addr ~= nil) or (count > 100))
- ow.reset_search(pin)
- end
- if(addr == nil) then
- return result
- end
- crc = ow.crc8(string.sub(addr,1,7))
- if (crc == addr:byte(8)) then
- if ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then
- -- print("Device is a DS18S20 family device.")
- ow.reset(pin)
- ow.select(pin, addr)
- ow.write(pin, 0x44, 1)
- -- tmr.delay(1000000)
- present = ow.reset(pin)
- ow.select(pin, addr)
- ow.write(pin,0xBE,1)
- -- print("P="..present)
- data = nil
- data = string.char(ow.read(pin))
- for i = 1, 8 do
- data = data .. string.char(ow.read(pin))
- end
- -- print(data:byte(1,9))
- crc = ow.crc8(string.sub(data,1,8))
- -- print("CRC="..crc)
- if (crc == data:byte(9)) then
- t = (data:byte(1) + data:byte(2) * 256)
- if (t > 32767) then
- t = t - 65536
- end
- if (addr:byte(1) == 0x28) then
- t = t * 625 -- DS18B20, 4 fractional bits
- else
- t = t * 5000 -- DS18S20, 1 fractional bit
- end
- if(unit == nil or unit == 'C') then
- -- do nothing
- elseif(unit == 'F') then
- t = t * 1.8 + 320000
- elseif(unit == 'K') then
- t = t + 2731500
- else
- return nil
- end
- t = t / 10000
- return t
- end
- tmr.wdclr()
- else
- -- print("Device family is not recognized.")
- end
- else
- -- print("CRC is not valid!")
- end
- return result
- end
- function read(addr, unit)
- t = readNumber(addr, unit)
- if (t == nil) then
- return nil
- else
- return t
- end
- end
- -- Return module table
- return M
|