BMP280.lua 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. --- 模块功能:I2C功能测试.
  2. -- @author JWL
  3. -- @module i2c.BMP280
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2021.11.12
  7. module(...,package.seeall)
  8. -- 调试BMP280芯片会出现数据不变化的情况,要关电5分钟后再使用。
  9. require"utils"
  10. local dev={}
  11. local I2C_ID = 0x02
  12. local DEV_ID = 0x76
  13. local BMP280_REGISTER_DIG_T1 = 0x88
  14. local BMP280_REGISTER_DIG_T2 = 0x8A
  15. local BMP280_REGISTER_DIG_T3 = 0x8C
  16. local BMP280_REGISTER_DIG_P1 = 0x8E
  17. local BMP280_REGISTER_DIG_P2 = 0x90
  18. local BMP280_REGISTER_DIG_P3 = 0x92
  19. local BMP280_REGISTER_DIG_P4 = 0x94
  20. local BMP280_REGISTER_DIG_P5 = 0x96
  21. local BMP280_REGISTER_DIG_P6 = 0x98
  22. local BMP280_REGISTER_DIG_P7 = 0x9A
  23. local BMP280_REGISTER_DIG_P8 = 0x9C
  24. local BMP280_REGISTER_DIG_P9 = 0x9E
  25. local BMP280_REGISTER_CHIPID = 0xD0
  26. local BMP280_REGISTER_VERSION = 0xD1
  27. local BMP280_REGISTER_SOFTRESET = 0xE0
  28. --R calibration stored in 0xE1-0xF0
  29. local BMP280_REGISTER_CAL26 = 0xE1
  30. local BMP280_REGISTER_CONTROL = 0xF4
  31. local BMP280_REGISTER_CONFIG = 0xF5
  32. local BMP280_REGISTER_PRESSUREDATA = 0xF7
  33. local BMP280_REGISTER_TEMPDATA = 0xFA
  34. local function I2C_Open(id)
  35. if i2c.setup(id, i2c.SLOW) ~= i2c.SLOW then
  36. log.error("BMP280", "I2C.init is: fail")
  37. i2c.close(id)
  38. return
  39. else
  40. log.error("BMP280", "I2C.init is: succeed")
  41. end
  42. return i2c.SLOW
  43. end
  44. local function I2C_Write_Byte_BMP280(regAddress,content)
  45. i2c.send(I2C_ID, DEV_ID, {regAddress,content})
  46. end
  47. local function I2C_Read_Bytes_BMP280(regAddress,rdcnt)
  48. i2c.send(I2C_ID, DEV_ID, regAddress)
  49. return i2c.recv(I2C_ID, DEV_ID, rdcnt)
  50. end
  51. local function read8(regaddr)
  52. local buff = I2C_Read_Bytes_BMP280(regaddr,1)
  53. return buff:byte(1)
  54. end
  55. local function read16(regaddr)
  56. local buff = I2C_Read_Bytes_BMP280(regaddr,2)
  57. return (buff:byte(1)) *256 + buff:byte(2)
  58. end
  59. local function readS16(regaddr)
  60. local val = read16(regaddr)
  61. if val < 0x8000 then return val end
  62. return val -0x10000
  63. end
  64. local function read16_LE(regaddr)
  65. local buff = I2C_Read_Bytes_BMP280(regaddr,2)
  66. return (buff:byte(2)) *256 + buff:byte(1)
  67. end
  68. local function readS16_LE(regaddr)
  69. local val = read16_LE(regaddr)
  70. if val < 0x8000 then return val end
  71. return val -0x10000
  72. end
  73. local function readCoefficients(void)
  74. dev["calib"]["dig_T1"] = read16_LE(BMP280_REGISTER_DIG_T1);
  75. dev["calib"]["dig_T2"] = readS16_LE(BMP280_REGISTER_DIG_T2);
  76. dev["calib"]["dig_T3"] = readS16_LE(BMP280_REGISTER_DIG_T3);
  77. dev["calib"]["dig_P1"] = read16_LE(BMP280_REGISTER_DIG_P1);
  78. dev["calib"]["dig_P2"] = readS16_LE(BMP280_REGISTER_DIG_P2);
  79. dev["calib"]["dig_P3"] = readS16_LE(BMP280_REGISTER_DIG_P3);
  80. dev["calib"]["dig_P4"] = readS16_LE(BMP280_REGISTER_DIG_P4);
  81. dev["calib"]["dig_P5"] = readS16_LE(BMP280_REGISTER_DIG_P5);
  82. dev["calib"]["dig_P6"] = readS16_LE(BMP280_REGISTER_DIG_P6);
  83. dev["calib"]["dig_P7"] = readS16_LE(BMP280_REGISTER_DIG_P7);
  84. dev["calib"]["dig_P8"] = readS16_LE(BMP280_REGISTER_DIG_P8);
  85. dev["calib"]["dig_P9"] = readS16_LE(BMP280_REGISTER_DIG_P9);
  86. end
  87. local function lshift(x,y)
  88. return x * math.pow(2,y)
  89. end
  90. local function rshift(x,y)
  91. return x / math.pow(2,y)
  92. end
  93. local function readTemperature()
  94. local var1, var2;
  95. local adc_T = read16(BMP280_REGISTER_TEMPDATA)
  96. adc_T = lshift(adc_T,8)
  97. adc_T = adc_T+ read8(BMP280_REGISTER_TEMPDATA+2)
  98. adc_T = rshift(adc_T,4)
  99. var1 = (((( rshift(adc_T,3)) - (lshift( dev["calib"]["dig_T1"],1)))) * (dev["calib"]["dig_T2"]))
  100. var1 = rshift(var1,11)
  101. var2 = (( rshift((((rshift(adc_T,4)) - (dev["calib"]["dig_T1"])) * ((rshift(adc_T,4)) - (dev["calib"]["dig_T1"]))) , 12)) * (dev["calib"]["dig_T3"]))
  102. var2 = rshift(var2,14)
  103. dev["calib"]["t_fine"] = var1 + var2
  104. local T = rshift((dev["calib"]["t_fine"] * 5 + 128), 8 )
  105. return math.floor(T)/100;
  106. end
  107. local function readPressure()
  108. local var1, var2, p
  109. local adc_P = read16(BMP280_REGISTER_PRESSUREDATA)
  110. adc_P = lshift(adc_P,8)
  111. adc_P = adc_P+ read8(BMP280_REGISTER_PRESSUREDATA+2)
  112. adc_P = rshift(adc_P,4)
  113. log.info("adc_P", adc_P)
  114. var1 =dev["calib"]["t_fine"] - 128000;
  115. var2 = var1 * var1 * dev["calib"]["dig_P6"]
  116. var2 = var2 + ( lshift( (var1*dev["calib"]["dig_P5"]),17) )
  117. var2 = var2 + (lshift((dev["calib"]["dig_P4"]),35))
  118. var1 = ( rshift((var1 * var1 * dev["calib"]["dig_P3"]),8)) + ( lshift((var1 * dev["calib"]["dig_P2"]),12) )
  119. var1 = ((( lshift(1,47) )+var1)) * rshift((dev["calib"]["dig_P1"]),33)
  120. log.info("[calib] ", json.encode(dev["calib"]))
  121. if var1 == 0 then
  122. return 0 -- avoid exception caused by division by zero
  123. end
  124. p = 1048576 - adc_P
  125. p = (( ( lshift(p, 31)) - var2)*3125) / var1
  126. var1 = ((dev["calib"]["dig_P9"]) * ( rshift( p,13) ) * ( rshift(p,13) ))
  127. var1 = rshift(var1,25)
  128. var2 = ((dev["calib"]["dig_P8"]) * p)
  129. var2 = rshift(var2,19)
  130. p = (rshift((p + var1 + var2) , 8)) + ( lshift((dev["calib"]["dig_P7"]),4) )
  131. return math.floor(p/256);
  132. end
  133. sys.taskInit(function()
  134. sys.wait(4000)
  135. I2C_Open(I2C_ID)
  136. sys.wait(200)
  137. dev["calib"] = {}
  138. dev["calib"]["t_fine"] = 0
  139. dev["chip_id"] = I2C_Read_Bytes_BMP280(BMP280_REGISTER_CHIPID,1)
  140. log.info("BMP280 chipid=", string.format("%02X", dev["chip_id"]:byte(1) ) )
  141. readCoefficients()
  142. I2C_Write_Byte_BMP280(BMP280_REGISTER_CONTROL, 0x3F);
  143. while true do
  144. sys.wait(100)
  145. local temp = readTemperature()
  146. local pres = readPressure()
  147. log.info("temp, pres", temp .."℃", pres)
  148. sys.wait(2000)
  149. end
  150. end)