main.lua 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. PROJECT = "onewiredemo"
  2. VERSION = "1.0.0"
  3. sys = require("sys")
  4. log.style(1)
  5. --[[
  6. 接线说明:
  7. DS18B20 Air780EPM
  8. 1. GND -> GND
  9. 2. VDD -> 3.3V
  10. 3. DATA -> GPIO2
  11. 注意:
  12. 3.3v在老版本的开发板上没有引脚, 所以需要外接, 一定要确保共地
  13. ]]
  14. local function read_ds18b20(id)
  15. local tbuff = zbuff.create(10)
  16. local succ,crc8c,range,t
  17. local rbuff = zbuff.create(9)
  18. --如果有多个DS18B20,需要带上ID
  19. tbuff:write(0x55)
  20. tbuff:copy(nil, id)
  21. tbuff:write(0xb8)
  22. --如果只有1个DS18B20,就用无ID方式
  23. --tbuff:write(0xcc,0xb8)
  24. while true do
  25. tbuff[tbuff:used() - 1] = 0x44
  26. succ = onewire.tx(0, tbuff, false, true, true)
  27. if not succ then
  28. return
  29. end
  30. while true do
  31. succ = onewire.reset(0, true)
  32. if not succ then
  33. return
  34. end
  35. if onewire.bit(0) > 0 then
  36. log.info("温度转换完成")
  37. break
  38. end
  39. sys.wait(10)
  40. end
  41. tbuff[tbuff:used() - 1] = 0xbe
  42. succ = onewire.tx(0, tbuff, false, true, true)
  43. if not succ then
  44. return
  45. end
  46. succ,rx_data = onewire.rx(0, 9, nil, rbuff, false, false, false)
  47. crc8c = crypto.crc8(rbuff:toStr(0,8), 0x31, 0, true)
  48. if crc8c == rbuff[8] then
  49. range = (rbuff[4] >> 5) & 0x03
  50. -- rbuff[0] = 0xF8
  51. -- rbuff[1] = 0xFF
  52. t = rbuff:query(0,2,false,true)
  53. t = t * (5000 >> range)
  54. t = t / 10000
  55. log.info(t)
  56. else
  57. log.info("RAM DATA CRC校验不对", mcu.x32(crc8c), mcu.x32(rbuff[8]))
  58. return
  59. end
  60. sys.wait(500)
  61. end
  62. end
  63. local function test_ds18b20()
  64. local succ,rx_data
  65. local id = zbuff.create(8)
  66. local crc8c
  67. onewire.init(0)
  68. onewire.timing(0, false, 0, 500, 500, 15, 240, 70, 1, 15, 10, 2)
  69. while true do
  70. id:set() --清空id
  71. succ,rx_data = onewire.rx(0, 8, 0x33, id, false, true, true)
  72. if succ then
  73. if id[0] == 0x28 then
  74. crc8c = crypto.crc8(id:query(0,7), 0x31, 0, true)
  75. if crc8c == id[7] then
  76. log.info("探测到DS18B20", id:query(0, 7):toHex())
  77. read_ds18b20(id)
  78. log.info("DS18B20离线,重新探测")
  79. else
  80. log.info("ROM ID CRC校验不对", mcu.x32(crc8c), mcu.x32(id[7]))
  81. end
  82. else
  83. log.info("ROM ID不正确", mcu.x32(id[0]))
  84. end
  85. end
  86. log.info("没有检测到DS18B20, 5秒后重试")
  87. sys.wait(5000)
  88. end
  89. end
  90. if onewire then
  91. sys.taskInit(test_ds18b20)
  92. else
  93. log.info("no onewire")
  94. end
  95. sys.run()