电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 2904 人浏览分享

MicroPython开发之自制小型家庭气象站

[复制链接]
2904 0

众所周知,iphone6/6Plus内置气压传感器,不过大家对于气压传感器还是很陌生。跟字面的意思一样,
气压传感器就是用来测量气压的,但测量气压对于普通的手机用户来说又有什么作用呢?
海拔高度测量
对于喜欢登山的人来说,会非常关心自己所处的高度。海拔高度的测量方法,一般常用的有2种方式,
一是通过GPS全球定位系统,二是通过测出大气压,然后根据气压值计算出海拔高度。由于受到技术
和其它方面原因的限制,GPS计算海拔高度一般误差都会有十米左右,而如果在树林里或者是在悬崖
下面时,有时候甚至接收不到GPS卫星信号。而气压的方式可选择的范围会广些,而且可以把成本
控制的比较低。在手机原有GPS的基础上再增加气压传感器的功能,可让三维定位更加精准。

最近发现一块好玩的开发板——TPYBoardv702,这个板子可以定位、发短信、打电话,并且板载温湿
度传感器、光敏传感器以及蜂鸣器,可以DIY很多有趣的东西,下面我们可以用这个板子加一
个气压传感器来做一个小型气象站,来张实物图:

20180702100904762.png


TPYBoardv702

定位功能我就不多说了,如果需要的话可以私聊。

那么我们利用这块板子跟BMP180气压传感器来做一个小型家庭气象站,来检测当地温度以及当地气压与海拔,
如果想做更好玩的东西,可以接其他传感器或者加个继电器来控制其他设备。

BMP180是一直常见的气压传感器,BMP180是一款高精度、小体积、超低能耗的压力传感器,
可以应用在移动设备中,它的性能卓越,精度最低可以达到0.03hPa,并且耗电极低,只有3μA;
BMP180采用强大的8-pin陶瓷无引线芯片承载(LCC)超薄封装,可以通过I2C总
线直接与各种微处理器相连。

20180702100906763.png


硬件接线图

  1. TPYBoard v702
  2.         BMP180
  3. 3.3V
  4. VIN
  5. GND
  6. GND
  7. Y9
  8. SCL
  9. Y10
  10. SDA
复制代码


效果展示图

9.png


连接完毕后,将font.py,upcd8544.py与bmp180的库导入,就可以通过以下
方法分别读取温度、气压、海拔高度了。

源代码oo
导入需要的类库,编辑好main.py,直接运行就ok了,下面是main.py的程序源码

  1. # main.py -- put your code here!
  2. import pyb
  3. import upcd8544
  4. from machine import SPI,Pin
  5. from ubinascii import hexlify
  6. from ubinascii import *
  7. from bmp180 import BMP180
  8. bmp=BMP180(2)
  9. SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK
  10. #DIN =>SPI(1).MOSI 'X8' data flow (Master out, Slave in)
  11. #CLK =>SPI(1).SCK  'X6' SPI clock
  12. RST    = pyb.Pin('X20')
  13. CE     = pyb.Pin('X19')
  14. DC     = pyb.Pin('X18')
  15. LIGHT  = pyb.Pin('X17')
  16. lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT)
  17. while True:
  18.        tem=bmp.getTemp()
  19.        press=bmp.getPress()
  20.        altitude=bmp.getAltitude()
  21.        lcd_5110.lcd_write_string('Tem:',0,0)
  22.        lcd_5110.lcd_write_string(str(tem),0,1)
  23.        lcd_5110.lcd_write_string('C',65,1)
  24.        lcd_5110.lcd_write_string('Press:',0,2)
  25.        lcd_5110.lcd_write_string(str(press),0,3)
  26.        lcd_5110.lcd_write_string('Pa',65,3)     
  27.        lcd_5110.lcd_write_string('Hight:',0,4)
  28.        lcd_5110.lcd_write_string(str(altitude),0,5)
  29.        lcd_5110.lcd_write_string('M',65,5)
  30. bmp180.py库的源码
  31. import pyb
  32. from pyb import I2C
  33. BMP180_I2C_ADDR = const(0x77)
  34. class BMP180():
  35.     def __init__(self, i2c_num):
  36.         self.i2c = I2C(i2c_num, I2C.MASTER, baudrate = 100000)
  37.         self.AC1 = self.short(self.get2Reg(0xAA))
  38.         self.AC2 = self.short(self.get2Reg(0xAC))
  39.         self.AC3 = self.short(self.get2Reg(0xAE))
  40.         self.AC4 = self.get2Reg(0xB0)
  41.         self.AC5 = self.get2Reg(0xB2)
  42.         self.AC6 = self.get2Reg(0xB4)
  43.         self.B1 = self.short(self.get2Reg(0xB6))
  44.         self.B2 = self.short(self.get2Reg(0xB8))
  45.         self.MB = self.short(self.get2Reg(0xBA))
  46.         self.MC = self.short(self.get2Reg(0xBC))

  47.         self.MD = self.short(self.get2Reg(0xBE))
  48.         self.UT = 0
  49.         self.UP = 0
  50.         self.B3 = 0
  51.         self.B4 = 0
  52.         self.B5 = 0
  53.         self.B6 = 0
  54.         self.B7 = 0
  55.         self.X1 = 0
  56.         self.X2 = 0
  57.         self.X3 = 0
  58.     def short(self, dat):
  59.         if dat > 32767:
  60.             return dat - 65536
  61.         else:
  62.             return dat
  63.     def setReg(self, dat, reg):
  64.         buf = bytearray(2)
  65.         buf[0] = reg
  66.         buf[1] = dat
  67.         self.i2c.send(buf, BMP180_I2C_ADDR)
  68.     def getReg(self, reg):
  69.         buf = bytearray(1)
  70.         buf[0] = reg
  71.         self.i2c.send(buf, BMP180_I2C_ADDR)
  72.         t = self.i2c.recv(1, BMP180_I2C_ADDR)
  73.         return t[0]
  74.     def get2Reg(self, reg):
  75.         a = self.getReg(reg)
  76.         b = self.getReg(reg + 1)
  77.         return a*256 + b
  78.     def measure(self):
  79.         self.setReg(0x2E, 0xF4)
  80.         pyb.delay(5)
  81.         self.UT = self.get2Reg(0xF6)
  82.         self.setReg(0x34, 0xF4)
  83.         pyb.delay(5)
  84.         self.UP = self.get2Reg(0xF6)
  85.     def getTemp(self):
  86.         self.measure()
  87.         self.X1 = (self.UT - self.AC6) * self.AC5/(115)
  88.         self.X2 = self.MC * (111) / (self.X1 + self.MD)
  89.         self.B5 = self.X1 + self.X2
  90.         return (self.B5 + 8)/160
  91.     def getPress(self):
  92.         self.getTemp()
  93.         self.B6 = self.B5 - 4000
  94.         self.X1 = (self.B2 * (self.B6*self.B6/(112))) / (111)
  95.         self.X2 = (self.AC2 * self.B6)/(111)
  96.         self.X3 = self.X1 + self.X2
  97.         self.B3 = ((self.AC1*4+self.X3) + 2)/4
  98.         self.X1 = self.AC3 * self.B6 / (113)
  99.         self.X2 = (self.B1 * (self.B6*self.B6/(112))) / (116)
  100.         self.X3 = (self.X1 + self.X2 + 2)/4
  101.         self.B4 = self.AC4 * (self.X3 + 32768)/(115)
  102.         self.B7 = (self.UP-self.B3) * 50000
  103.         if self.B7 0x80000000:
  104.             p = (self.B7*2)/self.B4
  105.         else:
  106.             p = (self.B7/self.B4) * 2
  107.         self.X1 = (p/(18))*(p/(18))
  108.         self.X1 = (self.X1 * 3038)/(116)
  109.         self.X2 = (-7357*p)/(116)
  110.         p = p + (self.X1 + self.X2 + 3791)/16
  111.         return p
  112.     def getAltitude(self):
  113.         p = self.getPress()
  114.         return (44330*(1-(p/101325)**(1/5.255)))
  115.     def get(self):
  116.         t = []
  117.         t.append(self.getPress())
  118.         t.append(self.getAltitude())
  119.         t.append(self.getTemp())
  120.         return t
复制代码




您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.