bmx.lua 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. --[[
  2. @module bmx
  3. @summary bmx 气压传感器 目前支持bmp180 bmp280 bme280 会自动判断器件
  4. @version 1.0
  5. @date 2022.04.9
  6. @author Dozingfiretruck
  7. @usage
  8. --注意:因使用了sys.wait()所有api需要在协程中使用
  9. -- 用法实例
  10. local bmx = require "bmx"
  11. i2cid = 0
  12. i2c_speed = i2c.SLOW
  13. sys.taskInit(function()
  14. i2c.setup(i2cid,i2c_speed)
  15. bmx.init(i2cid)--初始化,传入i2c_id
  16. while 1 do
  17. local bmx_data = bmx.get_data()
  18. if bmx_data.temp then
  19. log.info("bmx_data_data.temp:"..(bmx_data.temp).."℃")
  20. end
  21. if bmx_data.press then
  22. log.info("bmx_data_data.press:"..(bmx_data.press).."hPa")
  23. end
  24. if bmx_data.high then
  25. log.info("bmx_data_data.high:"..(bmx_data.high).."m")
  26. end
  27. if bmx_data.hum then
  28. log.info("bmx_data_data.temp:"..(bmx_data.hum).."%")
  29. end
  30. sys.wait(1000)
  31. end
  32. end)
  33. ]]
  34. local bmx = {}
  35. local sys = require "sys"
  36. local i2cid
  37. local BMX_ADDRESS_ADR
  38. local CHIP_ID
  39. local BMX_ADDRESS_ADR_LOW = 0x76
  40. local BMX_ADDRESS_ADR_HIGH = 0x77
  41. ---器件所用地址
  42. local BMX_CHIP_ID_CHECK = 0xD0
  43. local BMP180_CHIP_ID = 0x55
  44. local BMP280_CHIP_ID = 0x58
  45. local BME280_CHIP_ID = 0x60
  46. local BMX_RESET = 0xE0
  47. local BMX_RESET_VALUE = 0xB6
  48. local BMP180_AC1_ADDR = 0xAA
  49. local BMP180_AC2_ADDR = 0xAC
  50. local BMP180_AC3_ADDR = 0xAE
  51. local BMP180_AC4_ADDR = 0xB0
  52. local BMP180_AC5_ADDR = 0xB2
  53. local BMP180_AC6_ADDR = 0xB4
  54. local BMP180_B1_ADDR = 0xB6
  55. local BMP180_B2_ADDR = 0xB8
  56. local BMP180_MB_ADDR = 0xBA
  57. local BMP180_MC_ADDR = 0xBC
  58. local BMP180_MD_ADDR = 0xBE
  59. local BMP180_CTRL_ADDR = 0xF4 --控制寄存器
  60. local BMP180_CTRL_TEMP = 0x2E --转换温度 4.5MS
  61. local BMP180_CTRL_POSS0 = 0x34 --转换大气压 4.5ms
  62. local BMP180_CTRL_POSS1 = 0x74 --转换大气压 7.5ms
  63. local BMP180_CTRL_POSS2 = 0xB4 --转换大气压 13.5ms
  64. local BMP180_CTRL_POSS3 = 0xF4 --转换大气压 25.5ms
  65. local BMP180_AD_MSB = 0xF6 --ADC输出高8位
  66. local BMP180_AD_LSB = 0xF7 --ADC输出低8位
  67. local BMP180_AD_XLSB = 0xF8 --19位测量时,ADC输出最低3位
  68. local BMX280_T1_ADDR = 0x88
  69. local BMX280_T2_ADDR = 0x8A
  70. local BMX280_T3_ADDR = 0x8C
  71. local BMX280_P1_ADDR = 0x8E
  72. local BMX280_P2_ADDR = 0x90
  73. local BMX280_P3_ADDR = 0x90
  74. local BMX280_P4_ADDR = 0x94
  75. local BMX280_P5_ADDR = 0x96
  76. local BMX280_P6_ADDR = 0x98
  77. local BMX280_P7_ADDR = 0x9A
  78. local BMX280_P8_ADDR = 0x9C
  79. local BMX280_P9_ADDR = 0x9E
  80. local BME280_H1_ADDR = 0xA1
  81. local BME280_H2_ADDR = 0xE1
  82. local BME280_H3_ADDR = 0xE3
  83. local BME280_H4_ADDR = 0xE4
  84. local BME280_H5_ADDR = 0xE5
  85. local BME280_H6_ADDR = 0xE7
  86. local BMX280_CTRLMHUM_ADDR = 0xF2 --控制寄存器
  87. local BMX280_STATUS_ADDR = 0xF3 --状态寄存器
  88. local BMX280_CTRLMEAS_ADDR = 0xF4 --控制寄存器
  89. local BMX280_CONFIG_ADDR = 0xF5 --配置寄存器
  90. local BMX280_SLEEP_MODE = 0x00
  91. local BMX280_FORCED_MODE = 0x01
  92. local BMX280_NORMAL_MODE = 0x03
  93. local BMX280_P_MODE_SKIP = 0x00 --skipped
  94. local BMX280_P_MODE_1 = 0x01 --x1
  95. local BMX280_P_MODE_2 = 0x02 --x2
  96. local BMX280_P_MODE_3 = 0x03 --x4
  97. local BMX280_P_MODE_4 = 0x04 --x8
  98. local BMX280_P_MODE_5 = 0x05 --x16
  99. local BMX280_T_MODE_SKIP = 0x00 --skipped
  100. local BMX280_T_MODE_1 = 0x01 --x1
  101. local BMX280_T_MODE_2 = 0x02 --x2
  102. local BMX280_T_MODE_3 = 0x03 --x4
  103. local BMX280_T_MODE_4 = 0x04 --x8
  104. local BMX280_T_MODE_5 = 0x05 --x16
  105. local BMX280_FILTER_OFF = 0x00 --filter off
  106. local BMX280_FILTER_MODE_1 = 0x01 --0.223*ODR x2
  107. local BMX280_FILTER_MODE_2 = 0x02 --0.092*ODR x4
  108. local BMX280_FILTER_MODE_3 = 0x03 --0.042*ODR x8
  109. local BMX280_FILTER_MODE_4 = 0x04 --0.021*ODR x16
  110. local BMX280_T_SB1 = 0x00 --0.5ms
  111. local BMX280_T_SB2 = 0x01 --62.5ms
  112. local BMX280_T_SB3 = 0x02 --125ms
  113. local BMX280_T_SB4 = 0x03 --250ms
  114. local BMX280_T_SB5 = 0x04 --500ms
  115. local BMX280_T_SB6 = 0x05 --1000ms
  116. local BMX280_T_SB7 = 0x06 --2000ms
  117. local BMX280_T_SB8 = 0x07 --4000ms
  118. local BMX280_H_SB0 = 0x00 --Skipped (output set to 0x8000)
  119. local BMX280_H_SB1 = 0x01 --oversampling ×1
  120. local BMX280_H_SB2 = 0x02 --oversampling ×2
  121. local BMX280_H_SB3 = 0x03 --oversampling ×4
  122. local BMX280_H_SB4 = 0x04 --oversampling ×8
  123. local BMX280_H_SB5 = 0x05 --oversampling ×16
  124. local BMX280_SPI_DISABLE = 0x00
  125. local BMX280_SPI_ENABLE = 0x01
  126. --按照官方手册配置一种模式,此处可自行修改
  127. local osrs_t = BMX280_T_MODE_1
  128. local osrs_p = BMX280_P_MODE_3
  129. local osrs_h = BMX280_H_SB1
  130. local mode = BMX280_NORMAL_MODE
  131. local t_sb = BMX280_T_SB1
  132. local filter = BMX280_FILTER_MODE_4
  133. local spi_en = BMX280_SPI_DISABLE
  134. local ctrl_hum = osrs_h
  135. local ctrl_meas = bit.bor(bit.lshift(osrs_t,5), bit.lshift(osrs_p, 2), mode)
  136. local config = bit.bor(bit.lshift(t_sb,5), bit.lshift(filter, 2), spi_en)
  137. local BMX180_CTRL_TEMP = 0x2E --转换温度 4.5MS
  138. local BMX180_CTRL_POSS0 = 0x34 --转换大气压 4.5ms
  139. local BMX180_CTRL_POSS1 = 0x74 --转换大气压 7.5ms
  140. local BMX180_CTRL_POSS2 = 0xB4 --转换大气压 13.5ms
  141. local BMX180_CTRL_POSS3 = 0xF4 --转换大气压 25.5ms
  142. local BMX280_PRESS_MSB = 0xF7
  143. local BMX280_PRESS_LSB = 0xF8
  144. local BMX280_PRESS_XLSB = 0xF9
  145. local BMX280_TEMP_MSB = 0xFA
  146. local BMX280_TEMP_LSB = 0xFB
  147. local BMX280_TEMP_XLSB = 0xFC
  148. local BMX280_HUM_MSB = 0xFD
  149. local BMX280_HUM_LSB = 0xFE
  150. local PRESSURE_OF_SEA = 101325 -- 参考海平面压强
  151. local AC1,AC2,AC3,AC4,AC5,AC6,B1,B2,MB,MC,MD
  152. local H1,H2,H3,H4,H5,H6,T1,T2,T3,P1,P2,P3,P4,P5,P6,P7,P8,P9
  153. --器件ID检测
  154. local function chip_check()
  155. i2c.send(i2cid, BMX_ADDRESS_ADR_LOW, BMX_CHIP_ID_CHECK)--读器件地址
  156. local revData = i2c.recv(i2cid, BMX_ADDRESS_ADR_LOW, 1)
  157. if revData:byte() ~= nil then
  158. BMX_ADDRESS_ADR = BMX_ADDRESS_ADR_LOW
  159. else
  160. i2c.send(i2cid, BMX_ADDRESS_ADR_HIGH, BMX_CHIP_ID_CHECK)--读器件地址
  161. sys.wait(50)
  162. local revData = i2c.recv(i2cid, BMX_ADDRESS_ADR_HIGH, 1)
  163. if revData:byte() ~= nil then
  164. BMX_ADDRESS_ADR = BMX_ADDRESS_ADR_HIGH
  165. else
  166. log.info("i2c", "Can't find bmx device")
  167. return false
  168. end
  169. end
  170. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX_CHIP_ID_CHECK)--读器件地址
  171. sys.wait(50)
  172. local revData = i2c.recv(i2cid, BMX_ADDRESS_ADR, 1)
  173. if revData:byte() == BMP180_CHIP_ID then
  174. CHIP_ID = BMP180_CHIP_ID
  175. log.info("Device i2c id is: bmp180")
  176. elseif revData:byte() == BMP280_CHIP_ID then
  177. CHIP_ID = BMP280_CHIP_ID
  178. log.info("Device i2c id is: bmp280")
  179. elseif revData:byte() == BME280_CHIP_ID then
  180. log.info("Device i2c id is: bme280")
  181. CHIP_ID = BME280_CHIP_ID
  182. else
  183. log.info("i2c", "Can't find bmx device")
  184. return false
  185. end
  186. return true
  187. end
  188. --器件初始化
  189. function bmx.init(i2c_id)
  190. i2cid = i2c_id
  191. sys.wait(20)
  192. if chip_check() then
  193. i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX_RESET,BMX_RESET_VALUE})--软复位
  194. sys.wait(20)
  195. if CHIP_ID == BMP180_CHIP_ID then
  196. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC1_ADDR)
  197. _,AC1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  198. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC2_ADDR)
  199. _,AC2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  200. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC3_ADDR)
  201. _,AC3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  202. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC4_ADDR)
  203. _,AC4 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">H")
  204. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC5_ADDR)
  205. _,AC5 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">H")
  206. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC6_ADDR)
  207. _,AC6 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">H")
  208. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_B1_ADDR)
  209. _,B1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  210. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_B2_ADDR)
  211. _,B2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  212. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_MB_ADDR)
  213. _,MB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  214. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_MC_ADDR)
  215. _,MC = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  216. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_MD_ADDR)
  217. _,MD = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  218. else
  219. if CHIP_ID == BME280_CHIP_ID then
  220. i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H1_ADDR)
  221. _,H1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<b")
  222. i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H2_ADDR)
  223. _,H2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  224. i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H3_ADDR)
  225. _,H3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<b")
  226. i2c.send(i2cid, BMX_ADDRESS_ADR, 0xE4)
  227. _,tmp1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  228. i2c.send(i2cid, BMX_ADDRESS_ADR, 0xE5)
  229. _,tmp2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  230. i2c.send(i2cid, BMX_ADDRESS_ADR, 0xE6)
  231. _,tmp3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  232. H4 = bit.bor(bit.lshift(tmp1,4),bit.band(tmp2,0x0F))
  233. H5 = bit.bor(bit.lshift(tmp3,4),bit.band(bit.rshift(tmp2,4),0x0F))
  234. if bit.band(H4,0x0080)~=0 then H4 = bit.bxor(-H4,0x00FF) + 1 end
  235. if bit.band(H5,0x0080)~=0 then H5 = bit.bxor(-H5,0x00FF) + 1 end
  236. i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H6_ADDR)
  237. _,H6 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  238. end
  239. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_T1_ADDR)
  240. _,T1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<H")
  241. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_T2_ADDR)
  242. _,T2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  243. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_T3_ADDR)
  244. _,T3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  245. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P1_ADDR)
  246. _,P1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<H")
  247. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P2_ADDR)
  248. _,P2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  249. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P3_ADDR)
  250. _,P3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  251. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P4_ADDR)
  252. _,P4 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  253. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P5_ADDR)
  254. _,P5 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  255. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P6_ADDR)
  256. _,P6 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  257. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P7_ADDR)
  258. _,P7 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  259. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P8_ADDR)
  260. _,P8 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  261. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P9_ADDR)
  262. _,P9 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  263. end
  264. if CHIP_ID == BME280_CHIP_ID then
  265. i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX280_CTRLMHUM_ADDR,ctrl_hum})
  266. end
  267. if CHIP_ID ~= BMP180_CHIP_ID then
  268. i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX280_CTRLMEAS_ADDR,ctrl_meas})
  269. i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX280_CONFIG_ADDR,config})
  270. end
  271. sys.wait(20)--跳过首次数据
  272. log.info("bmp init_ok")
  273. return true
  274. end
  275. return false
  276. end
  277. --获取温度的原始数据
  278. local function bmx_get_temp_raw()
  279. local temp_raw
  280. if CHIP_ID == BMP180_CHIP_ID then
  281. i2c.send(i2cid, BMX_ADDRESS_ADR,{BMP180_CTRL_ADDR,BMP180_CTRL_TEMP})
  282. sys.wait(5)
  283. i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_MSB)
  284. local buffer = i2c.recv(i2cid, BMX_ADDRESS_ADR, 2)--获取2字节
  285. _, temp_raw = pack.unpack(buffer, ">h")
  286. else
  287. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_TEMP_MSB)
  288. local _, MSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  289. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_TEMP_LSB)
  290. local _, LSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  291. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_TEMP_XLSB)
  292. local _, XLSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  293. temp_raw = bit.bor(bit.lshift(MSB,12), bit.lshift(LSB, 4), bit.rshift(XLSB, 4))
  294. end
  295. return temp_raw or 0
  296. end
  297. --获取气压的原始数据
  298. local function bmx_get_pressure_raw()
  299. local pressure_raw
  300. if CHIP_ID == BMP180_CHIP_ID then
  301. i2c.send(i2cid, BMX_ADDRESS_ADR,{BMP180_CTRL_ADDR,BMP180_CTRL_POSS3})
  302. sys.wait(26)
  303. i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_MSB)
  304. local _, MSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  305. i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_LSB)
  306. local _, LSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  307. i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_XLSB)
  308. local _, XLSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  309. pressure_raw = bit.rshift((bit.lshift(MSB, 16)+bit.lshift(LSB, 8)+XLSB),5)
  310. else
  311. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_PRESS_MSB)
  312. local _, MSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  313. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_PRESS_LSB)
  314. local _, LSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  315. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_PRESS_XLSB)
  316. local _, XLSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  317. pressure_raw = bit.bor(bit.lshift(MSB,12), bit.lshift(LSB, 4), bit.rshift(XLSB, 4))
  318. end
  319. return pressure_raw or 0
  320. end
  321. --获取湿度的原始数据
  322. local function bmx_get_humidity_raw()
  323. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_HUM_MSB)
  324. local _, humidity = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  325. return humidity or 0
  326. end
  327. --[[
  328. 获取bmx数据
  329. @api bmx.get_data()
  330. @return table bmx数据
  331. @usage
  332. local bmx_data = bmx.get_data()
  333. if bmx_data.temp then
  334. log.info("bmx_data_data.temp:"..(bmx_data.temp).."℃")
  335. end
  336. if bmx_data.press then
  337. log.info("bmx_data_data.press:"..(bmx_data.press).."hPa")
  338. end
  339. if bmx_data.high then
  340. log.info("bmx_data_data.high:"..(bmx_data.high).."m")
  341. end
  342. if bmx_data.hum then
  343. log.info("bmx_data_data.temp:"..(bmx_data.hum).."%")
  344. end
  345. ]]
  346. function bmx.get_data()
  347. local bme_data={}
  348. local temp_raw = bmx_get_temp_raw()
  349. local pressure_raw = bmx_get_pressure_raw()
  350. if CHIP_ID == BMP180_CHIP_ID then
  351. local P = 0
  352. local X1 = ((temp_raw - AC6) * AC5) / 32768
  353. local X2 = (MC * 2048) / (X1 + MD)
  354. local B5 = X1 + X2
  355. temp_raw = (B5 + 8)/16
  356. bme_data.temp = temp_raw/10
  357. local B6 = B5 - 4000
  358. X1 = (B2 * (B6 * B6 /4096))/2048
  359. X2 = AC2 * B6/2048
  360. local X3 = X1 + X2
  361. local B3 = (((AC1 * 4 + X3)*8) + 2) /4
  362. X1 = (AC3 * B6)/8192
  363. X2 = (B1 * (B6 * B6 /4096))/65536
  364. X3 = ((X1 + X2) + 2)/4
  365. local B4 = AC4 * (X3 + 32768)/32768
  366. local B7 = (pressure_raw - B3) * (50000/8)
  367. if (B7 < 0x80000000)then
  368. P = (B7 * 2) / B4
  369. else
  370. P = (B7 / B4) * 2
  371. end
  372. X1 = (P/256) * (P/256)
  373. X1 = (X1 * 3038)/65536
  374. X2 = (-7357 * P)/65536
  375. P = P + ((X1 + X2 + 3791)/16)
  376. bme_data.press = P /100
  377. bme_data.high = 44330 * (1 - math.pow((P / PRESSURE_OF_SEA), (1.0 / 5.255)))
  378. bme_data.high = 44330 * (1 - math.pow((P / PRESSURE_OF_SEA), (1.0 / 5.255)))
  379. else
  380. local var1 = (temp_raw/16384.0 - T1/1024.0) * T2
  381. local var2 = ((temp_raw/131072.0 - T1/8192.0) *(temp_raw/131072.0 - T1/8192.0)) * T3
  382. local t_fine = var1 + var2
  383. bme_data.temp = (var1 + var2) / 5120.0
  384. var1 = t_fine/2.0 - 64000.0
  385. var2 = var1 * var1 * P6 / 32768.0
  386. var2 = var2 + var1 * P5 * 2.0
  387. var2 = var2 / 4.0 + P4 * 65536.0
  388. var1 = (P3 * var1 * var1 / 524288.0 + P2 * var1) / 524288.0
  389. var1 = (1.0 + var1 / 32768.0)*P1
  390. if var1==0 then
  391. return bme_data
  392. end
  393. local p = 1048576.0 - pressure_raw
  394. p = (p - (var2 / 4096.0)) * 6250.0 / var1
  395. var1 = P9 * p * p / 2147483648.0
  396. var2 = p * P8 / 32768.0
  397. p = p + (var1 + var2 + P7) / 16.0
  398. bme_data.press = p /100
  399. bme_data.high = 44330 * (1 - math.pow((p / PRESSURE_OF_SEA), (1.0 / 5.255)))
  400. if CHIP_ID == BME280_CHIP_ID then
  401. local humidity_raw = bmx_get_humidity_raw()
  402. local var_H = t_fine - 76800.0
  403. var_H = (humidity_raw - (H4 * 64.0 + H5 / 16384.0 * var_H)) * (H2 / 65536.0 * (1.0 + H6 / 67108864.0 * var_H * (1.0 + H3 / 67108864.0 * var_H)))
  404. var_H = var_H * (1.0 - H1 * var_H / 524288.0)
  405. if var_H > 100.0 then
  406. var_H = 100.0
  407. elseif var_H < 0.0 then
  408. var_H = 0.0
  409. end
  410. bme_data.hum=var_H
  411. end
  412. end
  413. return bme_data
  414. end
  415. return bmx