| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- --- 模块功能:CCS811
- --- Author JWL
- module(..., package.seeall)
- require "pins"
- local CCS811_Add = 0x5A
- local STATUS_REG = 0x00
- local MEAS_MODE_REG = 0x01
- local ALG_RESULT_DATA = 0x02
- local ENV_DATA = 0x05
- local NTC_REG = 0x06
- local THRESHOLDS = 0x10
- local BASELINE = 0x11
- local HW_ID_REG = 0x20
- local ERROR_ID_REG = 0xE0
- local APP_START_REG = 0xF4
- local SW_RESET = 0xFF
- local CCS_811_ADDRESS = 0x5A
- local GPIO_WAKE = 0x5
- local DRIVE_MODE_IDLE = 0x0
- local DRIVE_MODE_1SEC = 0x10
- local DRIVE_MODE_10SEC = 0x20
- local DRIVE_MODE_60SEC = 0x30
- local INTERRUPT_DRIVEN = 0x8
- local THRESHOLDS_ENABLED = 0x4
- local DEV_ID = CCS811_Add
- local I2C_ID = 0x02
- local temp = 0x5a
-
- local wake_gpio = pins.setup(pio.P0_13,1)
- --注意 这两个函数只能在任务中调用
- function ON_CS()
- wake_gpio(0)
- sys.wait(20)
- end
- function OFF_CS()
- wake_gpio(1)
- sys.wait(20)
- end
- local function I2C_Open(id)
- if i2c.setup(id, i2c.SLOW) ~= i2c.SLOW then
- log.error("模块功能:CCS811", "I2C.init is: fail")
- i2c.close(id)
- return
- else
- log.error("模块功能:CCS811", "I2C.init is: succeed")
- end
- return i2c.SLOW
- end
- local function I2C_Write_Byte_CCS811(regAddress,content)
- i2c.send(I2C_ID, DEV_ID, {regAddress,content})
- end
- local function I2C_Read_Bytes_CCS811(regAddress,rdcnt)
- i2c.send(I2C_ID, DEV_ID, regAddress)
- return i2c.recv(I2C_ID, DEV_ID, rdcnt)
- end
- sys.taskInit(function()
- sys.wait(2000)
- I2C_Open(I2C_ID)
- sys.wait(500)
- local tinfo={}
- ON_CS()
- table.insert(tinfo,I2C_Read_Bytes_CCS811(0x20,1))
- table.insert(tinfo,I2C_Read_Bytes_CCS811(0x23,2))
- table.insert(tinfo,I2C_Read_Bytes_CCS811(0x24,2))
- local sinfo= table.concat(tinfo) or ""
- if #sinfo ==0 then
- log.info("[CCS811]","can not read ,please cheack hardware!" )
- return
- end
- log.info("[CCS811]","sinfo=", sinfo:toHex() )
- local Status = I2C_Read_Bytes_CCS811(0x00,1)
- if bit.band(Status:byte(1),0x10) >0 then
- log.info("[CCS811]","&temp", nil )
- I2C_Write_Byte_CCS811(0xF4,nil)
- end
- I2C_Write_Byte_CCS811(0x01, 0x10)
- local MeasureMode = I2C_Read_Bytes_CCS811(0x01,1)
- log.info("[CCS811]","Status, MeasureMode", string.format( "hex Status=%02X, MeasureMode=%02X", Status:byte(1), MeasureMode:byte(1)))
- OFF_CS()
- log.info("[CCS811]","-----------------------------------------------------------------------")
- while true do
- ON_CS()
- local Status = I2C_Read_Bytes_CCS811(0x00,1)
- local Error_ID = I2C_Read_Bytes_CCS811(0xE0,1)
- local BUF = I2C_Read_Bytes_CCS811(0x02,8)
- local tmpid= I2C_Read_Bytes_CCS811(0x20,1)
- OFF_CS()
- log.info("[CCS811]", string.format( "hex Status=%02X, Error_ID=%02X, tmpid=%02X", Status:byte(1), Error_ID:byte(1), tmpid:byte(1)))
- if BUF ~=nil then
- log.info("[CCS811]","BUF:TOHEX",BUF:toHex())
- local eco2 = BUF:byte(1)
- eco2 = eco2 * 256 + BUF:byte(2)
- local tvoc = BUF:byte(3)
- tvoc = tvoc * 256 + BUF:byte(4)
- log.info("[CCS811]","eco2, tvoc", eco2, tvoc)
- end
- sys.wait(2000)
- end
- end)
|