探索MicroPython(四)--传感器应用
传感器应用1. 三轴加速度计MMA76602. 温度传感器DS18B203. 温湿度传感器DHT114. 气压传感器BMP2801. 三轴加速度计MMA7660pyBoard中内置了一个三轴加速度计MMA7660,输出x,y,z三个轴的加速度,测量范围大概是-1.5g到1.5g。pyb中关于MMA7660的构造函数和使用方法如下所示:示例代码为:import pybfrom machi......
·
1. 三轴加速度计MMA7660
pyBoard中内置了一个三轴加速度计MMA7660,输出x,y,z三个轴的加速度,测量范围大概是-1.5g到1.5g。pyb中关于MMA7660的构造函数和使用方法如下所示:
示例代码为:
import pyb
from machine import Pin,I2C
#初始化相关模块
accel = pyb.Accel()
#测量结果
x = accel.x()
y = accel.y()
z = accel.z()
2. 温度传感器DS18B20
DS18B20是常用的温度传感器,它是单总线式传感器,连接原理图如下所示:
pyBoard中单总线模块文件是"onewire.py",DS18B20模块文件是"DS18X20.py",单总线模块的构造函数和使用方法为:
DS18B20的模块的构造函数和使用方法为:
温度传感器代码示例:
#引用相关模块
from pyb import delay
from machine import Pin,I2C
from onewire import OneWire
from ds18x20 import DS18X20
#初始化DS18B20
ow= OneWire(Pin('X11')) #使能单总线
ds = DS18X20(ow) #传感器是DS18B20
rom = ds.scan() #扫描单总线上的传感器地址,支持多个传感器同时连接
while True:
ds.convert_temp() #温度采集转换
temp = ds.read_temp(rom[0]) #温度显示,rom[0]为第1个DS18B20
3. 温湿度传感器DHT11
DHT11也是常见的和常用的湿度传感器,其也是单总线传感器。
pyBoard中dht11.py文件中的构造函数和使用方法为:
DHT11的示例代码为:
#引入相关模块
from pyb import delay
from machine import Pin,I2C
from dht import DHT11
#创建DTH11对象dt
dt=DHT11(Pin('X12'))
delay(1000) #首次启动停顿1秒然传感器稳定
while True:
dt.measure() #温湿度采集
te=dt.temperature() #获取温度值
dh=dt.humidity() #获取湿度值
4. 气压传感器BMP280
BMP280是常用的气压传感器,我们需要编写BMP280的驱动文件“bmp280.py”,该模块文件中的构造函数和使用方法为:
BMP280的代码示例为:
import pyb
import bmp280
from machine import Pin,I2C
#初始化BMP280,I2C接口2
BMP = bmp280.BMP280(I2C(2))
#测量结果
Tem = BMP.getTemp()
Pre = BMP.getPress()
Alt = BMP.getAltitude()
bmp280.py中的代码为:
BMP280_I2C_ADDR = const(0x76)
class BMP280():
def __init__(self, i2c):
self.i2c = i2c
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.i2c.writeto(BMP280_I2C_ADDR, bytearray([reg, dat]))
# get reg
def getReg(self, reg):
self.i2c.writeto(BMP280_I2C_ADDR, bytearray([reg]))
t = self.i2c.readfrom(BMP280_I2C_ADDR, 1)
return t[0]
# get two reg
def get2Reg(self, reg):
self.i2c.writeto(BMP280_I2C_ADDR, bytearray([reg]))
t = self.i2c.readfrom(BMP280_I2C_ADDR, 2)
return t[0] + t[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 '%.2f'%(44330*(1-(self.getPress()/101325)**(1/5.256)))
# sleep mode
def poweroff(self):
self.setReg(0xF4, 0)
# normal mode
def poweron(self):
self.setReg(0xF4, 0x2F)
更多推荐
所有评论(0)