低成本氣壓式高度計(jì)制作教程(代碼與接線部分)
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('氣壓計(jì)數(shù)據(jù)記錄\n')
? ? ? ? f.write("記錄時(shí)間:? 原始溫度和氣壓:? 高度:\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
關(guān)于接線圖

SDA=IO06????????SCL=IO07????????VCC=3.3V????????GND=GND
==========????????==========?????????==========?????????==========?
電池3.7/4.2V????????正極=+5v????????負(fù)極=GND
==========????????==========?????????==========?????????==========?
最后模塊接到usb的5伏電源或者
把正5伏和gnd接到一塊滿電1s電池上
切記其他電池(2s-6s)只能插平衡頭來(lái)獲取1s電壓
否則直接看煙花