嵌入式人工智能(31-基于树莓派4B的气压传感器-BMP280)

1、气压传感器

气压传感器(Pressure Sensor)是一种用于测量气体压力的装置。它可以将气体压力转换为电信号输出,进而实现对气体压力的监测和控制。气压传感器广泛应用于工业自动化、气象观测、建筑监测、航空航天等领域。

气压传感器的工作原理一般分为压阻式和压电式两种。压阻式气压传感器利用气体压力使薄膜变形,进而改变电阻值,从而实现压力测量。压电式气压传感器则利用压电材料的特性,在气体压力作用下产生电荷移动,从而产生电压信号,实现压力测量。

气压传感器的特点包括精度高、响应快、体积小、重量轻、耐高温等。不同类型的气压传感器具有不同的测量范围和工作温度范围,用户可以根据具体需求选择适合的传感器。

在应用方面,气压传感器可以用于气象观测,监测大气压力变化;在工业自动化中,可以用于测量气体管道中的压力;在航空航天领域,可以用于飞机气压高度测量等。随着物联网和智能家居技术的发展,气压传感器也被广泛应用于智能手机、智能手表等便携式设备中,用于海拔测量、运动监测等功能。

2、BMP280

BMP280博世(bosch-sensortec)的一款高精度、小体积、超低能耗的气压传感器,特别适用于移动应用。其小尺寸和低功耗使其能够应用于电池供电的设备,如手机、GPS 模块或手表。它的性能卓越,绝对精度最低可以达到0.2Pa,并且耗电极低,只有2.7μA。BMP280采用强大的8-pin陶瓷无引线芯片承载(LCC)超薄封装,可以通过I2C,SPI总线直接与各种微处理器相连。

非常小,小到看不清,如果是BME280,可以测量温度。湿度、压强。我这边没有BME280,只有BMP280,BMP280不能测量湿度。

3、BMP280与树莓派连接

网上买的BMP280没有焊接排针,自己的电烙铁不好用, 焊的比较丑,有点拿不出手哈哈。以后同学们买电烙铁维修电子产品不建议买便宜的,耽误时间啊。

我们看这个传感器是采用I2C协议接线,也可以采用SPI协议,这个SPI协议我们没有介绍,也是串口协议的一种,支持全双工收发数据,但是连线比IIC复杂。这两种接线引脚我都说明下,最后采用IIC接线方式。

VCC:接3.3V供电,不要接5V

GND:接面包板GND

SCL:IIC时钟引脚;或者是SPI的Clock引脚,用于输入信号

SDA:IIC的数据引脚;或者为SPI的数据输出引脚,用于向开发板发送数据。

CSB:(SPI通信模式下用到的引脚,片选引脚,拉低后启用)

SDO:(传感器地址控制位)

IIC通讯方式:SCL --> 时钟线、SDI --> 数据线、SDO --> 片地址的LSB(最低加权位)、CSB --> Vdd 拉高
SPI通讯方式:SCL --> 时钟线、SDI --> 数据输入线(三线模式下为双向数据线)、SDO --> 数据输出线(3线模式下无用)、CSB --> 片选引脚,拉低后启用

实际上用IIC只要接4根线就可以了,其他的都不要管了。接上就找到该设备了。

4、实验代码与现象

(1)实验一:使用adafruit-circuitpython-bmp280库获取温度、压强和高度

pip install adafruit-circuitpython-bmp280

import board
import busio
import adafruit_bmp280
import time# 初始化
i2c = busio.I2C(board.SCL, board.SDA)
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)# 设置本地的海平面压力
# 该传感器只能根据压力推测出海拔高度
bmp280.sea_level_pressure = 1013.25# 打印读取到的数据
try:while True:print("\n温度: %0.1f C" % bmp280.temperature)print("压强: %0.1f hPa" % bmp280.pressure)print("高度:%0.2f meters" % bmp280.altitude)time.sleep(2)except KeyboardInterrupt:print('程序结束!')

代码比较简单,这里有一个报错,同学们注意。在执行

bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)这句代码时,

引用的库文件代码里面写的IIC地址是0x77,但是我们的地址是0x76,改一下就行,主要是到哪改。找到adafruit_bmp280.py里面的adafruit_bmp280_I2C这个类里面的init,将0x77改为0x76即可。

温度值还是差不多的,不知道这个高度计算有什么依据吗,我只能将传感器抬高10cm,效果有那么一点点,应该是可以的,但是如果要用做无人机定高,注意误差能不能委以重任。

我这七七八八的东西实在太多,桌子实在太乱了。

这些数据仍然可以上传到远程服务器上面,我就不做了,很简单,只要几行代码。

(2)使用smbus库测量温度和压强

实际上这个传感器里面的的寄存器还是很多的,底层实现起来也比较复杂,只不过上面的adafruit-circuitpython-bmp280库里面的函数直接调用,内部细节完全不用管,Python代码写起来非常6。如果用smbus库,大家可以回想下PCF8591.有的内部功能还是要写函数实现的。

import time
import smbus# BMP280 iic address.
BMP280_I2C_ADDRESS = 0x76        # SDO = 0# Registers value
BMP280_ID_Value = 0x58           # BMP280 ID
BMP280_RESET_VALUE = 0xB6# BMP280 Registers definition
BMP280_TEMP_XLSB_REG = 0xFC      # Temperature XLSB Register
BMP280_TEMP_LSB_REG = 0xFB       # Temperature LSB Register
BMP280_TEMP_MSB_REG = 0xFA       # Temperature LSB Register
BMP280_PRESS_XLSB_REG = 0xF9     # Pressure XLSB  Register
BMP280_PRESS_LSB_REG = 0xF8      # Pressure LSB Register
BMP280_PRESS_MSB_REG = 0xF7      # Pressure MSB Register
BMP280_CONFIG_REG = 0xF5         # Configuration Register
BMP280_CTRL_MEAS_REG = 0xF4      # Ctrl Measure Register
BMP280_STATUS_REG = 0xF3         # Status Register
BMP280_RESET_REG = 0xE0          # Softreset Register
BMP280_ID_REG = 0xD0             # Chip ID Register# calibration parameters
BMP280_DIG_T1_LSB_REG = 0x88
BMP280_DIG_T1_MSB_REG = 0x89
BMP280_DIG_T2_LSB_REG = 0x8A
BMP280_DIG_T2_MSB_REG = 0x8B
BMP280_DIG_T3_LSB_REG = 0x8C
BMP280_DIG_T3_MSB_REG = 0x8D
BMP280_DIG_P1_LSB_REG = 0x8E
BMP280_DIG_P1_MSB_REG = 0x8F
BMP280_DIG_P2_LSB_REG = 0x90
BMP280_DIG_P2_MSB_REG = 0x91
BMP280_DIG_P3_LSB_REG = 0x92
BMP280_DIG_P3_MSB_REG = 0x93
BMP280_DIG_P4_LSB_REG = 0x94
BMP280_DIG_P4_MSB_REG = 0x95
BMP280_DIG_P5_LSB_REG = 0x96
BMP280_DIG_P5_MSB_REG = 0x97
BMP280_DIG_P6_LSB_REG = 0x98
BMP280_DIG_P6_MSB_REG = 0x99
BMP280_DIG_P7_LSB_REG = 0x9A
BMP280_DIG_P7_MSB_REG = 0x9B
BMP280_DIG_P8_LSB_REG = 0x9C
BMP280_DIG_P8_MSB_REG = 0x9D
BMP280_DIG_P9_LSB_REG = 0x9E
BMP280_DIG_P9_MSB_REG = 0x9Fclass BMP180(object):def __init__(self, address=BMP280_I2C_ADDRESS):self._address = addressself._bus = smbus.SMBus(1)    # 1: iic编号为1(根据自己的硬件接口选择对应的编号)# Load calibration values.if self._read_byte(BMP280_ID_REG) == BMP280_ID_Value: # read bmp280 idself._load_calibration()                          # load calibration data# BMP280_T_MODE_1 << 5 | BMP280_P_MODE_1 << 2 | BMP280_SLEEP_MODE;ctrlmeas = 0xFF# BMP280_T_SB1 << 5 | BMP280_FILTER_MODE_1 << 2;config = 0x14self._write_byte(BMP280_CTRL_MEAS_REG, ctrlmeas)  # write bmp280 config# sets the data acquisition optionsself._write_byte(BMP280_CONFIG_REG, config)else:print("Read BMP280 id error!rn")def _read_byte(self, cmd):return self._bus.read_byte_data(self._address, cmd)def _read_u16(self, cmd):LSB = self._bus.read_byte_data(self._address, cmd)MSB = self._bus.read_byte_data(self._address, cmd+1)return (MSB << 8) + LSBdef _read_s16(self, cmd):result = self._read_u16(cmd)if result > 32767:result -= 65536return resultdef _write_byte(self, cmd, val):self._bus.write_byte_data(self._address, cmd, val)def _load_calibration(self):                           # load calibration data"load calibration"""" read the temperature calibration parameters """self.dig_T1 = self._read_u16(BMP280_DIG_T1_LSB_REG)self.dig_T2 = self._read_s16(BMP280_DIG_T2_LSB_REG)self.dig_T3 = self._read_s16(BMP280_DIG_T3_LSB_REG)""" read the pressure calibration parameters """self.dig_P1 = self._read_u16(BMP280_DIG_P1_LSB_REG)self.dig_P2 = self._read_s16(BMP280_DIG_P2_LSB_REG)self.dig_P3 = self._read_s16(BMP280_DIG_P3_LSB_REG)self.dig_P4 = self._read_s16(BMP280_DIG_P4_LSB_REG)self.dig_P5 = self._read_s16(BMP280_DIG_P5_LSB_REG)self.dig_P6 = self._read_s16(BMP280_DIG_P6_LSB_REG)self.dig_P7 = self._read_s16(BMP280_DIG_P7_LSB_REG)self.dig_P8 = self._read_s16(BMP280_DIG_P8_LSB_REG)self.dig_P9 = self._read_s16(BMP280_DIG_P9_LSB_REG)def compensate_temperature(self, adc_T):"""Returns temperature in DegC, double precision. Output value of "1.23"equals 51.23 DegC."""var1 = ((adc_T) / 16384.0 - (self.dig_T1) / 1024.0) * (self.dig_T2)var2 = (((adc_T) / 131072.0 - (self.dig_T1) / 8192.0) *((adc_T) / 131072.0 - (self.dig_T1) / 8192.0)) * (self.dig_T3)self.t_fine = var1 + var2temperature = (var1 + var2) / 5120.0return temperaturedef compensate_pressure(self, adc_P):"""Returns pressure in Pa as double. Output value of "6386.2"equals 96386.2 Pa = 963.862 hPa."""var1 = (self.t_fine / 2.0) - 64000.0var2 = var1 * var1 * (self.dig_P6) / 32768.0var2 = var2 + var1 * (self.dig_P5) * 2.0var2 = (var2 / 4.0) + ((self.dig_P4) * 65536.0)var1 = ((self.dig_P3) * var1 * var1 / 524288.0 +(self.dig_P2) * var1) / 524288.0var1 = (1.0 + var1 / 32768.0) * (self.dig_P1)if var1 == 0.0:return 0  # avoid exception caused by division by zeropressure = 1048576.0 - adc_Ppressure = (pressure - (var2 / 4096.0)) * 6250.0 / var1var1 = (self.dig_P9) * pressure * pressure / 2147483648.0var2 = pressure * (self.dig_P8) / 32768.0pressure = pressure + (var1 + var2 + (self.dig_P7)) / 16.0return pressuredef get_temperature_and_pressure(self):"""Returns pressure in Pa as double. Output value of "6386.2"equals 96386.2 Pa = 963.862 hPa."""xlsb = self._read_byte(BMP280_TEMP_XLSB_REG)lsb = self._read_byte(BMP280_TEMP_LSB_REG)msb = self._read_byte(BMP280_TEMP_MSB_REG)adc_T = (msb << 12) | (lsb << 4) | (xlsb >> 4)      # temperature registers datatemperature = self.compensate_temperature(adc_T)    # temperature compensatexlsb = self._read_byte(BMP280_PRESS_XLSB_REG)lsb = self._read_byte(BMP280_PRESS_LSB_REG)msb = self._read_byte(BMP280_PRESS_MSB_REG)adc_P = (msb << 12) | (lsb << 4) | (xlsb >> 4)      # pressure registers datapressure = self.compensate_pressure(adc_P)          # pressure compensatereturn temperature, pressureif __name__ == '__main__':import timeprint("BMP280 Test Program ...n")bmp280 = BMP180()while True:time.sleep(1)temperature, pressure = bmp280.get_temperature_and_pressure()print(' Temperature = %.2f C Pressure = %.3f kPa' %(temperature, pressure/1000))

你们慢慢看把,我先洗洗睡了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未来的智能农业:智能合约如何提升农业生产效率和可持续性

随着全球人口的增长和资源的有限性&#xff0c;农业生产面临着越来越大的挑战。如何在提高生产效率的同时保障可持续发展成为全球农业发展的关键问题。智能合约作为一种基于区块链技术的自动化执行合约&#xff0c;正在逐渐应用于农业领域&#xff0c;为农业生产带来了新的机遇…

Redis:RDB持久化

1. 简介 实现类似照片记录效果的方式&#xff0c;就是把某一时刻的数据和状态以文件的形式写到磁盘上&#xff0c;也就是 快照。这样一来即使故障宕机&#xff0c;快照文件也不会丢失&#xff0c;数据的可靠性也就得到了保证。 这个快照文件就称为RDB文件(dump.rdb)&#xff0c…

从代码层面熟悉UniAD,开始学习了解端到端整体架构

0. 简介 最近端到端已经是越来越火了&#xff0c;以UniAD为代表的很多工作不断地在不断刷新端到端的指标&#xff0c;比如最近SparseDrive又重新刷新了所有任务的指标。在端到端火热起来之前&#xff0c;成熟的模块化自动驾驶系统被分解为不同的独立任务&#xff0c;例如感知、…

数据倾斜优化思路实践

数据倾斜&#xff0c;顾名思义&#xff0c;就是在计算过程中数据分散度不够&#xff0c;导致某个节点数据过于集中&#xff0c;从而导致任务执行效率大大降低。参照对比下MR的整体流程和ODPS&#xff0c;整体结合理解数据倾斜发生的几个生命周期的节点&#xff0c;如下图&#…

WordPress设置固定连接后提示404

WordPress设置固定链接后出现404错误通常是因为服务器的伪静态规则没有正确设置。以下是几种常见的服务器环境下的解决方案&#xff1a; 宝塔面板&#xff1a;如果服务器安装了宝塔面板&#xff0c;可以在宝塔面板中选择对应的WordPress伪静态规则并保存设置 。 Apache服务器&a…

Linux——DNS服务搭建

&#xff08;一&#xff09;搭建nginx 1.首先布置基本环境 要求能够ping通外网&#xff0c;有yum源 2.安装nginx yum -y install nginx 然后查看验证 3.修改网页配置文件 修改文件&#xff0c;任意编写内容&#xff0c;然后去物理机测试 &#xff08;二&#xff09;创建一…

C++知识点总结:2.类和对象(自用)

类和对象 1. 类和对象的关系2. 对象指针3. 在堆上创建对象4. 成员访问限定符5. 名字编码&#xff08;Name Mangling&#xff09;6.构造函数7.构造函数的重载8.初始化列表8. 成员变量初始化的顺序&#xff08;通过初始化列表&#xff09;9. 初始化 const 成员变量10. 析构函数11…

【机器学习】pytorch 常用函数解析

目录 一、基本函数介绍 1.1 nn.Module 类 1.2 nn.Embedding 1.3 nn.LSTM 1.4 nn.Linear 1.5 nn.CrossEntropyLoss 1.6 torch.save 1.7 torch.load 1.8 nn.functional 1.9 nn.functional.softmax 本文主要对 pytorch 中用到的函数进行介绍&#xff0c;本文会不断更新~…

C语言内存函数精讲

目录 引言 1.内存分配函数malloc 2.内存释放函数free 3.内存拷贝函数memcpy 4.内存移动函数memmove 5.内存设置函数memset 6.内存比较函数memcmp 总结 引言 在C语言编程中&#xff0c;内存管理是核心技能之一。C语言提供了一系列内存操作函数&#xff0c;这些函数在动…

jmeter-beanshell学习-try处理异常

有时候代码执行过程中&#xff0c;出现一些不能处理的情况&#xff0c;就会报错&#xff0c;还影响之后的代码执行&#xff0c;就需要跳过异常。 上面这情况报错了&#xff0c;还影响了下面的打印。beanshell用try和catch处理异常&#xff0c;下面是try的用法&#xff0c;和if有…

技术守护尊严||Chat GPT在抵抗性骚扰的作用分析

就在本周&#xff0c;中国人民大学女博士实名举报导师性骚扰的事情&#xff0c;引发全网关注&#xff01; 性骚扰&#xff0c;无论在线上还是线下&#xff0c;无论在职场还是校园&#xff0c;都是对个人尊严与权益的严重侵犯。 幸运的是&#xff0c;随着人工智能技术的飞速发…

优化冗余代码:提升前端项目开发效率的实用方法

目录 前言代码复用与组件化模块化开发与代码分割工具辅助与自动化结束语 前言 在前端开发中&#xff0c;我们常常会遇到代码冗余的问题&#xff0c;这不仅增加了代码量&#xff0c;还影响了项目的可维护性和开发效率。还有就是有时候会接到紧急业务需求&#xff0c;要求立马完…

[网络通信原理]——TCP/IP模型—网络层

网络层 网络层概述 网络层位于OSI模型的第三层&#xff0c;它定义网络设备的逻辑地址&#xff0c;也就是我们说的IP地址&#xff0c;能够在不同的网段之间选择最佳数据转发路径。在网络层中有许多协议&#xff0c;其中主要的协议是IP协议。 IP数据包格式 IP数据报是可变长度…

《最新出炉》系列入门篇-Python+Playwright自动化测试-55- 上传文件 (非input控件)- 中篇

软件测试微信群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 在实际工作中&#xff0c;我们进行web自动化的时候&#xff0c;文件上传是很常见的操作&#xff0c;例如上传用户头像&#xff0c;上传身份证信息等。所以宏哥打算按上传文件…

Java从入门到精通(十二)~ 动态代理

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 目录 前言 主要作用和功能&#xff1a; 应用场景&#xff1a; 二、代理概念 1.静态代理 2.动态代理 2.1 概念介绍 …

网址导航系统PHP源码分享

1、采用光年全新v5模板开发后台 2、后台内置8款主题色&#xff0c;分别是简约白、炫光绿、渐变紫、活力橙、少女粉、少女紫、科幻蓝、护眼黑 3、可管理无数引导页主题并且主题内可以进行不同的自定义设置&#xff0c;目前内置16套主题 持续增加中… 4、可单独开发各种插件&a…

OSPF Type2 Message / DBD Packet (Database Descriptor)

注&#xff1a;机翻&#xff0c;未校对。 OSPF Type2 Message / DBD Packet (Database Descriptor) DBD (Database Description or Type2 OSPF Packet) is a sort of summary of the OSPF Database in a router. DBD is used to check if the LSDB between 2 routers is the s…

Linux---make/makefile工具

目录 基本了解 makefile基础语法 依赖关系 依赖方法 makefile文件内容格式 make执行机制 补充知识 机制解释 PHONY关键字 makefile补充语法 基本了解 在Linux中&#xff0c;make/makefile是项目自动化构建工具。如果我们没有make/makefile&#xff0c;那我们要编译一…

基于Java的模拟写字板的设计与实现

点击下载链接 基于Java的模拟写字板的设计与实现 摘要&#xff1a;目前&#xff0c;很多新的技术领域都涉及到了Java语言&#xff0c;Java语言是面向对象编程&#xff0c;并且涉及到网络、多线程等重要的基础知识&#xff0c;因此Java语言也是学习面向对象编程和网络编程的首…

Linux系统编程——生产者消费者模型

目录 一&#xff0c;模型介绍 1.1 预备知识&#xff08;超市买东西的例子&#xff09; 1.2 模型介绍 1.3 CP模型特点 二&#xff0c;基于阻塞队列的CP模型 2.1 介绍 2.2 阻塞队列的实现 2.3 主函数实现 2.4 效果展示 三&#xff0c;POSIX信号量 3.1 信号量原理 3…