SHT30.lua 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. --- 模块功能:SHT30温湿度传感器
  2. -- @author LALALALA
  3. -- @module SHT30
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2021.6.2
  7. module(..., package.seeall)
  8. require "utils"
  9. require "pm"
  10. pm.wake("WORK") -- 模块保持唤醒
  11. local i2cId = 2 -- core 0025版本之前,0、1、2都表示i2c 2
  12. -- core 0025以及之后的版本,1、2、3分别表示i2c 1、2、3
  13. local function crc_8(data) -- SHT30获取温湿度结果crc校验
  14. local crc = 0xFF
  15. local len = #data
  16. for i = 1, len do
  17. crc = bit.bxor(crc, data[i])
  18. for j = 1, 8 do
  19. crc = crc * 2
  20. if crc >= 0x100 then
  21. crc = bit.band(bit.bxor(crc, 0x31), 0xff)
  22. end
  23. end
  24. end
  25. return crc
  26. end
  27. sys.taskInit(function()
  28. sys.wait(5000)
  29. while true do
  30. local s = i2c.setup(i2cId, 1000000) -- 打开I²C通道
  31. local t, h -- 定义局部变量,用以保存温度值和湿度值
  32. local tempCrc = {} -- 定义局部表,保存获取的温度数据,便于进行crc校验
  33. local humiCrc = {} -- 定义局部表,保存获取的湿度数据,便于进行crc校验
  34. local w = i2c.send(2, 0x44, {0x2c, 0x06}) -- 发送单次采集命令
  35. sys.wait(10) -- 等待采集
  36. local r = i2c.recv(2, 0x44, 6) -- 读取数据采集结果
  37. -- b:温度高八位 c:温度低八位 d:b和c的crc校验值 e:湿度高八位 f:湿度低八位 g:e和f的crc校验值
  38. local a, b, c, d, e, f, g = pack.unpack(r, "b6")
  39. table.insert(tempCrc, b) -- 将温度高八位和温度低八位存入表中,稍后进行crc校验
  40. table.insert(tempCrc, c)
  41. table.insert(humiCrc, e) -- 将湿度高八位和湿度低八位存入表中,稍后进行crc校验
  42. table.insert(humiCrc, f)
  43. local result1 = crc_8(tempCrc) -- 温度数据crc校验
  44. local result2 = crc_8(humiCrc) -- 湿度数据crc校验
  45. --[[ if d == result1 and g == result2 then
  46. t = -45 + 175 * ((b * 256 + c) / 65535) -- 根据SHT30传感器手册给的公式计算温度和湿度
  47. h = 100 * ((e * 256 + f) / 65535)
  48. log.warn("这里是温度", t) -- 打印温度
  49. log.warn("这里是湿度", h) -- 打印湿度
  50. else
  51. log.warn("crc校验失败")
  52. end ]]
  53. if d == result1 and g == result2 then -- 将数据放大100倍,便于不带float的固件使用
  54. t = ((4375 * (b * 256 + c)) / 16384) - 4500 --根据SHT30传感器手册给的公式计算温度和湿度
  55. h = ((2500 * (e * 256 + f)) / 16384)
  56. log.warn("这里是温度", t / 100 .. "." .. t % 100) -- 打印温度
  57. log.warn("这里是湿度", h / 100 .. "." .. h % 100) -- 打印湿度
  58. else
  59. log.warn("crc校验失败")
  60. end
  61. i2c.close(i2cId) -- 关闭I²C通道
  62. sys.wait(1000) -- task挂起一秒
  63. end
  64. end)