AirSHT30_1000.lua 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. --[[
  2. @module AirSHT30_1000
  3. @summary AirSHT30_1000应用功能模块
  4. @version 1.0
  5. @date 2025.10.22
  6. @author 沈园园
  7. @usage
  8. 本文件为AirSHT30_1000驱动配置文件,核心业务逻辑为:
  9. 1、打开AirSHT30_1000;
  10. 2、读取温湿度数据;
  11. 本文件没有对外接口,直接require "AirSHT30_1000"就可以加载运行;
  12. ]]
  13. --本文件中的主机是指I2C主机,具体指Air780EPM
  14. --本文件中的从机是指I2C从机,具体指AirSHT30_1000配件板上的sht30温湿度传感器芯片
  15. local AirSHT30_1000 =
  16. {
  17. -- i2c_id:主机的i2c id;
  18. }
  19. -- 从机地址为0x44
  20. local slave_addr = 0x44
  21. -- 计算数据表data中所有数据元素的crc8校验值
  22. local function crc8(data)
  23. local crc = 0xFF
  24. for i = 1, #data do
  25. crc = bit.bxor(crc, data[i])
  26. for j = 1, 8 do
  27. crc = crc * 2
  28. if crc >= 0x100 then
  29. crc = bit.band(bit.bxor(crc, 0x31), 0xff)
  30. end
  31. end
  32. end
  33. return crc
  34. end
  35. --打开AirSHT30_1000;
  36. --i2c_id:number类型;
  37. -- 主机使用的I2C ID,用来控制AirSHT30_1000;
  38. -- 取值范围:仅支持0和1;
  39. -- 如果没有传入此参数,则默认为0;
  40. --返回值:成功返回true,失败返回false
  41. function AirSHT30_1000.open(i2c_id)
  42. --如果i2c_id为nil,则赋值为默认值0
  43. if i2c_id==nil then i2c_id=0 end
  44. --检查参数的合法性
  45. if not (i2c_id == 0 or i2c_id == 1) then
  46. log.error("AirSHT30_1000.open", "invalid i2c_id", i2c_id)
  47. return false
  48. end
  49. AirSHT30_1000.i2c_id = i2c_id
  50. --初始化I2C
  51. if i2c.setup(i2c_id, i2c.FAST) ~= 1 then
  52. log.error("AirSHT30_1000.open", "i2c.setup error", i2c_id)
  53. return false
  54. end
  55. return true
  56. end
  57. --读取温湿度数据;
  58. --返回值:失败返回false;
  59. -- 成功返回两个值,第一个为摄氏温度值(number类型,例如23.6表示23.6摄氏度),第二个为百分比湿度值(number类型,例如67表示67%的湿度)
  60. function AirSHT30_1000.read()
  61. -- 发送启动测量命令(高精度)
  62. i2c.send(AirSHT30_1000.i2c_id, slave_addr, {0x24, 0x00})
  63. -- 等待测量完成(SHT30高精度测量需~15ms)
  64. sys.wait(20)
  65. -- 读取6字节数据(温度高/低 + CRC,湿度高/低 + CRC)
  66. local data = i2c.recv(AirSHT30_1000.i2c_id, slave_addr, 6)
  67. -- 如果没有读取到6字节数据
  68. if type(data)~="string" or data:len()~=6 then
  69. log.error("AirSHT30_1000.read", "i2c.recv error")
  70. return false
  71. end
  72. -- log.info("AirSHT30_1000.read", data:toHex())
  73. --如果校验值正确
  74. if crc8({data:byte(1), data:byte(2)}) == data:byte(3) and crc8({data:byte(4), data:byte(5)}) == data:byte(6) then
  75. -- 提取原始温度值
  76. local temp_raw = (data:byte(1) << 8) | data:byte(2)
  77. -- 提取原始湿度值
  78. local hum_raw = (data:byte(4) << 8) | data:byte(5)
  79. -- 转换为实际值(根据SHT30数据手册公式)
  80. local temprature = (-45 + 175 * temp_raw / 65535.0)
  81. local humidity = (100 * hum_raw / 65535.0)
  82. -- 打印输出结果(保留2位小数)
  83. -- log.info("AirSHT30_1000.read", "temprature", string.format("%.2f ℃", temprature))
  84. -- log.info("AirSHT30_1000.read", "temprature", string.format("%.2f %%RH", humidity))
  85. return temprature, humidity
  86. else
  87. log.error("AirSHT30_1000.read", "crc error", i2c_id)
  88. return false
  89. end
  90. end
  91. --关闭AirSHT30_1000
  92. --返回值:成功返回true,失败返回false
  93. function AirSHT30_1000.close()
  94. --close接口没有返回值,理论上不会关闭失败
  95. i2c.close(AirSHT30_1000.i2c_id)
  96. return true
  97. end
  98. return AirSHT30_1000