低成本气压式高度计制作教程(代码与接线部分)
bmp.py
from micropython import const
from machine import I2C
BMP280_I2C_ADDR = const(0x76)
class BMP280():
def __init__(self, i2c):
self.i2c = i2c
self.tb = bytearray(1)
self.rb = bytearray(1)
self.dig_T1 = self.get2Reg(0x88)
self.dig_T2 = self.short(self.get2Reg(0x8A))
self.dig_T3 = self.short(self.get2Reg(0x8C))
self.dig_P1 = self.get2Reg(0x8E)
self.dig_P2 = self.short(self.get2Reg(0x90))
self.dig_P3 = self.short(self.get2Reg(0x92))
self.dig_P4 = self.short(self.get2Reg(0x94))
self.dig_P5 = self.short(self.get2Reg(0x96))
self.dig_P6 = self.short(self.get2Reg(0x98))
self.dig_P7 = self.short(self.get2Reg(0x9A))
self.dig_P8 = self.short(self.get2Reg(0x9C))
self.dig_P9 = self.short(self.get2Reg(0x9E))
self.mode = 3
self.osrs_p = 3
self.osrs_t = 1
self.setReg(0xF4, 0x2F)
self.setReg(0xF5, 0x0C)
self.filter = 3
self.T = 0
self.P = 0
self.version = '1.0'
def short(self, dat):
if dat > 32767:
return dat - 65536
else:
return dat
# set reg
def setReg(self, reg, dat):
self.tb[0] = dat
self.i2c.writeto_mem(BMP280_I2C_ADDR, reg, self.tb)
# get reg
def getReg(self, reg):
self.i2c.readfrom_mem_into(BMP280_I2C_ADDR, reg, self.rb)
return self.rb[0]
# get two reg
def get2Reg(self, reg):
return self.getReg(reg) + self.getReg(reg+1) * 256
def get(self):
adc_T = (self.getReg(0xFA)<<12) + (self.getReg(0xFB)<<4) + (self.getReg(0xFC)>>4)
var1 = (((adc_T>>3)-(self.dig_T1<<1))*self.dig_T2)>>11
var2 = (((((adc_T>>4)-self.dig_T1)*((adc_T>>4) - self.dig_T1))>>12)*self.dig_T3)>>14
t = var1+var2
self.T = ((t * 5 + 128) >> 8)/100
var1 = (t>>1) - 64000
var2 = (((var1>>2) * (var1>>2)) >> 11 ) * self.dig_P6
var2 = var2 + ((var1*self.dig_P5)<<1)
var2 = (var2>>2)+(self.dig_P4<<16)
var1 = (((self.dig_P3*((var1>>2)*(var1>>2))>>13)>>3) + (((self.dig_P2) * var1)>>1))>>18
var1 = ((32768+var1)*self.dig_P1)>>15
if var1 == 0:
return # avoid exception caused by division by zero
adc_P = (self.getReg(0xF7)<<12) + (self.getReg(0xF8)<<4) + (self.getReg(0xF9)>>4)
p=((1048576-adc_P)-(var2>>12))*3125
if p < 0x80000000:
p = (p << 1) // var1
else:
p = (p // var1) * 2
var1 = (self.dig_P9 * (((p>>3)*(p>>3))>>13))>>12
var2 = (((p>>2)) * self.dig_P8)>>13
self.P = p + ((var1 + var2 + self.dig_P7) >> 4)
return [self.T, self.P]
# get Temperature in Celsius
def getTemp(self):
self.get()
return self.T
# get Pressure in Pa
def getPress(self):
self.get()
return self.P
# Calculating absolute altitude
def getAltitude(self):
return 44330*(1-(self.getPress()/101325)**(1/5.255))
# sleep mode
def poweroff(self):
self.setReg(0xF4, 0)
# normal mode
def poweron(self):
self.setReg(0xF4, 0x2F)
===================================================================<<<<<<<
boot.py
import time
from machine import Pin,I2C
import _thread
import bmp280
def run():
i2c = I2C(sda=Pin(6), scl=Pin(7))
b = bmp280.BMP280(i2c)
da = 0
t=0
try:
while(1):
da=da+1
f = open("date"+str(da)+".txt",'r')
f.close()
except:
f = open("date"+str(da)+".txt",'a')
f.write('气压计数据记录\n')
f.write("记录时间: 原始温度和气压: 高度:\n")
f.close()
while(True):
time.sleep_ms(100)
f = open("date"+str(da)+".txt",'a')
t=t+1
y = b.get()
p = b.getPress()
h = (101325-p)*9/100
dat = (str(t/10)+" "+str(y)+" "+str(h)+"\n")
f.write(dat)
#print(h)
f.close()
pboot = Pin(9,Pin.IN)
def bled():
led4 = Pin(12,Pin.OUT)
led5 = Pin(13,Pin.OUT)
while(True):
led4.on()
time.sleep_ms(500)
led4.off()
led5.on()
time.sleep_ms(500)
led5.off()
#_thread.start_new_thread(bled,())
while(1):
time.sleep_ms(100)
if(pboot.value()==0):
_thread.start_new_thread(bled,())
run()
break
关于接线图

SDA=IO06 SCL=IO07 VCC=3.3V GND=GND
========== ========== ========== ==========
电池3.7/4.2V 正极=+5v 负极=GND
========== ========== ========== ==========
最后模块接到usb的5伏电源或者
把正5伏和gnd接到一块满电1s电池上
切记其他电池(2s-6s)只能插平衡头来获取1s电压
否则直接看烟花