BMP180.lua 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. --- 模块功能:I2C BMP180功能测试.
  2. -- @author denghai
  3. -- @module i2c.BMP180
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2021.09.22
  7. module(...,package.seeall)
  8. -- i2c ID
  9. i2cid = 2
  10. -- i2c 速率
  11. speed = 100000
  12. -- 初始化
  13. function init(address)
  14. if i2c.setup(i2cid, speed, -1, 1) ~= speed then
  15. log.error("i2c", "setup fail", addr)
  16. return
  17. end
  18. addr = address
  19. end
  20. -- 读取数据
  21. function send(...)
  22. sys.wait(10)
  23. if not addr then
  24. log.info("i2c", "addr err")
  25. return
  26. end
  27. local t = {...}
  28. if i2c.send(i2cid, addr, t) ~= #t then
  29. log.error("i2c", "send fail", #t)
  30. return
  31. end
  32. return true
  33. end
  34. -- 发送数据
  35. function read(n)
  36. sys.wait(10)
  37. if not addr then
  38. log.info("i2c", "addr err")
  39. return "\x00"
  40. end
  41. val = i2c.recv(i2cid, addr, n)
  42. log.info("read", val:toHex())
  43. if val and #val > 0 then return val end
  44. return "\x00"
  45. end
  46. -- 读取short 值
  47. function short(addr, n)
  48. send(addr)
  49. if n then
  50. f, val = pack.unpack(read(2), ">H")
  51. else
  52. f, val = pack.unpack(read(2), ">h")
  53. end
  54. log.info("val", f, val)
  55. return f and val or 0
  56. end
  57. sys.taskInit(function()
  58. sys.wait(8000)
  59. init(0x77)
  60. send(0xD0)
  61. local id = read(1)
  62. if "U"~=id then
  63. print("error id",id)
  64. sys.restart("error i2c id!")
  65. return
  66. end
  67. -- 复位
  68. send(0xE0,0xB6)
  69. AC1 = short(0xAA)
  70. AC2 = short(0xAC)
  71. AC3 = short(0xAE)
  72. AC4 = short(0xB0,true)
  73. AC5 = short(0xB2,true)
  74. AC6 = short(0xB4,true)
  75. B1 = short(0xB6)
  76. B2 = short(0xB8)
  77. MB = short(0xBA)
  78. MC = short(0xBC)
  79. MD = short(0xBE)
  80. while true do
  81. sys.wait(2000)
  82. -- 温度 ℃
  83. send(0xF4,0x2E)
  84. sys.wait(1000)
  85. log.info("温度raw", short(0xF6))
  86. UT = short(0xF6)
  87. -- 气压 Pa
  88. send(0xF4,0x34)
  89. sys.wait(1000)
  90. send(0xF6)
  91. _, UP = pack.unpack(read(2), "<H")
  92. log.info("气压raw", UP)
  93. BMP_UncompemstatedToTrue(UT,UP)
  94. end
  95. end)
  96. --//用获取的参数对温度和大气压进行修正,并计算海拔
  97. function BMP_UncompemstatedToTrue(UT,UP)
  98. local p = 0
  99. local X1 = (UT - AC6) * AC5/32768
  100. -- log.info("X1 ",X1,"UT ",UT,"AC6 ",AC6)
  101. -- local X2 = bit.lshift(MC,11) / (X1 + MD)
  102. local X2 = MC*2048 / (X1 + MD)
  103. -- log.info("X2",MC,"MC",X2,"MD",MD)
  104. local B5 = X1 + X2
  105. -- log.info("B5",B5)
  106. -- local Temp = bit.rshift((B5 + 8) ,4)
  107. local Temp = (B5 + 8)/16
  108. log.info("温度修正",Temp)
  109. local B6 = B5 - 4000
  110. -- log.info("B6",B6)
  111. X1 = (B2 *((B6 * B6)/4096))/2048
  112. -- X1 = bit.rshift(B2 * bit.rshift(B6 * B6,12) ,11)
  113. -- log.info("X1",X1,"B2",B2,"B6",B6)
  114. X2 = (AC2 * B6)/2048
  115. -- X2 = bit.rshift(AC2 * B6,11)
  116. -- log.info("X2",X2,"AC2",AC2)
  117. local X3 = X1 + X2
  118. -- log.info("X3",X3)
  119. local B3 = ((AC1 * 4 + X3) + 2) /4
  120. -- log.info("B3",B3,"AC1",AC1)
  121. X1 = (AC3 * B6)/8192
  122. -- X1 = bit.rshift(AC3 * B6 ,13)
  123. -- log.info("X1",X1,"AC3",AC3)
  124. X2 = (B1 *((B6*B6)/4096)) /65536
  125. -- X2 = bit.rshift((B1 *bit.rshift(B6*B6 ,12)) ,16)
  126. -- log.info("X2",X2,"B1",B1)
  127. -- X3 = bit.rshift(X1 + X2 + 2, 2)
  128. X3 = (X1 + X2 + 2)/4
  129. -- log.info("X3",X3)
  130. local B4 = (AC4 * (X3 + 32768))/32768
  131. -- local B4 = bit.rshift(AC4 * (X3 + 32768) ,15)
  132. -- log.info("B4",B4,"AC4",AC4)
  133. local B7 = (UP - B3) * 50000
  134. -- log.info("B7",B7,"UP",UP)
  135. if(B7 < 0x80000000) then
  136. p = (B7 * 2) / B4
  137. else
  138. p = (B7 / B4) * 2
  139. end
  140. -- log.info("p",p)
  141. X1 = (p/256) * (p/256)
  142. -- X1 = bit.rshift(p ,8) * bit.rshift(p,8)
  143. -- log.info("X1",X1)
  144. X1 = (X1 * 3038)/65536
  145. -- X1 = bit.rshift(X1 * 3038,16)
  146. -- log.info("X1",X1)
  147. X2 = (-7357 * p)/65536
  148. -- X2 = bit.rshift(-7357 * p, 16)
  149. -- log.info("X2",X2)
  150. p = p + (X1 + X2 + 3791)/16
  151. -- p = p + bit.rshift(X1 + X2 + 3791,4)
  152. log.info("气压修正", p)
  153. local altitude = 44330 * (1-math.pow(((p) / 101325.0),(1.0/5.255)))
  154. log.info("海拔", altitude)
  155. end