气压测试实验(用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微控制器型号。

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

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

相关文章

同时拥有独显和核显,怎么让应用程序选择使用哪个GPU?

看你现在使用的是核显还是独显 勾选上GPU引擎选项&#xff0c;后面便会标识你所使用的是哪种显卡&#xff0c;如果是独立显卡&#xff0c;就可以免去后续的操作&#xff1b;如果不是&#xff0c;那么请继续接下来的操作。 将你需要使用独显的程序换成gpu1&#xff08;独显&am…

佰朔资本:未来钢铁行业产业格局有望稳中趋好

组织指出&#xff0c;未来钢铁作业工业格式有望稳中趋好&#xff0c;叠加当时部分公司已经处于价值小看区域&#xff0c;现阶段仍具结构性出资机会&#xff0c;尤其是拥有较高毛利率水平的优特钢企业和本钱管控力度强、具有规划效应的龙头钢企&#xff0c;未来存在估值修改的机…

JavaEE:文件操作

文章目录 文件操作和IO文件系统操作File介绍属性构造方法方法 代码演示前四个listmkdirrenameTo 文件操作和IO 文件系统操作 创建文件,删除文件,创建目录,重命名… Java中有一个类,可以帮我们完成上述操作. 这个类叫做File类. File介绍 属性 这个表格描述了文件路径的分隔符…

应急响应实战---是谁修改了我的密码?

前言&#xff1a;此次应急响应为真实案例&#xff0c;客户反馈无法通过密码登录服务器&#xff0c;疑似服务器被入侵 0x01 如何找回密码&#xff1f; 客户服务器为windows server2019&#xff0c;运维平台为PVE平台&#xff1b;实际上无论是windows系统或者是linux系统&#…

个人学习笔记7-5:动手学深度学习pytorch版-李沐

#人工智能# #深度学习# #语义分割# #计算机视觉# #神经网络# 计算机视觉 13.10 转置卷积 例如&#xff0c;卷积层和汇聚层&#xff0c;通常会减少下采样输入图像的空间维度&#xff08;高和宽&#xff09;。然而如果输入和输出图像的空间维度相同&#xff0c;在以像素级分类…

【物联网技术大作业】设计一个智能家居的应用场景

前言&#xff1a; 本人的物联网技术的期末大作业&#xff0c;希望对你有帮助。 目录 大作业设计题 &#xff08;1&#xff09;智能家居的概述。 &#xff08;2&#xff09;介绍智能家居应用。要求至少5个方面的应用&#xff0c;包括每个应用所采用的设备&#xff0c;性能&am…

2023级JavaScript与jQuery

第三课&#xff1a;JavaScript对象编程 一.预习笔记 1.Date对象 对象创建&#xff1a;var myDatenew Date() 输出显示当前日期的标准时间 对象创建&#xff1a;var myDatenew Date(“2024/09/14”) 对象创建&#xff1a;var myDatenew Date(2024,9,14) 当前对象创建时&…

TiDB从0到1学习笔记(精华篇)

历时四个月&#xff0c;恭喜赵老师的《TiDB从0到1》 系列文章顺利完结&#xff0c;小编再次梳理一遍文稿&#xff0c;并附注解分享给大家。 整体架构 从 TiDB 1.0 到 8.0&#xff0c;TiDB 的体系结构一直在不断演进。接下来让我们一起看看整体架构的变化。 TiDB v1 TiDB v1&…

Windows 环境下 vscode 配置 C/C++ 环境

vscode Visual Studio Code&#xff08;简称 VSCode&#xff09;是一个由微软开发的免费、开源的代码编辑器。它支持多种编程语言&#xff0c;并提供了代码高亮、智能代码补全、代码重构、调试等功能&#xff0c;非常适合开发者使用。VSCode 通过安装扩展&#xff08;Extension…

node.js实现阿里云短信发送

效果图 实现 一、准备工作 1、官网直达网址&#xff1a; 阿里云 - 短信服务 2、按照首页提示依次完成相应资质认证和短信模板审核&#xff1b; 3、获取你的accessKeySecret和accessKeyId&#xff1b; 方法如下&#xff1a; 获取AccessKey-阿里云帮助中心 4、获取SignNa…

【LabVIEW学习篇 - 24】:生产者/消费者设计模式

文章目录 生产者/消费者设计模式案例&#xff1a;控制LED等亮灭 生产者/消费者设计模式 生产者/消费者是多线程编程中最基本的一种模式&#xff0c;使用非常普遍。从软件角度看&#xff0c;生产者就是数据的提供方&#xff0c;而消费者就是数据的消费处理方&#xff0c;二者之…

微信小程序开发——比较两个数字大小

在这里我们使用的工具是 需要自行安装和配置。 在微信小程序中比较两个数字大小有以下几种方式&#xff1a; 一、普通条件判断 在小程序的.js 文件中&#xff0c;先定义两个数字&#xff0c;如let num1 5; let num2 3;。通过if - else if - else语句&#xff0c;根据num1与…

文件管理系统DCC与泛微OA系统集成案例

一、项目背景 上海某半导体有限公司主要产品应用于图像传感器、 图像信号处理芯片、 低功耗芯片、 射频芯片等。 公司内部有DCC文件管理系统和OA系统&#xff0c;由SAP PO平台进行中间管理&#xff0c;DCC系统对接泛微OA系统推送文件等操作&#xff0c;提高公司内部各自系统…

智能智造和工业软件研发平台SCSAI功能介绍

用爱编程30年&#xff0c;倾心打造工业和智能智造软件研发平台SCIOT,用创新的方案、大幅的让利和极致的营销&#xff0c;致力于为10000家的中小企业实现数字化转型&#xff0c;打造数字化企业和智能工厂&#xff0c;点击上边蓝色字体&#xff0c;关注“AI智造AI编程”或文末扫码…

lightdm , xrandr , startx 桌面管理器,窗口管理器

问题&#xff1a; 了解这几个的含义。 显示服务器 这个不是很明白 显示管理器&#xff0c; 知道就行了&#xff0c;也不是很明白。 窗口管理器。 桌面管理器。 这个其实就是 桌面环境了&#xff0c; 我们的板卡上使用的是xface 。 这个 xface 是一个集合&#xff0c;这里面…

亚马逊IP关联及其解决方案

在电子商务领域&#xff0c;亚马逊作为全球领先的在线购物平台&#xff0c;吸引了众多商家和个人的参与。然而&#xff0c;随着业务规模的扩大&#xff0c;商家在使用亚马逊服务时可能会遇到IP关联的问题&#xff0c;这不仅影响账户的正常运营&#xff0c;还可能带来一系列不利…

基于SpringBoot+Vue的个性化视频推荐系统

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

ComfyUI安装节点过程中被降低了版本的软件包重新安装

最近在安装2个没怎么及时更新节点时&#xff0c;安装节点依赖性过程中&#xff0c;将原高版本的软件包&#xff0c;给降到了低版本&#xff0c;解决的办法就是&#xff1a;1、再次删除软件包&#xff0c;2、指定版本号重新安装回高版本软件包。

Centos7.9部署Gitlab-ce-16.9

一、环境信息 软件/系统名称版本下载地址备注Centos77.9.2009https://mirrors.nju.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.isogitlab-cegitlab-ce-16.9.1https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.9.1-ce.0.el7.x86_64.rpm…

使用Azure Devops Pipeline将Docker应用部署到你的Raspberry Pi上

文章目录 1. 添加树莓派到 Agent Pool1.1 添加pool1.2 添加agent 2. 将树莓派添加到 Deployment Pool2.1 添加pool2.2 添加target 3. 添加编译流水线3.1 添加编译命令3.2 配置触发器 4. 添加发布流水线4.1 添加命令行4.2 配置artifact和触发器 5. 完成 1. 添加树莓派到 Agent P…