main.lua 2.9 KB

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