123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- -- ******************************************************
- -- LM92 module for ESP8266 with nodeMCU
- --
- -- Written by Levente Tamas <levente.tamas@navicron.com>
- --
- -- modify by Garberoglio Leonardo <leogarberoglio@gmail.com>
- --
- -- 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
|