当前位置: 首页 > news >正文

气压测试实验(用IIC)

 I2C:

如果没有I2c这类总线,连接方法可能会如下图:

        单片机所有的通讯协议,无非是建立在引脚(高低电平的变换+高低电平持续的时间)这二者的组合上,i2c 多了一个clock线,负责为数据传输打节拍。

(i2c 传输数据的格式--读数据)

BMP180:

        BMP180是一款由德国博世(Bosch Sensortec)公司开发的高精度数字气压和温度传感器。它采用微电子机械系统(MEMS)技术,能够准确测量大气压力和温度,并具有低功耗、小尺寸、高稳定性的特点。BMP180通过I2C接口与微控制器或单片机通信,提供的气压和温度数据可用于气象观测、气候研究、天气预报、高度测量等多个领域。此外,BMP180还具有温度补偿功能,能减少温度对气压测量的影响,确保测量数据的准确性。

 (接线图)

 arduion 中:我们用如下这个lib:

 example code:

#include <Adafruit_BMP085.h>/*************************************************** This is an example for the BMP085 Barometric Pressure & Temp SensorDesigned specifically to work with the Adafruit BMP085 Breakout ----> https://www.adafruit.com/products/391These pressure and temperature sensors use I2C to communicate, 2 pinsare required to interfaceAdafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!Written by Limor Fried/Ladyada for Adafruit Industries.  BSD license, all text above must be included in any redistribution****************************************************/// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
// Connect GND to Ground
// Connect SCL to i2c clock - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 5
// Connect SDA to i2c data - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 4
// EOC is not used, it signifies an end of conversion
// XCLR is a reset pin, also not used hereAdafruit_BMP085 bmp;void setup() {Serial.begin(9600);if (!bmp.begin()) {Serial.println("Could not find a valid BMP085 sensor, check wiring!");while (1) {}}
}void loop() {Serial.print("Temperature = ");Serial.print(bmp.readTemperature());Serial.println(" *C");Serial.print("Pressure = ");Serial.print(bmp.readPressure());Serial.println(" Pa");// Calculate altitude assuming 'standard' barometric// pressure of 1013.25 millibar = 101325 PascalSerial.print("Altitude = ");Serial.print(bmp.readAltitude());Serial.println(" meters");Serial.print("Pressure at sealevel (calculated) = ");Serial.print(bmp.readSealevelPressure());Serial.println(" Pa");// you can get a more precise measurement of altitude// if you know the current sea level pressure which will// vary with weather and such. If it is 1015 millibars// that is equal to 101500 Pascals.Serial.print("Real altitude = ");Serial.print(bmp.readAltitude(101500));Serial.println(" meters");Serial.println();delay(500);
}

代码说明: 

        这段代码是使用Arduino平台编写的,旨在与Adafruit的BMP085气压和温度传感器进行交互,以读取温度、压力、以及基于这些值计算出的海拔。不过,请注意,虽然代码示例中使用了Adafruit_BMP085 bmp;来声明对象,但BMP085和BMP180在功能上是相似的,只是不同型号,且BMP085是较旧的型号。Adafruit的库通常能够很好地处理这两种传感器,但具体使用哪个型号取决于你连接的实际传感器。

下面是代码的详细解释:

初始化

  • Serial.begin(9600);:初始化串口通信,设置波特率为9600。

  • if (!bmp.begin()) {...}:尝试与BMP085传感器建立通信。如果bmp.begin()返回false(即!bmp.begin()true),则表示无法找到有效的BMP085传感器,可能是接线错误或传感器未正确连接。此时,程序会打印一条错误消息并进入无限循环。

循环

loop()函数中,程序会不断循环执行以下操作:

  1. 读取温度:使用bmp.readTemperature()函数读取当前温度(以摄氏度为单位),并通过串口输出。

  2. 读取压力:使用bmp.readPressure()函数读取当前大气压力(以帕斯卡为单位),并通过串口输出。

  3. 计算海拔

    • 首先,使用bmp.readAltitude()函数计算基于当前气压和标准海平面气压(默认为101325 Pa)的海拔。注意,这个计算假设了海平面气压是一个固定值,但在实际中,它可能会因天气等因素而变化。

    • 然后,通过bmp.readAltitude(101500)函数,可以提供一个更准确的海拔值,这要求你知道当前的海平面气压(在这个例子中为101500 Pa,即1015毫巴)。

  4. 计算海平面压力(基于当前气压和海拔):虽然这个功能在代码中直接调用bmp.readSealevelPressure()似乎是为了展示或计算某个值,但实际上,这个函数的使用场景可能是在你已经有了某个地点的海拔和当前气压,想要推算出该地点在海平面的气压值。不过,在这个循环的上下文中,它可能并不是特别有用,因为我们已经有了当前的气压值。

  5. 延时delay(500);使得每次循环之间有500毫秒的延时,以减少串口输出的速度,使数据更易于阅读。

注意事项

  • 确保你的Arduino与BMP085(或BMP180)传感器正确连接,包括电源线、地线以及I2C通信线(SCL和SDA)。

  • 如果你使用的是BMP180而不是BMP085,但Adafruit库支持两者,那么代码应该能够正常工作,无需修改。

  • 海拔的计算是基于气压的,而气压会受到天气、海拔等多种因素的影响,因此计算出的海拔值可能只是一个近似值。

stm32 单片机上,IIC 编程:

STM32使用I2C通讯的步骤可以归纳如下,这些步骤主要基于STM32CubeIDE或STM32CubeMX等工具进行配置,并结合HAL库函数实现通信。

1. 硬件连接

  • 确保STM32的I2C引脚(通常为SCL和SDA)正确连接到目标外设的相应引脚。

  • 在I2C总线上添加适当的上拉电阻(通常为4.7kΩ),以确保总线在空闲时保持高电平状态。

2. 配置STM32CubeIDE或STM32CubeMX

  • 创建新项目:打开STM32CubeIDE或STM32CubeMX,创建一个新的项目,并选择合适的STM32微控制器型号。

  • 配置I2C外设

    • 在“Pinout & Configuration”选项卡中,找到并选择I2C外设,为其分配正确的引脚(如PB6作为SCL,PB7作为SDA)。

    • 在“Configuration”选项卡中,设置I2C的时钟源、时钟速率、工作模式等参数。通常,时钟速率可以根据需要设置为100kHz或400kHz。

3. 初始化I2C外设

  • 在STM32CubeIDE中,通过STM32CubeMX生成的初始化代码,使用HAL_I2C_Init()函数初始化I2C外设。

  • 配置I2C_HandleTypeDef结构体,包括I2C实例、时钟参数、本地地址等。

4. 编写通信代码

  • 发送数据:使用HAL_I2C_Master_Transmit()HAL_I2C_Mem_Write()函数向从设备发送数据。需要指定从设备地址、寄存器地址(如果需要的话)和数据。

  • 接收数据:使用HAL_I2C_Master_Receive()HAL_I2C_Mem_Read()函数从从设备接收数据。同样需要指定从设备地址、寄存器地址(如果需要的话)和数据缓冲区。

5. 错误处理

  • 在通信过程中,可能会遇到各种错误,如总线忙、应答失败等。使用HAL_I2C_GetError()函数检查错误状态,并根据需要进行处理。

示例代码

以下是一个简化的示例,展示了如何在STM32中初始化I2C外设并发送数据:

#include "stm32f4xx_hal.h"  I2C_HandleTypeDef hi2c1;  void I2C1_Init(void) {  hi2c1.Instance = I2C1;  hi2c1.Init.ClockSpeed = 400000; // 400kHz  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;  hi2c1.Init.OwnAddress1 = 0;  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;  hi2c1.Init.OwnAddress2 = 0;  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;  HAL_I2C_Init(&hi2c1);  
}  void I2C_SendData(uint8_t slaveAddr, uint8_t regAddr, uint8_t data) {  HAL_I2C_Mem_Write(&hi2c1, slaveAddr << 1, regAddr, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);  
}  int main(void) {  HAL_Init();  I2C1_Init();  uint8_t slaveAddr = 0x50; // 假设的从设备地址  uint8_t regAddr = 0x00; // 寄存器地址  uint8_t data = 0xAA; // 要发送的数据  I2C_SendData(slaveAddr, regAddr, data);  // 其他代码...  
}

注意:上述代码是一个简化的示例,用于说明如何初始化I2C外设并发送数据。在实际应用中,您可能需要根据具体的硬件和需求进行调整。特别是从设备地址、寄存器地址和数据长度等参数,需要根据您连接的外设来确定。

此外,HAL_I2C_Mem_Write()函数中的从设备地址需要左移一位(并可选地添加读写位),因为I2C协议中的地址是7位或10位的,但在发送时通常会左移一位以在最低位添加读写位(0为写,1为读)。然而,在大多数情况下,当使用HAL_I2C_Mem_Write()HAL_I2C_Mem_Read()函数时,库函数已经处理了这一位的添加,因此您只需提供7位或10位的从设备地址即可(但通常需要左移一位以确保与库的期望相匹配)。如果库函数要求您提供8位地址,并且您的设备是7位地址,那么您应该手动将7位地址左移一位。如果库函数已经处理了这一点,那么您就不需要再次左移。在上述示例中,我假设了HAL_I2C_Mem_Write()函数需要8位地址,并且已经通过左移一位来添加了读写位(尽管在这个写操作的上下文中,读写位是0)。但是,请注意,这取决于您使用的具体HAL库版本和您的STM32微控制器型号。

相关文章:

气压测试实验(用IIC)

I2C: 如果没有I2c这类总线&#xff0c;连接方法可能会如下图&#xff1a; 单片机所有的通讯协议&#xff0c;无非是建立在引脚&#xff08;高低电平的变换高低电平持续的时间&#xff09;这二者的组合上&#xff0c;i2c 多了一个clock线&#xff0c;负责为数据传输打节拍。 (i2…...

C++ lambda闭包消除类成员变量

原文链接&#xff1a;https://blog.csdn.net/qq_51470638/article/details/142151502 一、背景 在面向对象编程时&#xff0c;常常要添加类成员变量。 然而类成员一旦多了之后&#xff0c;也会带来干扰。 拿到一个类&#xff0c;一看成员变量好几十个&#xff0c;就问你怕不…...

等待唤醒机制和阻塞队列

1. 等待唤醒机制 由于线程的随机调度&#xff0c;可能会出现“线程饿死”的问题&#xff1a;也就是一个线程加锁执行&#xff0c;然后解锁&#xff0c;其他线程抢不到&#xff0c;一直是这个线程在重复操作 void wait() 当前线程等待&#xff0c;直到被其他线程唤醒 void no…...

IO多路复用是如何处理多个客户端同时访问一个数据的

1. 原理概述 IO多路复用通过单个线程或进程监听多个文件描述符的状态变化&#xff0c;当某个文件描述符就绪&#xff08;例如&#xff0c;有数据可读、可写或发生异常&#xff09;时&#xff0c;线程或进程会收到通知&#xff0c;并对该文件描述符执行相应的IO操作。这种方式显…...

QT中使用UTF-8编码

在Qt中&#xff0c;确保应用程序使用UTF-8编码是非常重要的&#xff0c;尤其是在处理国际化和多语言文本时。以下是一些确保在Qt应用程序中使用UTF-8编码的方法&#xff1a; ### 1. 设置全局默认编码 在应用程序启动时&#xff0c;可以设置全局默认编码为UTF-8。这可以通过调…...

我对 monorepo 的一些思考

我对 monorepo 的一些思考 我对 monorepo 的一些思考 前言它的由来技术选型 管理工具语言与打包调试工具测试框架代码规范与质量控制本地引用与发包替换发包流程Github 相关配置部署 使用手册 功能特性总结如何使用&#xff1f;清除默认的包(可选)模板包介绍 packagesapps 更新…...

Java学习Day41:骑龙救!(springMVC)

springMVC与sevlet都是对应表现层web的&#xff0c;但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标&#xff1a; 小案例&#xff1a; 1.导入依赖 spring-context: 提供 Spring 框架的核心功能&#xff0c;如依赖注入、事件发布和其他应用上…...

Redis 常用命令总结

文章目录 目录 文章目录 1 . 前置内容 1.1 基本全局命令 KEYS EXISTS ​编辑 DEL EXPIRE TTL TYPE 1.2 数据结构和内部编码 2. String类型 SET GET MGET MSET SETNX INCR INCRBY DECR DECYBY INCRBYFLOAT 命令小结 内部编码 3 . Hash 哈希类型 HSET …...

Mysql SqlServer 分页

一、MySQL分页 SELECT column1, column2 FROM table ORDER BY column1 LIMIT Offset, Fetch; SELECT column1, column2 FROM table WHERE id BETWEEN StartId AND EndId ORDER BY column1; 二、Sql Server 分页 SELECT column1, column2 FROM table ORDER BY column1 OFFSE…...

电子支付原理

电子支付原理 1.电子支付概述2.线下支付概念和一般流程线下支付技术分类 3.线上支付概念和一般流程 参考自&#xff1a;https://www.topsec.com.cn/uploads/2023-10-08/49dab9d0-004b-4955-808a-d1c83998b8191696745486491.pdf 1.电子支付概述 电子支付通用支付流程一般涉及四…...

什么是OAuth 2.0?OAuth 2.0的工作流程是什么?与OAuth 1.0有哪些区别?

在浏览网页时&#xff0c;你肯定会遇到允许你使用社交媒体账户登录的网站。此功能一般是使用流行的OAuth 2.0框架构建的。OAuth 2.0是对OAuth 1.0的彻底重写&#xff0c;OAuth 2.0与OAuth 1.0或1.1不向后兼容。 1. OAuth产生背景 为了更好的理解OAuth&#xff0c;我们假设有如…...

Unity+LeapMotion2的使用

开始吧 导入步骤1.到官网下载软件并安装2.安装插件3.场景中添加检测管理器4.场景中添加手部模型 更多细节 导入步骤 1.到官网下载软件并安装 地址 重启电脑后连接设备 可以看到连接成功 2.安装插件 &#xff08;也可以看官方教程&#xff09; Project—>PackageManag…...

【CanMV K230 AI视觉】 跌倒检测

【CanMV K230 AI视觉】 跌倒检测 跌倒检测 动态测试效果可以去下面网站自己看。 B站视频链接&#xff1a;已做成合集 抖音链接&#xff1a;已做成合集 跌倒检测 跌倒检测主要根据人体姿态来判断&#xff0c;可以用于老人、小孩跌倒监护。 实验名称&#xff1a;跌倒检测 实验…...

谈谈PCIe VID、DID、SSID、SSVID背后的智慧

PCIe Vendor ID 想了半天还是觉得从“ID是什么”这个问题开始比较好。那么ID是什么&#xff1f;ID就是身份。那身份又是什么&#xff1f;身份就是一个合理存在&#xff0c;用于区分不同个体。为什么叫“合理存在”呢&#xff1f;如果国家不给你发身份证&#xff0c;你就是黑户…...

9月11日

使用绘制事件完成钟表的绘制 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpSocket> #include<QMessageBox>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpub…...

昇腾310内存拷贝测试

目的 从服务器将数据拷贝到昇腾310 ai卡 结论 数据进入到服务器后的内存不能直接用昇腾acl接口拷贝到AI卡。 需要 1&#xff09;先用acl接口申请内存&#xff1b; 2&#xff09; 将数据拷贝到acl申请的内存 3&#xff09;用acl接口将数据拷贝到AI卡 makefile # Copyri…...

‘$store‘ is not defined.

vueX不知道是否发挥作用&#xff1f;this.$store获取不到store/index.js中的数据 原因&#xff1a;版本问题 vuex版本不对&#xff0c;获取不到store 默认版本说明vuevue3vueXvue4vuex4只能在vue3中使用 vue默认vue3版本&#xff0c;vuex默认vuex4版本&#xff0c;vuex4只能…...

如何利用Linux提升工作效率和安全性?

Linux&#xff0c;作为一款自由和开放源代码的操作系统&#xff0c;已经在全球范围内得到了广泛的应用。无论是服务器、云计算、物联网&#xff0c;还是超级计算机&#xff0c;Linux都扮演着重要的角色。本文将深入探讨Linux的应用场景&#xff0c;以及如何利用Linux提升工作效…...

初始Linux 和 各种常见指令

目录 Linux背景 1. 发展史 Linux发展历史 1.历史 2. 开源 Linux下基本指令 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令&#xff08;重要&#xff09;&#xff1a; 06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a; …...

【稀疏矩阵】使用torch.sparse模块

文章目录 稀疏矩阵的格式coocsrcsc Construction of Sparse COO tensorsConstruction of CSR tensorsLinear Algebra operations&#xff08;稀疏与稠密之间混合运算&#xff09;Tensor methods and sparse&#xff08;与稀疏有关的tensor成员函数&#xff09;coo张量可用的ten…...

如何增加谷歌网站曝光率?

增加谷歌网站曝光率其实就是让更多的人在搜索相关内容时&#xff0c;能看到你的网站。首先你就要搞清楚用户在搜索什么&#xff0c;这样才能把正确的内容呈现在他们面前。首先&#xff0c;你得站在用户的角度思考&#xff0c;想想他们在搜索与你网站相关的信息时&#xff0c;可…...

虚幻中的c++(持续更新)

文章目录 虚幻中的cUPROPERTY参数 UFUNCTION参数 虚幻中的c UPROPERTY 是虚幻中用于声明属性的宏&#xff0c;它用于标记某个属性是一个虚幻托管的属性&#xff0c;并且可以在编辑器中进行访问和操作。其提供了一系列参数&#xff0c;用于定义属性的各种行为&#xff0c;例如是…...

83-MySQL 索引有几种

MySQL中的索引主要有以下几种&#xff1a; 普通索引&#xff1a;最基本的索引类型&#xff0c;没有唯一性的限制&#xff0c;可以通过多个字段创建复合索引。 唯一索引&#xff1a;与普通索引类似&#xff0c;但区别在于唯一索引的每一个索引值只对应唯一的数据记录。 主键索…...

文献解读-The trans-omics landscape of COVID-19

关键词&#xff1a;流行病学&#xff1b;基因测序&#xff1b;变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;The trans-omics landscape of COVID-19 标题&#xff08;中文&#xff09;&#xff1a;COVID-19的跨组学全景 发表期刊&#xff1a…...

Unity核心实践小项目

要源码包的私信我。 简介 衔接Unity核心学习后的实操小项目 需求分析 准备工作 面板基类 为了能够控制一画布整体的透明度&#xff0c;所以需要给每个面板都添加一个 CanvasGroup组件 UI管理器 UGUI方面的参数设置 开始场景 场景搭建 直接用资源包搭建好的场景&#xff1a;…...

Avaloia 实现国产麒麟系统中文显示界面

最近在搞一个国产麒麟系统的接口对接&#xff0c;因为&#xff0c;接口内含复杂的签名验证&#xff0c;而且还是离线环境&#xff0c;所以&#xff0c;postman不是很好用。 就想着哪个方式好一些&#xff0c;主要是有选择图片的操作&#xff0c;所以&#xff0c;在Electron和A…...

pytest 生成allure测试报告

allure的安装 github地址 allure资产列表 windows下载.zip&#xff0c;解压并配置环境变量PATH&#xff1b;linux下载tar.gz&#xff0c;解压配置&#xff1b; allure作为pytest插件 # 安装 pip install allure-pytest# 执行单元测试&#xff0c;生成allure测试数据&…...

查询GPU版本以及PyTorch中使用单GPU和多GPU

文章目录 多GPU介绍GPU可用性及版本检查使用单个GPU使用多个GPU多GPU介绍 多GPU是指使用多个显卡来同时进行计算,以加速深度学习模型的训练和推断。每个GPU都有自己的内存和计算能力,通过同时利用多个GPU可以并行地执行模型的计算,从而提高整体的计算效率。 GPU可用性及版…...

基于SpringBoot+Vue的线上考试系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的线上考试…...

动手学深度学习(pytorch土堆)-02TensorBoard的使用

1.可视化 代码使用了 torch.utils.tensorboard 将数据记录到 TensorBoard 以便可视化。具体来说&#xff0c;它将标量数据记录到目录 logs 中&#xff0c;使用的是 SummaryWriter 类。 代码分解如下&#xff1a; SummaryWriter("logs")&#xff1a;初始化一个 Ten…...