CCS811.lua 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. --- 模块功能:CCS811
  2. --- Author JWL
  3. module(..., package.seeall)
  4. require "pins"
  5. local CCS811_Add = 0x5A
  6. local STATUS_REG = 0x00
  7. local MEAS_MODE_REG = 0x01
  8. local ALG_RESULT_DATA = 0x02
  9. local ENV_DATA = 0x05
  10. local NTC_REG = 0x06
  11. local THRESHOLDS = 0x10
  12. local BASELINE = 0x11
  13. local HW_ID_REG = 0x20
  14. local ERROR_ID_REG = 0xE0
  15. local APP_START_REG = 0xF4
  16. local SW_RESET = 0xFF
  17. local CCS_811_ADDRESS = 0x5A
  18. local GPIO_WAKE = 0x5
  19. local DRIVE_MODE_IDLE = 0x0
  20. local DRIVE_MODE_1SEC = 0x10
  21. local DRIVE_MODE_10SEC = 0x20
  22. local DRIVE_MODE_60SEC = 0x30
  23. local INTERRUPT_DRIVEN = 0x8
  24. local THRESHOLDS_ENABLED = 0x4
  25. local DEV_ID = CCS811_Add
  26. local I2C_ID = 0x02
  27. local temp = 0x5a
  28. local wake_gpio = pins.setup(pio.P0_13,1)
  29. --注意 这两个函数只能在任务中调用
  30. function ON_CS()
  31. wake_gpio(0)
  32. sys.wait(20)
  33. end
  34. function OFF_CS()
  35. wake_gpio(1)
  36. sys.wait(20)
  37. end
  38. local function I2C_Open(id)
  39. if i2c.setup(id, i2c.SLOW) ~= i2c.SLOW then
  40. log.error("模块功能:CCS811", "I2C.init is: fail")
  41. i2c.close(id)
  42. return
  43. else
  44. log.error("模块功能:CCS811", "I2C.init is: succeed")
  45. end
  46. return i2c.SLOW
  47. end
  48. local function I2C_Write_Byte_CCS811(regAddress,content)
  49. i2c.send(I2C_ID, DEV_ID, {regAddress,content})
  50. end
  51. local function I2C_Read_Bytes_CCS811(regAddress,rdcnt)
  52. i2c.send(I2C_ID, DEV_ID, regAddress)
  53. return i2c.recv(I2C_ID, DEV_ID, rdcnt)
  54. end
  55. sys.taskInit(function()
  56. sys.wait(2000)
  57. I2C_Open(I2C_ID)
  58. sys.wait(500)
  59. local tinfo={}
  60. ON_CS()
  61. table.insert(tinfo,I2C_Read_Bytes_CCS811(0x20,1))
  62. table.insert(tinfo,I2C_Read_Bytes_CCS811(0x23,2))
  63. table.insert(tinfo,I2C_Read_Bytes_CCS811(0x24,2))
  64. local sinfo= table.concat(tinfo) or ""
  65. if #sinfo ==0 then
  66. log.info("[CCS811]","can not read ,please cheack hardware!" )
  67. return
  68. end
  69. log.info("[CCS811]","sinfo=", sinfo:toHex() )
  70. local Status = I2C_Read_Bytes_CCS811(0x00,1)
  71. if bit.band(Status:byte(1),0x10) >0 then
  72. log.info("[CCS811]","&temp", nil )
  73. I2C_Write_Byte_CCS811(0xF4,nil)
  74. end
  75. I2C_Write_Byte_CCS811(0x01, 0x10)
  76. local MeasureMode = I2C_Read_Bytes_CCS811(0x01,1)
  77. log.info("[CCS811]","Status, MeasureMode", string.format( "hex Status=%02X, MeasureMode=%02X", Status:byte(1), MeasureMode:byte(1)))
  78. OFF_CS()
  79. log.info("[CCS811]","-----------------------------------------------------------------------")
  80. while true do
  81. ON_CS()
  82. local Status = I2C_Read_Bytes_CCS811(0x00,1)
  83. local Error_ID = I2C_Read_Bytes_CCS811(0xE0,1)
  84. local BUF = I2C_Read_Bytes_CCS811(0x02,8)
  85. local tmpid= I2C_Read_Bytes_CCS811(0x20,1)
  86. OFF_CS()
  87. log.info("[CCS811]", string.format( "hex Status=%02X, Error_ID=%02X, tmpid=%02X", Status:byte(1), Error_ID:byte(1), tmpid:byte(1)))
  88. if BUF ~=nil then
  89. log.info("[CCS811]","BUF:TOHEX",BUF:toHex())
  90. local eco2 = BUF:byte(1)
  91. eco2 = eco2 * 256 + BUF:byte(2)
  92. local tvoc = BUF:byte(3)
  93. tvoc = tvoc * 256 + BUF:byte(4)
  94. log.info("[CCS811]","eco2, tvoc", eco2, tvoc)
  95. end
  96. sys.wait(2000)
  97. end
  98. end)