-- ****************************************************** -- LM92 module for ESP8266 with nodeMCU -- -- Written by Levente Tamas -- -- modify by Garberoglio Leonardo -- -- GNU LGPL, see https://www.gnu.org/copyleft/lesser.html -- ****************************************************** -- Module Bits local moduleName = ... local M = {} _G[moduleName] = M -- Default ID local id = 0 -- Local vars local address = 0 -- read regs for len number of bytes -- return table with data local function read_reg(reg_addr, len) local ret={} local c i2c.start(id) i2c.address(id, address ,i2c.TRANSMITTER) i2c.write(id,reg_addr) i2c.stop(id) i2c.start(id) i2c.address(id, address,i2c.RECEIVER) c=i2c.read(id,len) for x = 1, len, 1 do local tc = string.byte(c, x) table.insert(ret, tc) end i2c.stop(id) return ret end --write reg with data table local function write_reg(reg_addr, data) i2c.start(id) i2c.address(id, address, i2c.TRANSMITTER) i2c.write(id, reg_addr) i2c.write(id, data) i2c.stop(id) end --write comparison reg with 2 bytes local function write_comp_reg(reg_addr, msb, lsb) i2c.start(id) i2c.address(id, address, i2c.TRANSMITTER) i2c.write(id, reg_addr) i2c.write(id, msb) i2c.write(id, lsb) i2c.stop(id) end -- initialize i2c -- a: i2c addr 0x48|A1<<1|A0 (A0-A1: chip pins) function M.setup(a) if (a ~= nil) and (a >= 0x48) and (a <= 0x4b ) then address = a i2c.start(id) local res = i2c.address(id, address, i2c.TRANSMITTER) --verify that the address is valid i2c.stop(id) if (res == false) then print("device not found") return nil end else print("wrong i2c address") return nil end end -- Return the temperature data function M.getTemperature() local temperature local tmp=read_reg(0x00,2) --read 2 bytes from the temperature register temperature=bit.rshift(tmp[1]*256+tmp[2],3) --lower 3 bits are status bits if (temperature>=0x1000) then temperature= temperature-0x2000 --convert the two's complement end return temperature * 0.0625 end -- Put the LM92 into shutdown mode function M.shutdown() write_reg(0x01,0x01) end -- Bring the LM92 out of shutdown mode function M.wakeup() write_reg(0x01,0x00) end -- Write the LM92 Thyst SET POINT function M.setThyst(data_wr) local tmp = data_wr / 0.0625 if (tmp>=0x1000) then tmp= tmp-0x2000 --convert the two's complement end tmp = bit.lshift(tmp,3) local lsb = bit.band(tmp, 0x00FF) tmp = bit.rshift(bit.band(tmp, 0xFF00),8) write_comp_reg(0x02,tmp, lsb) end -- Write the LM92 T_crit SET POINT function M.setTcrit(data_wr) local tmp = data_wr / 0.0625 if (tmp>=0x1000) then tmp= tmp-0x2000 --convert the two's complement end tmp = bit.lshift(tmp,3) local lsb = bit.band(tmp, 0x00FF) tmp = bit.rshift(bit.band(tmp, 0xFF00),8) write_comp_reg(0x03,tmp, lsb) end -- Write the LM92 Tlow SET POINT function M.setTlow(data_wr) local tmp = data_wr / 0.0625 if (tmp>=0x1000) then tmp= tmp-0x2000 --convert the two's complement end tmp = bit.lshift(tmp,3) local lsb = bit.band(tmp, 0x00FF) tmp = bit.rshift(bit.band(tmp, 0xFF00),8) write_comp_reg(0x04,tmp, lsb) end -- Write the LM92 T_high SET POINT function M.setThigh(data_wr) local tmp = data_wr / 0.0625 if (tmp>=0x1000) then tmp= tmp-0x2000 --convert the two's complement end tmp = bit.lshift(tmp,3) local lsb = bit.band(tmp, 0x00FF) tmp = bit.rshift(bit.band(tmp, 0xFF00),8) write_comp_reg(0x05,tmp, lsb) end -- Read the LM92 Thyst SET POINT function M.getThyst() local temperature local tmp=read_reg(0x02,2) --read 2 bytes from the Hysteresis register temperature=bit.rshift(tmp[1]*256+tmp[2],3) --lower 3 bits are status bits if (temperature>=0x1000) then temperature= temperature-0x2000 --convert the two's complement end return temperature * 0.0625 end -- Read the LM92 T_crit SET POINT function M.getTcrit() local temperature local tmp=read_reg(0x03,2) --read 2 bytes from the T Critical register temperature=bit.rshift(tmp[1]*256+tmp[2],3) --lower 3 bits are status bits if (temperature>=0x1000) then temperature= temperature-0x2000 --convert the two's complement end return temperature * 0.0625 end -- Read the LM92 Tlow SET POINT function M.getTlow() local temperature local tmp=read_reg(0x04,2) --read 2 bytes from the T Low register temperature=bit.rshift(tmp[1]*256+tmp[2],3) --lower 3 bits are status bits if (temperature>=0x1000) then temperature= temperature-0x2000 --convert the two's complement end return temperature * 0.0625 end -- Read the LM92 T_high SET POINT function M.getThigh() local temperature local tmp=read_reg(0x05,2) --read 2 bytes from the T High register temperature=bit.rshift(tmp[1]*256+tmp[2],3) --lower 3 bits are status bits if (temperature>=0x1000) then temperature= temperature-0x2000 --convert the two's complement end return temperature * 0.0625 end return M