SHT20.lua 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. --- 模块功能:SHT20
  2. -- @module SHT20
  3. -- @author Fantasy
  4. require"utils"
  5. require"bit"
  6. local i2cid = 2 --i2cid
  7. local SHT20_ADDRESS = 0x40
  8. ---SHT20所用地址
  9. local POLYNOMIAL = 0x131
  10. CMD_READ_TEMPERATURE_hold = 0xE3
  11. CMD_READ_HUMIDITY_hold = 0xE5
  12. CMD_READ_TEMPERATURE = 0xF3
  13. CMD_READ_HUMIDITY = 0xF5
  14. CMD_READ_REGISTER = 0xE7
  15. CMD_WRITE_REGISTER = 0xE6
  16. CMD_RESET = 0xFE
  17. local function i2c_send(data)
  18. return i2c.send(i2cid, SHT20_ADDRESS, data)
  19. end
  20. local function i2c_recv(num)
  21. return i2c.recv(i2cid, SHT20_ADDRESS, num)
  22. end
  23. --器件初始化
  24. local function SHT20_init()
  25. if i2c.setup(i2cid,i2c.SLOW) ~= i2c.SLOW then
  26. log.error("SHT20","i2c.setup fail")
  27. return false
  28. end
  29. log.info("SHT20","i2c init_ok")
  30. end
  31. local function CheckCRC(buf)
  32. crc = 0
  33. for i=0,1 do
  34. crc = bit.bxor(crc,buf:byte(1))
  35. for j=0, 7 do
  36. if bit.band(crc,0x80) then
  37. crc = bit.bxor(bit.lshift(crc,1),POLYNOMIAL)
  38. else
  39. crc = bit.lshift(crc,1)
  40. end
  41. end
  42. end
  43. a,b = string.toHex(pack.pack('b',crc))
  44. return a
  45. end
  46. --发送命令
  47. local function SHT20_run_command(command,bytesToRead)
  48. retryCounter = 0
  49. if bytesToRead > 0 then
  50. i2c_send(command)
  51. while retryCounter < 10 do
  52. recv = i2c_recv(bytesToRead)
  53. if recv and #recv >= 3 then
  54. break
  55. end
  56. retryCounter = retryCounter + 1
  57. sys.wait(10)
  58. end
  59. a,b = string.toHex(pack.pack('b',recv:byte(3)))
  60. if CheckCRC(recv) ~= a then
  61. return false
  62. end
  63. return recv
  64. end
  65. return false
  66. end
  67. -- 将原始数据转换成温度
  68. local function SHT20_to_temperature(buf)
  69. if buf == false then
  70. log.error("SHT20","CRC Error...\r\n")
  71. return false
  72. end
  73. return -46.85 + 175.72 * (bit.lshift(recv:byte(1),8) + buf:byte(2)) / 2^16
  74. end
  75. -- 将原始数据转换成湿度
  76. local function SHT20_to_humidity(buf)
  77. if buf == false then
  78. log.error("SHT20","CRC Error...\r\n")
  79. return false
  80. end
  81. return -6 + 125.0 * (bit.lshift(recv:byte(1),8) + buf:byte(2)) / 2^16
  82. end
  83. local function SHT20_get_temperature()
  84. return SHT20_to_temperature(SHT20_run_command(CMD_READ_TEMPERATURE, 3))
  85. end
  86. local function SHT20_get_humidity()
  87. return SHT20_to_humidity(SHT20_run_command(CMD_READ_HUMIDITY, 3))
  88. end
  89. -- 测试代码
  90. local function SHT20()
  91. sys.wait(1000)
  92. if SHT20_init() ~= false then
  93. sys.wait(500)
  94. while true do
  95. log.info("SHT20_get_temperature", SHT20_get_temperature(),"C")
  96. log.info("SHT20_get_humidity", SHT20_get_humidity(),"%")
  97. sys.wait(1000)
  98. end
  99. end
  100. end
  101. sys.taskInit(SHT20)