diff --git a/ds18b20.lua b/ds18b20.lua new file mode 100644 index 0000000..fac19b4 --- /dev/null +++ b/ds18b20.lua @@ -0,0 +1,138 @@ +-------------------------------------------------------------------------------- +-- DS18B20 one wire module for NODEMCU +-- NODEMCU TEAM +-- LICENCE: http://opensource.org/licenses/MIT +-- Vowstar +-- 2015/02/14 sza2 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(unit == nil or unit == C) then + t = t * 625 + elseif(unit == F) then + t = t * 1125 + 320000 + elseif(unit == K) then + t = t * 625 + 2731500 + else + return nil + end + t = t / 100 + -- print("Temperature="..t1.."."..t2.." Centigrade") + -- result = t1.."."..t2 + 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 diff --git a/mqtt.lua b/mqtt.lua index 14e9bb9..4d054c2 100644 --- a/mqtt.lua +++ b/mqtt.lua @@ -1,3 +1,7 @@ +-- Global variable +t=nil +mqttConnected = false + -- MQTT extension function startMqtt() m = mqtt.Client("wordclock", 120) @@ -34,18 +38,50 @@ function startMqtt() end) end +function readTemp() + if (t ~= nil) then + addrs=t.addrs() + -- Total DS18B20 numbers + sensors=table.getn(addrs) + local temp1=0 + if (sensors >= 1) then + temp1=t.read(addrs[1]) + end + return temp1 + else + return nil + end +end + function startMqttClient() if (mqttServer ~= nil and mqttPrefix ~= nil) then startMqtt() print "Started MQTT client" + if (file.open("ds18b20.lc")) then + t=require("ds18b20") + t.setup(2) -- GPIO4 + readTemp() -- read once, to setup chip + print "Setup temperature" + end + oldBrightness=0 + oldTemp=0 tmr.alarm(5, 5001, 1 ,function() - if (oldBrightness ~= briPercent) then - m:publish(mqttPrefix .. "/brightness", tostring(briPercent), 0, 0) - else - m:publish(mqttPrefix .. "/heap", tostring(node.heap()), 0, 0) + if (mqttConnected) then + local temp = nil + if (t ~= nil) then + temp=readTemp() + end + if (oldBrightness ~= briPercent) then + m:publish(mqttPrefix .. "/brightness", tostring(briPercent), 0, 0) + elseif (temp ~= nil and temp ~= oldTemp) then + oldTemp = temp + m:publish(mqttPrefix .. "/temp", tostring(temp), 0, 0) + else + m:publish(mqttPrefix .. "/heap", tostring(node.heap()), 0, 0) + end + oldBrightness = briPercent end - oldBrightness = briPercent end) end end