bmx.lua 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. --[[
  2. @module bmx
  3. @summary bmx 气压传感器 目前支持bmp180 bmp280 bme280 bme680 会自动判断器件
  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).."°C")
  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.hum:"..(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 BME680_CHIP_ID = 0x61
  47. local BMX_RESET = 0xE0
  48. local BMX_RESET_VALUE = 0xB6
  49. local BMP180_AC1_ADDR = 0xAA
  50. local BMP180_AC2_ADDR = 0xAC
  51. local BMP180_AC3_ADDR = 0xAE
  52. local BMP180_AC4_ADDR = 0xB0
  53. local BMP180_AC5_ADDR = 0xB2
  54. local BMP180_AC6_ADDR = 0xB4
  55. local BMP180_B1_ADDR = 0xB6
  56. local BMP180_B2_ADDR = 0xB8
  57. local BMP180_MB_ADDR = 0xBA
  58. local BMP180_MC_ADDR = 0xBC
  59. local BMP180_MD_ADDR = 0xBE
  60. local BMP180_CTRL_ADDR = 0xF4 --控制寄存器
  61. local BMP180_CTRL_TEMP = 0x2E --转换温度 4.5MS
  62. local BMP180_CTRL_POSS0 = 0x34 --转换大气压 4.5ms
  63. local BMP180_CTRL_POSS1 = 0x74 --转换大气压 7.5ms
  64. local BMP180_CTRL_POSS2 = 0xB4 --转换大气压 13.5ms
  65. local BMP180_CTRL_POSS3 = 0xF4 --转换大气压 25.5ms
  66. local BMP180_AD_MSB = 0xF6 --ADC输出高8位
  67. local BMP180_AD_LSB = 0xF7 --ADC输出低8位
  68. local BMP180_AD_XLSB = 0xF8 --19位测量时,ADC输出最低3位
  69. local BMX280_T1_ADDR = 0x88
  70. local BMX280_T2_ADDR = 0x8A
  71. local BMX280_T3_ADDR = 0x8C
  72. local BMX280_P1_ADDR = 0x8E
  73. local BMX280_P2_ADDR = 0x90
  74. local BMX280_P3_ADDR = 0x90
  75. local BMX280_P4_ADDR = 0x94
  76. local BMX280_P5_ADDR = 0x96
  77. local BMX280_P6_ADDR = 0x98
  78. local BMX280_P7_ADDR = 0x9A
  79. local BMX280_P8_ADDR = 0x9C
  80. local BMX280_P9_ADDR = 0x9E
  81. local BME280_H1_ADDR = 0xA1
  82. local BME280_H2_ADDR = 0xE1
  83. local BME280_H3_ADDR = 0xE3
  84. local BME280_H4_ADDR = 0xE4
  85. local BME280_H5_ADDR = 0xE5
  86. local BME280_H6_ADDR = 0xE7
  87. local BMX280_CTRLMHUM_ADDR = 0xF2 --控制寄存器
  88. local BMX280_STATUS_ADDR = 0xF3 --状态寄存器
  89. local BMX280_CTRLMEAS_ADDR = 0xF4 --控制寄存器
  90. local BMX280_CONFIG_ADDR = 0xF5 --配置寄存器
  91. local BMX280_SLEEP_MODE = 0x00
  92. local BMX280_FORCED_MODE = 0x01
  93. local BMX280_NORMAL_MODE = 0x03
  94. local BMX280_P_MODE_SKIP = 0x00 --skipped
  95. local BMX280_P_MODE_1 = 0x01 --x1
  96. local BMX280_P_MODE_2 = 0x02 --x2
  97. local BMX280_P_MODE_3 = 0x03 --x4
  98. local BMX280_P_MODE_4 = 0x04 --x8
  99. local BMX280_P_MODE_5 = 0x05 --x16
  100. local BMX280_T_MODE_SKIP = 0x00 --skipped
  101. local BMX280_T_MODE_1 = 0x01 --x1
  102. local BMX280_T_MODE_2 = 0x02 --x2
  103. local BMX280_T_MODE_3 = 0x03 --x4
  104. local BMX280_T_MODE_4 = 0x04 --x8
  105. local BMX280_T_MODE_5 = 0x05 --x16
  106. local BMX280_FILTER_OFF = 0x00 --filter off
  107. local BMX280_FILTER_MODE_1 = 0x01 --0.223*ODR x2
  108. local BMX280_FILTER_MODE_2 = 0x02 --0.092*ODR x4
  109. local BMX280_FILTER_MODE_3 = 0x03 --0.042*ODR x8
  110. local BMX280_FILTER_MODE_4 = 0x04 --0.021*ODR x16
  111. local BMX280_T_SB1 = 0x00 --0.5ms
  112. local BMX280_T_SB2 = 0x01 --62.5ms
  113. local BMX280_T_SB3 = 0x02 --125ms
  114. local BMX280_T_SB4 = 0x03 --250ms
  115. local BMX280_T_SB5 = 0x04 --500ms
  116. local BMX280_T_SB6 = 0x05 --1000ms
  117. local BMX280_T_SB7 = 0x06 --2000ms
  118. local BMX280_T_SB8 = 0x07 --4000ms
  119. local BMX280_H_SB0 = 0x00 --Skipped (output set to 0x8000)
  120. local BMX280_H_SB1 = 0x01 --oversampling ×1
  121. local BMX280_H_SB2 = 0x02 --oversampling ×2
  122. local BMX280_H_SB3 = 0x03 --oversampling ×4
  123. local BMX280_H_SB4 = 0x04 --oversampling ×8
  124. local BMX280_H_SB5 = 0x05 --oversampling ×16
  125. local BMX280_SPI_DISABLE = 0x00
  126. local BMX280_SPI_ENABLE = 0x01
  127. local BME680_CONFIG_ADDR = 0x75
  128. local BME680_CTRLMEAS_ADDR = 0x74
  129. local BME680_CTRLHUM_ADDR = 0x72
  130. local BME680_CTRLGAS1_ADDR = 0x71
  131. local BME680_CTRLGAS0_ADDR = 0x70
  132. local BME680_GASRLSB_ADDR = 0x2B
  133. local BME680_GASRMSB_ADDR = 0x2A
  134. local BME680_HUMLSB_ADDR = 0x26
  135. local BME680_HUMMSB_ADDR = 0x25
  136. local BME680_TEMPXLSB_ADDR = 0x24
  137. local BME680_TEMPLSB_ADDR = 0x23
  138. local BME680_TEMPMSB_ADDR = 0x22
  139. local BME680_PRESSXLSB_ADDR = 0x21
  140. local BME680_PRESSLSB_ADDR = 0x20
  141. local BME680_PRESSMSB_ADDR = 0x1F
  142. local BME680_EASSTATUS0_ADDR = 0x1D
  143. local BME680_T1_ADDR = 0xE9
  144. local BME680_T2_ADDR = 0x8A
  145. local BME680_T3_ADDR = 0x8C
  146. local BME680_P1_ADDR = 0x8E
  147. local BME680_P2_ADDR = 0x90
  148. local BME680_P3_ADDR = 0x92
  149. local BME680_P4_ADDR = 0x94
  150. local BME680_P5_ADDR = 0x96
  151. local BME680_P6_ADDR = 0x99
  152. local BME680_P7_ADDR = 0x98
  153. local BME680_P8_ADDR = 0x9C
  154. local BME680_P9_ADDR = 0x9E
  155. local BME680_P10_ADDR = 0xA0
  156. local BME680_H1M_ADDR = 0xE3
  157. local BME680_H1_ADDR = 0xE2
  158. local BME680_H2M_ADDR = 0xE1
  159. local BME680_H3_ADDR = 0xE4
  160. local BME680_H4_ADDR = 0xE5
  161. local BME680_H5_ADDR = 0xE6
  162. local BME680_H6_ADDR = 0xE7
  163. local BME680_H7_ADDR = 0xE8
  164. --按照官方手册配置一种模式,此处可自行修改
  165. local osrs_t = BMX280_T_MODE_1
  166. local osrs_p = BMX280_P_MODE_3
  167. local osrs_h = BMX280_H_SB1
  168. local mode = BMX280_NORMAL_MODE
  169. local t_sb = BMX280_T_SB1
  170. local filter = BMX280_FILTER_MODE_4
  171. local spi_en = BMX280_SPI_DISABLE
  172. local ctrl_hum = osrs_h
  173. local ctrl_meas = bit.bor(bit.lshift(osrs_t,5), bit.lshift(osrs_p, 2), mode)
  174. local config = bit.bor(bit.lshift(t_sb,5), bit.lshift(filter, 2), spi_en)
  175. local BMX180_CTRL_TEMP = 0x2E --转换温度 4.5MS
  176. local BMX180_CTRL_POSS0 = 0x34 --转换大气压 4.5ms
  177. local BMX180_CTRL_POSS1 = 0x74 --转换大气压 7.5ms
  178. local BMX180_CTRL_POSS2 = 0xB4 --转换大气压 13.5ms
  179. local BMX180_CTRL_POSS3 = 0xF4 --转换大气压 25.5ms
  180. local BMX280_PRESS_MSB = 0xF7
  181. local BMX280_PRESS_LSB = 0xF8
  182. local BMX280_PRESS_XLSB = 0xF9
  183. local BMX280_TEMP_MSB = 0xFA
  184. local BMX280_TEMP_LSB = 0xFB
  185. local BMX280_TEMP_XLSB = 0xFC
  186. local BMX280_HUM_MSB = 0xFD
  187. local BMX280_HUM_LSB = 0xFE
  188. local PRESSURE_OF_SEA = 101325 -- 参考海平面压强
  189. local AC1,AC2,AC3,AC4,AC5,AC6,B1,B2,MB,MC,MD
  190. local H1,H2,H3,H4,H5,H6,H7,T1,T2,T3,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10
  191. --器件ID检测
  192. local function chip_check()
  193. i2c.send(i2cid, BMX_ADDRESS_ADR_LOW, BMX_CHIP_ID_CHECK)--读器件地址
  194. local revData = i2c.recv(i2cid, BMX_ADDRESS_ADR_LOW, 1)
  195. if revData:byte() ~= nil then
  196. BMX_ADDRESS_ADR = BMX_ADDRESS_ADR_LOW
  197. else
  198. i2c.send(i2cid, BMX_ADDRESS_ADR_HIGH, BMX_CHIP_ID_CHECK)--读器件地址
  199. sys.wait(50)
  200. local revData = i2c.recv(i2cid, BMX_ADDRESS_ADR_HIGH, 1)
  201. if revData:byte() ~= nil then
  202. BMX_ADDRESS_ADR = BMX_ADDRESS_ADR_HIGH
  203. else
  204. log.info("i2c", "Can't find bmx device")
  205. return false
  206. end
  207. end
  208. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX_CHIP_ID_CHECK)--读器件地址
  209. sys.wait(50)
  210. local revData = i2c.recv(i2cid, BMX_ADDRESS_ADR, 1)
  211. if revData:byte() == BMP180_CHIP_ID then
  212. CHIP_ID = BMP180_CHIP_ID
  213. log.info("Device i2c id is: bmp180")
  214. elseif revData:byte() == BMP280_CHIP_ID then
  215. CHIP_ID = BMP280_CHIP_ID
  216. log.info("Device i2c id is: bmp280")
  217. elseif revData:byte() == BME280_CHIP_ID then
  218. log.info("Device i2c id is: bme280")
  219. CHIP_ID = BME280_CHIP_ID
  220. elseif revData:byte() == BME680_CHIP_ID then
  221. log.info("Device i2c id is: bme680")
  222. CHIP_ID = BME680_CHIP_ID
  223. else
  224. log.info("i2c", "Can't find bmx device")
  225. return false
  226. end
  227. return true
  228. end
  229. --器件初始化
  230. function bmx.init(i2c_id)
  231. i2cid = i2c_id
  232. sys.wait(20)
  233. if chip_check() then
  234. i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX_RESET,BMX_RESET_VALUE})--软复位
  235. sys.wait(20)
  236. if CHIP_ID == BMP180_CHIP_ID then
  237. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC1_ADDR)
  238. _,AC1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  239. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC2_ADDR)
  240. _,AC2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  241. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC3_ADDR)
  242. _,AC3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  243. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC4_ADDR)
  244. _,AC4 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">H")
  245. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC5_ADDR)
  246. _,AC5 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">H")
  247. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_AC6_ADDR)
  248. _,AC6 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">H")
  249. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_B1_ADDR)
  250. _,B1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  251. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_B2_ADDR)
  252. _,B2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  253. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_MB_ADDR)
  254. _,MB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  255. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_MC_ADDR)
  256. _,MC = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  257. i2c.send(i2cid, BMX_ADDRESS_ADR, BMP180_MD_ADDR)
  258. _,MD = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  259. elseif CHIP_ID == BME680_CHIP_ID then
  260. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_T1_ADDR)
  261. _,T1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  262. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_T2_ADDR)
  263. _,T2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  264. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_T3_ADDR)
  265. _,T3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  266. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_P1_ADDR)
  267. _,P1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<H")
  268. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_P2_ADDR)
  269. _,P2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<H")
  270. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_P3_ADDR)
  271. _,P3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  272. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_P4_ADDR)
  273. _,P4 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  274. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_P5_ADDR)
  275. _,P5 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  276. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_P6_ADDR)
  277. _,P6 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  278. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_P7_ADDR)
  279. _,P7 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  280. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_P8_ADDR)
  281. _,P8 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  282. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_P9_ADDR)
  283. _,P9 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  284. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_P10_ADDR)
  285. _,P10 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  286. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_H1M_ADDR)
  287. local _,tmp1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  288. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_H1_ADDR)
  289. local _,tmp2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  290. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_H2M_ADDR)
  291. local _,tmp3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  292. H1 = bit.bor(bit.lshift(tmp1,4),bit.band(tmp2,0x0F))
  293. H2 = bit.bor(bit.lshift(tmp3,4),bit.band(bit.rshift(tmp2,4),0x0F))
  294. if bit.band(H1,0x0080)~=0 then H4 = bit.bxor(-H1,0x00FF) + 1 end
  295. if bit.band(H2,0x0080)~=0 then H5 = bit.bxor(-H2,0x00FF) + 1 end
  296. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_H3_ADDR)
  297. _,H3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  298. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_H4_ADDR)
  299. _,H4 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  300. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_H5_ADDR)
  301. _,H5 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  302. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_H6_ADDR)
  303. _,H6 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  304. i2c.send(i2cid, BMX_ADDRESS_ADR, BME680_H7_ADDR)
  305. _,H7 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  306. else
  307. if CHIP_ID == BME280_CHIP_ID then
  308. i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H1_ADDR)
  309. _,H1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<b")
  310. i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H2_ADDR)
  311. _,H2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  312. i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H3_ADDR)
  313. _,H3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<b")
  314. i2c.send(i2cid, BMX_ADDRESS_ADR, 0xE4)
  315. local _,tmp1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  316. i2c.send(i2cid, BMX_ADDRESS_ADR, 0xE5)
  317. local _,tmp2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  318. i2c.send(i2cid, BMX_ADDRESS_ADR, 0xE6)
  319. local _,tmp3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  320. H4 = bit.bor(bit.lshift(tmp1,4),bit.band(tmp2,0x0F))
  321. H5 = bit.bor(bit.lshift(tmp3,4),bit.band(bit.rshift(tmp2,4),0x0F))
  322. if bit.band(H4,0x0080)~=0 then H4 = bit.bxor(-H4,0x00FF) + 1 end
  323. if bit.band(H5,0x0080)~=0 then H5 = bit.bxor(-H5,0x00FF) + 1 end
  324. i2c.send(i2cid, BMX_ADDRESS_ADR, BME280_H6_ADDR)
  325. _,H6 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "<c")
  326. end
  327. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_T1_ADDR)
  328. _,T1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<H")
  329. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_T2_ADDR)
  330. _,T2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  331. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_T3_ADDR)
  332. _,T3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  333. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P1_ADDR)
  334. _,P1 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<H")
  335. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P2_ADDR)
  336. _,P2 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  337. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P3_ADDR)
  338. _,P3 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  339. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P4_ADDR)
  340. _,P4 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  341. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P5_ADDR)
  342. _,P5 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  343. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P6_ADDR)
  344. _,P6 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  345. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P7_ADDR)
  346. _,P7 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  347. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P8_ADDR)
  348. _,P8 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  349. i2c.send(i2cid, BMX_ADDRESS_ADR, BMX280_P9_ADDR)
  350. _,P9 = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), "<h")
  351. end
  352. if CHIP_ID == BME680_CHIP_ID then
  353. i2c.send(i2cid, BMX_ADDRESS_ADR, {BME680_CONFIG_ADDR,0x1C})
  354. i2c.send(i2cid, BMX_ADDRESS_ADR, {BME680_CTRLMEAS_ADDR,ctrl_meas})
  355. i2c.send(i2cid, BMX_ADDRESS_ADR, {BME680_CTRLHUM_ADDR,ctrl_hum})
  356. i2c.send(i2cid, BMX_ADDRESS_ADR, {BME680_CTRLGAS1_ADDR,0x19})
  357. i2c.send(i2cid, BMX_ADDRESS_ADR, {BME680_CTRLGAS0_ADDR,0x08})
  358. else
  359. if CHIP_ID == BME280_CHIP_ID then
  360. i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX280_CTRLMHUM_ADDR,ctrl_hum})
  361. end
  362. if CHIP_ID == BMP280_CHIP_ID or CHIP_ID == BME280_CHIP_ID then
  363. i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX280_CTRLMEAS_ADDR,ctrl_meas})
  364. i2c.send(i2cid, BMX_ADDRESS_ADR, {BMX280_CONFIG_ADDR,config})
  365. end
  366. end
  367. sys.wait(20)--跳过首次数据
  368. log.info("bmx init_ok")
  369. return true
  370. end
  371. return false
  372. end
  373. --获取温度的原始数据
  374. local function bmx_get_temp_raw()
  375. local temp_raw
  376. if CHIP_ID == BMP180_CHIP_ID then
  377. i2c.send(i2cid, BMX_ADDRESS_ADR,{BMP180_CTRL_ADDR,BMP180_CTRL_TEMP})
  378. sys.wait(5)
  379. i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_MSB)
  380. local buffer = i2c.recv(i2cid, BMX_ADDRESS_ADR, 2)--获取2字节
  381. _, temp_raw = pack.unpack(buffer, ">h")
  382. elseif CHIP_ID == BME680_CHIP_ID then
  383. i2c.send(i2cid, BMX_ADDRESS_ADR,BME680_TEMPMSB_ADDR)
  384. local _, MSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  385. i2c.send(i2cid, BMX_ADDRESS_ADR,BME680_TEMPLSB_ADDR)
  386. local _, LSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  387. i2c.send(i2cid, BMX_ADDRESS_ADR,BME680_TEMPXLSB_ADDR)
  388. local _, XLSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  389. temp_raw = bit.bor(bit.lshift(MSB,12), bit.lshift(LSB, 4), bit.rshift(XLSB, 4))
  390. else
  391. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_TEMP_MSB)
  392. local _, MSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  393. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_TEMP_LSB)
  394. local _, LSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  395. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_TEMP_XLSB)
  396. local _, XLSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  397. temp_raw = bit.bor(bit.lshift(MSB,12), bit.lshift(LSB, 4), bit.rshift(XLSB, 4))
  398. end
  399. return temp_raw or 0
  400. end
  401. --获取气压的原始数据
  402. local function bmx_get_pressure_raw()
  403. local pressure_raw
  404. if CHIP_ID == BMP180_CHIP_ID then
  405. i2c.send(i2cid, BMX_ADDRESS_ADR,{BMP180_CTRL_ADDR,BMP180_CTRL_POSS3})
  406. sys.wait(26)
  407. i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_MSB)
  408. local _, MSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  409. i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_LSB)
  410. local _, LSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  411. i2c.send(i2cid, BMX_ADDRESS_ADR,BMP180_AD_XLSB)
  412. local _, XLSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  413. pressure_raw = bit.rshift((bit.lshift(MSB, 16)+bit.lshift(LSB, 8)+XLSB),5)
  414. elseif CHIP_ID == BME680_CHIP_ID then
  415. i2c.send(i2cid, BMX_ADDRESS_ADR,BME680_PRESSMSB_ADDR)
  416. local _, MSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  417. i2c.send(i2cid, BMX_ADDRESS_ADR,BME680_PRESSLSB_ADDR)
  418. local _, LSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  419. i2c.send(i2cid, BMX_ADDRESS_ADR,BME680_PRESSXLSB_ADDR)
  420. local _, XLSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  421. pressure_raw = bit.bor(bit.lshift(MSB,12), bit.lshift(LSB, 4), bit.rshift(XLSB, 4))
  422. else
  423. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_PRESS_MSB)
  424. local _, MSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  425. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_PRESS_LSB)
  426. local _, LSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  427. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_PRESS_XLSB)
  428. local _, XLSB = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 1), "b")
  429. pressure_raw = bit.bor(bit.lshift(MSB,12), bit.lshift(LSB, 4), bit.rshift(XLSB, 4))
  430. end
  431. return pressure_raw or 0
  432. end
  433. --获取湿度的原始数据
  434. local function bmx_get_humidity_raw()
  435. local humidity
  436. if CHIP_ID == BME680_CHIP_ID then
  437. i2c.send(i2cid, BMX_ADDRESS_ADR,BME680_HUMMSB_ADDR)
  438. _, humidity = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  439. else
  440. i2c.send(i2cid, BMX_ADDRESS_ADR,BMX280_HUM_MSB)
  441. _, humidity = pack.unpack(i2c.recv(i2cid, BMX_ADDRESS_ADR, 2), ">h")
  442. end
  443. return humidity or 0
  444. end
  445. --[[
  446. 获取bmx数据
  447. @api bmx.get_data()
  448. @return table bmx数据
  449. @usage
  450. local bmx_data = bmx.get_data()
  451. if bmx_data.temp then
  452. log.info("bmx_data_data.temp:"..(bmx_data.temp).."°C")
  453. end
  454. if bmx_data.press then
  455. log.info("bmx_data_data.press:"..(bmx_data.press).."hPa")
  456. end
  457. if bmx_data.high then
  458. log.info("bmx_data_data.high:"..(bmx_data.high).."m")
  459. end
  460. if bmx_data.hum then
  461. log.info("bmx_data_data.hum:"..(bmx_data.hum).."%")
  462. end
  463. ]]
  464. function bmx.get_data()
  465. local bme_data={}
  466. local temp_raw = bmx_get_temp_raw()
  467. local pressure_raw = bmx_get_pressure_raw()
  468. if CHIP_ID == BMP180_CHIP_ID then
  469. local P = 0
  470. local X1 = ((temp_raw - AC6) * AC5) / 32768
  471. local X2 = (MC * 2048) / (X1 + MD)
  472. local B5 = X1 + X2
  473. temp_raw = (B5 + 8)/16
  474. bme_data.temp = temp_raw/10
  475. local B6 = B5 - 4000
  476. X1 = (B2 * (B6 * B6 /4096))/2048
  477. X2 = AC2 * B6/2048
  478. local X3 = X1 + X2
  479. local B3 = (((AC1 * 4 + X3)*8) + 2) /4
  480. X1 = (AC3 * B6)/8192
  481. X2 = (B1 * (B6 * B6 /4096))/65536
  482. X3 = ((X1 + X2) + 2)/4
  483. local B4 = AC4 * (X3 + 32768)/32768
  484. local B7 = (pressure_raw - B3) * (50000/8)
  485. if (B7 < 0x80000000)then
  486. P = (B7 * 2) / B4
  487. else
  488. P = (B7 / B4) * 2
  489. end
  490. X1 = (P/256) * (P/256)
  491. X1 = (X1 * 3038)/65536
  492. X2 = (-7357 * P)/65536
  493. P = P + ((X1 + X2 + 3791)/16)
  494. bme_data.press = P /100
  495. bme_data.high = 44330 * (1 - math.pow((P / PRESSURE_OF_SEA), (1.0 / 5.255)))
  496. bme_data.high = 44330 * (1 - math.pow((P / PRESSURE_OF_SEA), (1.0 / 5.255)))
  497. elseif CHIP_ID == BME680_CHIP_ID then
  498. local var1 = (temp_raw/16384.0 - T1/1024.0) * T2
  499. local var2 = ((temp_raw/131072.0 - T1/8192.0) *(temp_raw/131072.0 - T1/8192.0)) * T3 * 16
  500. local t_fine = var1 + var2
  501. bme_data.temp = t_fine / 5120.0
  502. var1 = t_fine/2.0 - 64000.0
  503. var2 = var1 * var1 * P6 / 131072.0
  504. var2 = var2 + var1 * P5 * 2.0
  505. var2 = var2 / 4.0 + P4 * 65536.0
  506. var1 = (P3 * var1 * var1 / 16384.0 + P2 * var1) / 524288.0
  507. var1 = (1.0 + var1 / 32768.0)*P1
  508. if var1==0 then
  509. return bme_data
  510. end
  511. local p = 1048576.0 - pressure_raw
  512. p = (p - (var2 / 4096.0)) * 6250.0 / var1
  513. var1 = P9 * p * p / 2147483648.0
  514. var2 = p * P8 / 32768.0
  515. local var3 = p / 256.0 * p / 256.0 * p / 256.0 * P10 / 131072.0
  516. p = p + (var1 + var2 + var3 + P7 * 128.0) / 16.0
  517. bme_data.press = p /100
  518. bme_data.high = 44330 * (1 - math.pow((p / PRESSURE_OF_SEA), (1.0 / 5.255)))
  519. local humidity_raw = bmx_get_humidity_raw()
  520. local var1 = humidity_raw - (H1 * 16.0 + H3 / 2.0 * bme_data.temp)
  521. local var2 = var1 * (H2 / 262144.0 * (1.0 + H4 / 16384.0 * bme_data.temp + H5 / 1048576.0 * bme_data.temp * bme_data.temp))
  522. local var3 = H6 / 16384.0
  523. local var4 = H7 / 2097152.0;
  524. bme_data.hum = var2 + ((var3 + var4 * bme_data.temp) * var2 * var2)
  525. else
  526. local var1 = (temp_raw/16384.0 - T1/1024.0) * T2
  527. local var2 = ((temp_raw/131072.0 - T1/8192.0) *(temp_raw/131072.0 - T1/8192.0)) * T3
  528. local t_fine = var1 + var2
  529. bme_data.temp = (var1 + var2) / 5120.0
  530. var1 = t_fine/2.0 - 64000.0
  531. var2 = var1 * var1 * P6 / 32768.0
  532. var2 = var2 + var1 * P5 * 2.0
  533. var2 = var2 / 4.0 + P4 * 65536.0
  534. var1 = (P3 * var1 * var1 / 524288.0 + P2 * var1) / 524288.0
  535. var1 = (1.0 + var1 / 32768.0)*P1
  536. if var1==0 then
  537. return bme_data
  538. end
  539. local p = 1048576.0 - pressure_raw
  540. p = (p - (var2 / 4096.0)) * 6250.0 / var1
  541. var1 = P9 * p * p / 2147483648.0
  542. var2 = p * P8 / 32768.0
  543. p = p + (var1 + var2 + P7) / 16.0
  544. bme_data.press = p /100
  545. bme_data.high = 44330 * (1 - math.pow((p / PRESSURE_OF_SEA), (1.0 / 5.255)))
  546. if CHIP_ID == BME280_CHIP_ID then
  547. local humidity_raw = bmx_get_humidity_raw()
  548. local var_H = t_fine - 76800.0
  549. 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)))
  550. var_H = var_H * (1.0 - H1 * var_H / 524288.0)
  551. if var_H > 100.0 then
  552. var_H = 100.0
  553. elseif var_H < 0.0 then
  554. var_H = 0.0
  555. end
  556. bme_data.hum=var_H
  557. end
  558. end
  559. return bme_data
  560. end
  561. return bmx