diff --git a/lua_modules/lm92/README.md b/lua_modules/lm92/README.md new file mode 100644 index 00000000..261e1ebe --- /dev/null +++ b/lua_modules/lm92/README.md @@ -0,0 +1,98 @@ +# LM92 module +This module adds basic support for the LM92 +-0.33C 12bit+sign temperature sensor. More details in the [datasheet](http://www.ti.com/lit/ds/symlink/lm92.pdf). +Works: +- getting the temperature +- entering the chip's to shutdown mode (350uA -> 5uA power consumption) +- waking up the chip from shutdown + +##Require +```lua +LM92 = require("lm92") +``` +## Release +```lua +LM92 = nil +package.loaded["lm92"]=nil +``` + +##init() +####Description +Setting the i2c pins and address for lm92. + +####Syntax +init(sda, scl, address) + +####Parameters +sda: 1~12, IO index.
+scl: 1~12, IO index.
+address: 0x48~0x4b, i2c address (depends on tha A0~A1 pins) +####Returns +nil + +####Example +```lua +LM92 = require("lm92") +gpio0 = 3 +gpio2 = 4 +sda = gpio0 +scl = gpio2 +addr = 0x48 +LM92.init(sda, scl,addr) +``` +##getTemperature() +####Description +Returns the temperature register's content. + +####Syntax +getTemperature() + +####Parameters +- + +####Returns +Temperature in degree Celsius. + +####Example +```lua +t = LM92.getTemperature() +print("Got temperature: "..t.." C") +``` + +##wakeup() +####Description +Makes the chip exit the low power shutdown mode. + +####Syntax +wakeup() + +####Parameters +- + +####Returns +- + +####Example +```lua +LM92.wakeup() +tmr.delay( 1 * 1000 * 1000 ) +``` + +##shutdown() +####Description +Makes the chip enter the low power shutdown mode. + +####Syntax +shutdown() + +####Parameters +- + +####Returns +- + +####Example +```lua +LM92.shutdown() +``` +#### TODO: +- add full support of the features, including interrupt and critical alert support diff --git a/lua_modules/lm92/lm92.lua b/lua_modules/lm92/lm92.lua new file mode 100644 index 00000000..fcec7098 --- /dev/null +++ b/lua_modules/lm92/lm92.lua @@ -0,0 +1,94 @@ +-- ****************************************************** +-- LM92 module for ESP8266 with nodeMCU +-- +-- Written by Levente Tamas +-- +-- 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 + local x + 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 + 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 + +-- initialize i2c +-- d: sda +-- c: scl +-- a: i2c addr 0x48|A1<<1|A0 (A0-A1: chip pins) +function M.init(d,c,a) +if (d ~= nil) and (c ~= nil) and (d >= 0) and (d <= 11) and (c >= 0) and ( c <= 11) and (d ~= l) and (a ~= nil) and (a >= 0x48) and (a <= 0x4b ) then + sda = d + scl = c + address = a + i2c.start(id) + 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("i2c configuration failed") return nil + end + i2c.setup(id,sda,scl,i2c.SLOW) +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 + + +return M \ No newline at end of file