嵌入式人工智能(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;这些函数在动…

把Hexo博客迁移到新电脑

原文&#xff1a;https://blog.c12th.cn/archives/31.html 前言 把博客迁移到新电脑&#xff0c;以前推 Github 仓库不用配Key也能推&#xff0c;现在需要配Key了… 准备工作 确保在新电脑上配置好 Node.js 的环境 安装hexo npm install hexo-cli -g安装插件 npm install …

nmcli修改连接名 笔记240725

nmcli修改连接名 nmcli connection modify 原名 con-name 新名nmcli connection modify UUID con-name 新名通过网络名或uuid删除连接 nmcli connection delete 连接名或uuid通过设备名删除连接 nmcli device disconnect 设备连接用 nmcli device connect 设备名 创建的连接…

在android中怎么处理后端返回列表中包含图片id,如何将列表中的图片id转化成url

在 Android 中实现从包含图片 ID 的列表获取实际图片 URL 并显示图片,你可以使用以下步骤: 定义数据模型:创建一个 Java 或 Kotlin 类来表示列表中的对象。 网络请求:使用 Retrofit 或其他网络库来获取图片 URL。 异步处理:使用 AsyncTask、RxJava 或 Kotlin 协程来处理网…

算法训练 2024.7.27 17:25

目录 1. 两数之和2.反转链表3. 是否为有效的括号4.最长公共前缀5.合并两个有序数组6. 岛屿的个数7. 最小路径和8. 三数之和9. 计数质数10. 字符串转换整数 ( atoi) 1. 两数之和 题目&#xff1a; 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为…

Python 在自动化中的实际应用:用 Python 简化繁琐任务

文章目录 1、概述2、自动化文件和目录管理3.数据处理与分析4.网页爬虫5. 系统管理6。定时任务7.结语 1、概述 这篇文章将深入探讨Python在自动化中的实际应用&#xff0c;帮助您用Python简化繁琐任务。 我们将从多个方面入手&#xff0c;展示如何利用Python进行文件管理、数据…

百度贴吧爬虫实战(BeautifulSoup+lxml)

文章目录 BeautifulSouplxml使用场景具体代码具体解析1. 导入模块2. 定义爬虫类3. 初始化方法4. 获取URL列表5. 获取页面内容6. 提取页面数据7. 保存数据8. 运行爬虫9. 主程序 总结 在实际爬虫之前还需要了解和下载两个模块&#xff1a;BeautifulSoup和lxml。 BeautifulSoup 和…

jmeter-beanshell学习-try处理异常

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

PHP哈希签名方式sha1和sha256用于API对接签名验证

sha1 &#xff08;长度40字节&#xff09; -------------------------------------------------------------- $str 203fpid; $sha1 sha1($str); echo $sha1.<br>; php sha256加密 &#xff08;长度64&#xff09; --------------------------------…

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

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

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

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

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

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