110 lines
2.6 KiB
Lua
110 lines
2.6 KiB
Lua
-------------------------------------------------------
|
|
|
|
-- This library was written for the Texas Instruments
|
|
-- HDC1000 temperature and humidity sensor.
|
|
-- It should work for the HDC1008 too.
|
|
-- Written by Francesco Truzzi (francesco@truzzi.me)
|
|
-- Released under GNU GPL v2.0 license.
|
|
|
|
-------------------------------------------------------
|
|
|
|
-------------- NON-DEFAULT CONFIG VALUES --------------
|
|
------------- config() optional arguments -------------
|
|
|
|
-- HDC1000_HEAT_OFF 0x00 (heater)
|
|
-- HDC1000_TEMP_11BIT 0x40 (resolution)
|
|
-- HDC1000_HUMI_11BIT 0x01 (resolution)
|
|
-- HDC1000_HUMI_8BIT 0x20 (resolution)
|
|
|
|
-------------------------------------------------------
|
|
|
|
local modname = ...
|
|
local M = {}
|
|
_G[modname] = M
|
|
|
|
local id = 0
|
|
local i2c = i2c
|
|
local delay = 20000
|
|
local _drdyn_pin
|
|
|
|
local HDC1000_ADDR = 0x40
|
|
|
|
local HDC1000_TEMP = 0x00
|
|
local HDC1000_HUMI = 0x01
|
|
local HDC1000_CONFIG = 0x02
|
|
|
|
local HDC1000_HEAT_ON = 0x20
|
|
local HDC1000_TEMP_HUMI_14BIT = 0x00
|
|
|
|
-- reads 16bits from the sensor
|
|
local function read16()
|
|
i2c.start(id)
|
|
i2c.address(id, HDC1000_ADDR, i2c.RECEIVER)
|
|
data_temp = i2c.read(0, 2)
|
|
i2c.stop(id)
|
|
data = bit.lshift(string.byte(data_temp, 1, 1), 8) + string.byte(data_temp, 2, 2)
|
|
return data
|
|
end
|
|
|
|
-- sets the register to read next
|
|
local function setReadRegister(register)
|
|
i2c.start(id)
|
|
i2c.address(id, HDC1000_ADDR, i2c.TRANSMITTER)
|
|
i2c.write(id, register)
|
|
i2c.stop(id)
|
|
end
|
|
|
|
-- writes the 2 configuration bytes
|
|
local function writeConfig(config)
|
|
i2c.start(id)
|
|
i2c.address(id, HDC1000_ADDR, i2c.TRANSMITTER)
|
|
i2c.write(id, HDC1000_CONFIG, config, 0x00)
|
|
i2c.stop(id)
|
|
end
|
|
|
|
-- returns true if battery voltage is < 2.7V, false otherwise
|
|
function M.batteryDead()
|
|
setReadRegister(HDC1000_CONFIG)
|
|
return(bit.isset(read16(), 11))
|
|
|
|
end
|
|
|
|
-- initalize i2c
|
|
function M.init(sda, scl, drdyn_pin)
|
|
_drdyn_pin = drdyn_pin
|
|
i2c.setup(id, sda, scl, i2c.SLOW)
|
|
end
|
|
|
|
function M.config(addr, resolution, heater)
|
|
-- default values are set if the function is called with no arguments
|
|
HDC1000_ADDR = addr or HDC1000_ADDR
|
|
resolution = resolution or HDC1000_TEMP_HUMI_14BIT
|
|
heater = heater or HDC1000_HEAT_ON
|
|
writeConfig(bit.bor(resolution, heater))
|
|
end
|
|
|
|
-- outputs temperature in Celsius degrees
|
|
function M.getHumi()
|
|
setReadRegister(HDC1000_HUMI)
|
|
if(_drdyn_pin ~= false) then
|
|
gpio.mode(_drdyn_pin, gpio.INPUT)
|
|
while(gpio.read(_drdyn_pin)==1) do
|
|
end
|
|
else tmr.delay(delay) end
|
|
return(read16()/65535.0*100)
|
|
end
|
|
|
|
-- outputs humidity in %RH
|
|
function M.getTemp()
|
|
setReadRegister(HDC1000_TEMP)
|
|
if(_drdyn_pin ~= false) then
|
|
gpio.mode(_drdyn_pin, gpio.INPUT)
|
|
while(gpio.read(_drdyn_pin)==1) do
|
|
end
|
|
else tmr.delay(delay) end
|
|
return(read16()/65535.0*165-40)
|
|
end
|
|
|
|
return M
|
|
|