yet-another-bmp085.lua 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. ------------------------------------------------------------------------------
  2. -- BMP085 query module
  3. --
  4. -- LICENCE: http://opensource.org/licenses/MIT
  5. -- Vladimir Dronnikov <dronnikov@gmail.com>
  6. -- Heavily based on work of Christee <Christee@nodemcu.com>
  7. --
  8. -- Example:
  9. -- dofile("bmp085.lua").read(sda, scl)
  10. ------------------------------------------------------------------------------
  11. local M
  12. do
  13. -- cache
  14. local i2c, tmr = i2c, tmr
  15. -- helpers
  16. local r8 = function(reg)
  17. i2c.start(0)
  18. i2c.address(0, 0x77, i2c.TRANSMITTER)
  19. i2c.write(0, reg)
  20. i2c.stop(0)
  21. i2c.start(0)
  22. i2c.address(0, 0x77, i2c.RECEIVER)
  23. local r = i2c.read(0, 1)
  24. i2c.stop(0)
  25. return r:byte(1)
  26. end
  27. local w8 = function(reg, val)
  28. i2c.start(0)
  29. i2c.address(0, 0x77, i2c.TRANSMITTER)
  30. i2c.write(0, reg)
  31. i2c.write(0, val)
  32. i2c.stop(0)
  33. end
  34. local r16u = function(reg)
  35. return r8(reg) * 256 + r8(reg + 1)
  36. end
  37. local r16 = function(reg)
  38. local r = r16u(reg)
  39. if r > 32767 then r = r - 65536 end
  40. return r
  41. end
  42. -- calibration data
  43. local AC1, AC2, AC3, AC4, AC5, AC6, B1, B2, MB, MC, MD
  44. -- read
  45. local read = function(sda, scl, oss)
  46. i2c.setup(0, sda, scl, i2c.SLOW)
  47. -- cache calibration data
  48. if not AC1 then
  49. AC1 = r16(0xAA)
  50. AC2 = r16(0xAC)
  51. AC3 = r16(0xAE)
  52. AC4 = r16u(0xB0)
  53. AC5 = r16u(0xB2)
  54. AC6 = r16u(0xB4)
  55. B1 = r16(0xB6)
  56. B2 = r16(0xB8)
  57. MB = r16(0xBA)
  58. MC = r16(0xBC)
  59. MD = r16(0xBE)
  60. end
  61. -- get raw P
  62. if not oss then oss = 0 end
  63. if oss <= 0 then oss = 0 end
  64. if oss > 3 then oss = 3 end
  65. w8(0xF4, 0x34 + 64 * oss)
  66. tmr.delay((4 + 3 ^ oss) * 1000)
  67. local p = r8(0xF6) * 65536 + r8(0xF7) * 256 + r8(0xF8)
  68. p = p / 2 ^ (8 - oss)
  69. -- get T
  70. w8(0xF4, 0x2E)
  71. tmr.delay(5000)
  72. local t = r16(0xF6)
  73. local X1 = (t - AC6) * AC5 / 32768
  74. local X2 = MC * 2048 / (X1 + MD)
  75. t = (X2 + X1 + 8) / 16
  76. -- normalize P
  77. local B5 = t * 16 - 8;
  78. local B6 = B5 - 4000
  79. local X1 = B2 * (B6 * B6 / 4096) / 2048
  80. local X2 = AC2 * B6 / 2048
  81. local X3 = X1 + X2
  82. local B3 = ((AC1 * 4 + X3) * 2 ^ oss + 2) / 4
  83. X1 = AC3 * B6 / 8192
  84. X2 = (B1 * (B6 * B6 / 4096)) / 65536
  85. X3 = (X1 + X2 + 2) / 4
  86. local B4 = AC4 * (X3 + 32768) / 32768
  87. local B7 = (p - B3) * (50000 / 2 ^ oss)
  88. p = B7 / B4 * 2
  89. X1 = (p / 256) ^ 2
  90. X1 = (X1 * 3038) / 65536
  91. X2 = (-7357 * p) / 65536
  92. p = p + (X1 + X2 + 3791) / 16
  93. -- Celsius * 10, Hg mm * 10
  94. return t, p * 3 / 40
  95. end
  96. -- expose
  97. M = {
  98. read = read,
  99. }
  100. end
  101. return M