-- routines for ccs811, please load ccs811_setup.lua first -- user defined function: read 1 byte of data from device function read_reg(id, dev_addr, reg_addr, len) i2c.start(id) i2c.address(id, dev_addr, i2c.TRANSMITTER) i2c.write(id, reg_addr) i2c.stop(id) i2c.start(id) i2c.address(id, dev_addr, i2c.RECEIVER) c = i2c.read(id, len) i2c.stop(id) return c end -- user defined function: write some data to device -- with address dev_addr starting from reg_addr function write_reg(id, dev_addr, reg_addr, data) i2c.start(id) i2c.address(id, dev_addr, i2c.TRANSMITTER) i2c.write(id, reg_addr) c = i2c.write(id, data) i2c.stop(id) return c end function ccs811_readStatus() local reg = read_reg(0,ADDR_CCS811, CCS811_STATUS,1) -- print("Status: "..string.byte(reg)) return reg end function ccs811_readHW() reg=read_reg(0,ADDR_CCS811, CCS811_HW_ID,1) print("HW-ID: "..string.byte(reg)) reg=read_reg(0,ADDR_CCS811, CCS811_HW_VERSION,1) print("HW-Version: "..string.byte(reg)) end function ccs811_reset() -- resets the device local ret = write_reg(0, ADDR_CCS811, CCS811_SW_RESET, {0x11, 0xE5, 0x72, 0x8A}) print("reset bytes written: ".. ret) tmr.delay(CCS811_WAIT_AFTER_RESET_US) -- and put it into app mode local ret = write_reg(0, ADDR_CCS811, CCS811_APP_START, {}) tmr.delay(CCS811_WAIT_AFTER_APPSTART_US) -- Check if the switch was successful local status = read_reg(0, ADDR_CCS811, CCS811_STATUS, 1); if( string.byte(status)~=0x90 ) then print("ccs811: Not in app mode, or no valid app: "..string.byte(status)) end -- and set measure mode (DRIVE_MODE) to 001 -> measurement every second ret=write_reg(0, ADDR_CCS811, CCS811_MEAS_MODE, 0x10) print("reset measure mode bytes written: ".. ret) end function css811_readAppVersion() local reg = read_reg(0,ADDR_CCS811, CCS811_FW_APP_VERSION,2) print("AppVersion: "..string.byte(reg,1).."."..string.byte(reg,2)) end function css811_readENV_DATA() local reg = read_reg(0,ADDR_CCS811, CCS811_ENV_DATA,4) return reg end function css811_writeEnvData(hum, temp) local reg=css811_readENV_DATA() print("ENV_DATA before: hum="..string.byte(reg,1).." "..string.byte(reg,2).." temp="..string.byte(reg,3).." "..string.byte(reg,4)) -- see datasheet for calculations local phum=math.floor(hum*2) -- we only use the integer part local ptemp=math.floor(temp+25) local data={phum, 0, ptemp, 0} local ret = write_reg(0, ADDR_CCS811, CCS811_ENV_DATA, data) print(" bytes written "..ret) print ("write to ENV_DATA: hum="..phum.." temp="..ptemp) local ret=css811_readENV_DATA() print("ENV_DATA after: hum="..string.byte(ret,1).." "..string.byte(ret,2).." temp="..string.byte(ret,3).." "..string.byte(ret,4)) end function css811_readData() -- local ret = ccs811_readStatus() -- print("Status before read: "..string.byte(ret)) local erg = read_reg(0, ADDR_CCS811, CCS811_ALG_RESULT_DATA, 8) -- we only need the 4 MSB bytes from the proxy register _CO2 =string.byte(erg,1)*256+string.byte(erg,2) _TVOC=string.byte(erg,3)*256+string.byte(erg,4) print("ccs811 CO2 :".._CO2) print("ccs811 TVOC:".._TVOC) tmr.delay(1000) -- 1ms delay for new conversion return erg end ccs811_reset() ccs811_readHW() css811_readAppVersion()