123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- -- ***************************************************************************
- -- SI7021 module for ESP8266 with nodeMCU
- -- Si7021 compatible tested 2015-1-22
- --
- -- Written by VIP6
- --
- -- MIT license, http://opensource.org/licenses/MIT
- -- ***************************************************************************
- local moduleName = ...
- local M = {}
- _G[moduleName] = M
- --I2C slave address of Si70xx
- local Si7021_ADDR = 0x40
- --Commands
- local CMD_MEASURE_HUMIDITY_HOLD = 0xE5
- local CMD_MEASURE_HUMIDITY_NO_HOLD = 0xF5
- local CMD_MEASURE_TEMPERATURE_HOLD = 0xE3
- local CMD_MEASURE_TEMPERATURE_NO_HOLD = 0xF3
- -- temperature and pressure
- local t,h
- local init = false
- -- i2c interface ID
- local id = 0
- -- 16-bit two's complement
- -- value: 16-bit integer
- local function twoCompl(value)
- if value > 32767 then value = -(65535 - value + 1)
- end
- return value
- end
- -- read data from si7021
- -- ADDR: slave address
- -- commands: Commands of si7021
- -- length: bytes to read
- local function read_data(ADDR, commands, length)
- i2c.start(id)
- i2c.address(id, ADDR, i2c.TRANSMITTER)
- i2c.write(id, commands)
- i2c.stop(id)
- i2c.start(id)
- i2c.address(id, ADDR,i2c.RECEIVER)
- tmr.delay(20000)
- c = i2c.read(id, length)
- i2c.stop(id)
- return c
- end
- -- initialize module
- -- sda: SDA pin
- -- scl SCL pin
- function M.init(sda, scl)
- i2c.setup(id, sda, scl, i2c.SLOW)
- --print("i2c ok..")
- init = true
- end
- -- read humidity from si7021
- local function read_humi()
- dataH = read_data(Si7021_ADDR, CMD_MEASURE_HUMIDITY_HOLD, 2)
- UH = string.byte(dataH, 1) * 256 + string.byte(dataH, 2)
- h = ((UH*12500+65536/2)/65536 - 600)
- return(h)
- end
- -- read temperature from si7021
- local function read_temp()
- dataT = read_data(Si7021_ADDR, CMD_MEASURE_TEMPERATURE_HOLD, 2)
- UT = string.byte(dataT, 1) * 256 + string.byte(dataT, 2)
- t = ((UT*17572+65536/2)/65536 - 4685)
- return(t)
- end
- -- read temperature and humidity from si7021
- function M.read()
- if (not init) then
- print("init() must be called before read.")
- else
- read_humi()
- read_temp()
- end
- end;
- -- get humidity
- function M.getHumidity()
- return h
- end
- -- get temperature
- function M.getTemperature()
- return t
- end
- return M
|