ZY_BMP280大气压模块的使用和程序

news2024/9/29 13:16:06

        在搞设计时,用到了大气压模块BMP280,这玩意也不难,主要是淘宝店老板特别der一问三不知,真服了,而且资料里面没有给例程,只有51的例程,利用IIC通信,而且给的例程里面,乱七八糟,连从机地址(BMP280的地址)都搞错了,而且资料很少。也找了很多博,但是博主的都不好使,整理的很乱,而且有个博主的程序都搞错了,还上传博客,不是误人子弟嘛。

        我上传的程序都是我测试好的,移植性强,大家放心复制粘贴。废话不多说先看看这个模块长什么样,我贪便宜,买的是最低配的,只能测温度和气压,我只需要 气压,所以这个模块够用。它长这个熊样子,用的邮票孔 ,这个特别便宜,才几块钱,用的是IIC协议。

        

 引脚

看一下引脚图SDO默认接地的,NC不需要连东西,两个GND,两个VCC都得接。

 原理图

 

 

 功能介绍

        BMP280内部有一个温度传感器和一个压力传感器,通过 I2C接口,可读取温度和压力
的数据。
        BMP280八位的器件地址为 111011X0,其中 X为 SDO配置状态,SDO低电平时器件地
址为 11101100(0XEC),SDO高电平时器件地址为 11101110(0XEE)。从原理图可以看到,SDO默认接地,那么咱们不需要连接任何东西,在找IIC地址时就是(0xEC)
        BMP280读取到的数据是芯片内部 ADC转换后的原始数值,并非最终的大气压力值。需
要进行转换才能得到气压值,根据 BMP280的寄存器中的系数进行计算转换。

测量步骤:1、读取寄存器的系数;2、读取 ADC转换后的原始数值;3、进行算法转换
得出气压。具体转换方法参考例程。
        BMP280上电初始化需要进行一些参数设置:工作模式、IIR滤波器、采样数量和采集频率等
设置

        这些东西需要在BMP280初始化中配置。

参数:

 工作电压:1.8V~5.5V
温度范围为: -40~ 85度
压强范围为:300~ 1100 hPa(海拔高度-500m到 9000m)
相对精度:±0.12hPa(±1m) 950-1050hPa@25℃
绝对精度:±1hPa(950-1050hPa,0--+40℃)

程序

        兄弟们,拿着程序大胆的复制粘贴,只要咱俩的模块长的一样,绝对可以用,就是头文件得注意,我相信,只要能用到bmp280,这个模块,stm32的能力绝对不会差劲。感觉不错的可以关注一下,谢谢各位。

bmp280.c

/*
		SCL——PB12
		SDA——PB11
		SDO默认接地
*/
#include "bmp280.h"              
#include "iic.h"            
#include <math.h>    
#include "usart.h"  
#include "delay.h"

unsigned short dig_T1;
short dig_T2;
short dig_T3;
unsigned short dig_P1;
short dig_P2;
short dig_P3;
short dig_P4;
short dig_P5;
short dig_P6;
short dig_P7;
short dig_P8;
short dig_P9;

void Bmp280WriteByte(uint8_t addr,uint8_t dat)
{
	IIC_Start();
	IIC_Send_Byte(0xEC); // 从机地址+写信号
	IIC_Wait_Ack();
	IIC_Send_Byte(addr);
	IIC_Wait_Ack();
	IIC_Send_Byte(dat);
	IIC_Wait_Ack();
	IIC_Stop();	
}
uint8_t Bmp280ReadByte(uint8_t addr)
{
	uint8_t dat;
	
	IIC_Start();
	IIC_Send_Byte(0xEC); // 从机地址+写信号
	IIC_Wait_Ack();
	IIC_Send_Byte(addr);
	IIC_Wait_Ack();
	
	IIC_Start();
	IIC_Send_Byte(0xED);// 从机地址+读信号
	IIC_Wait_Ack();
	dat = IIC_Read_Byte(0);// 无需应答
	IIC_Stop();	
	
	return dat;
}


long bmp280_MultipleReadThree(unsigned char addr)
{
    unsigned char msb, lsb, xlsb;
    long temp = 0;
    msb = Bmp280ReadByte(addr);
    lsb = Bmp280ReadByte(addr + 1);
    xlsb = Bmp280ReadByte(addr + 2);

    temp = (long)(((unsigned long)msb << 12)|((unsigned long)lsb << 4)|((unsigned long)xlsb >> 4));

    return temp;
}

short bmp280_MultipleReadTwo(unsigned char addr)
{
    unsigned char msb, lsb;
    short temp = 0;
    lsb = Bmp280ReadByte(addr);
    msb = Bmp280ReadByte(addr + 1);

    temp = (short)msb << 8;
    temp |= (short)lsb;

    return temp;
}

void Bmp280Init()
{
	uint8_t id;
	
	IIC_Init();
	
	Bmp280WriteByte(0xE0,0xB6);// 清除状态
	id = Bmp280ReadByte(0xD0); // 读取ID  0x58
//	printf("%c",id);
	
	if(id == 0x58)
      printf("bmp280 id is right...\r\n");
  else
      printf("bmp280 id is error...\r\n");
	
	Bmp280WriteByte(0xf4,0xff);
	Bmp280WriteByte(0xf5,0x00);
	
	dig_T1 = bmp280_MultipleReadTwo(0x88);
	dig_T2 = bmp280_MultipleReadTwo(0x8A);
	dig_T3 = bmp280_MultipleReadTwo(0x8C);
	dig_P1 = bmp280_MultipleReadTwo(0x8E);
	dig_P2 = bmp280_MultipleReadTwo(0x90);
	dig_P3 = bmp280_MultipleReadTwo(0x92);
	dig_P4 = bmp280_MultipleReadTwo(0x94);
	dig_P5 = bmp280_MultipleReadTwo(0x96);
	dig_P6 = bmp280_MultipleReadTwo(0x98);
	dig_P7 = bmp280_MultipleReadTwo(0x9A);
	dig_P8 = bmp280_MultipleReadTwo(0x9C);
	dig_P9 = bmp280_MultipleReadTwo(0x9E);
	
//	printf("%d %d %d\r\n",dig_T1,dig_T2,dig_T3);
//	printf("%d %d %d %d %d %d %d %d %d\r\n",dig_P1,dig_P2,dig_P3,dig_P4,dig_P5,dig_P6,dig_P7,dig_P8,dig_P9);
	delay_ms(200);
}


Bmp280DataTypeDef Bmp280Data;

uint8_t bmp280_GetValue(void)
{
	long adc_T;
	long adc_P;
	long var1, var2, t_fine, T, P;

	adc_T = bmp280_MultipleReadThree(0xFA); // 0xFA 0xFB 0xFC
	adc_P = bmp280_MultipleReadThree(0xF7); // 0xF7 0xF8 0xF9

	if(adc_P == 0 | adc_T == 0)
	{
			return 0;
	}

	//Temperature
	var1 = (((double)adc_T)/16384.0-((double)dig_T1)/1024.0)*((double)dig_T2);
	var2 = ((((double)adc_T)/131072.0-((double)dig_T1)/8192.0)*(((double)adc_T)
							/131072.0-((double)dig_T1)/8192.0))*((double)dig_T3);

	t_fine = (unsigned long)(var1+var2);

	Bmp280Data.T = (var1+var2)/5120.0;

	var1 = ((double)t_fine/2.0)-64000.0;
	var2 = var1*var1*((double)dig_P6)/32768.0;
	var2 = var2 +var1*((double)dig_P5)*2.0;
	var2 = (var2/4.0)+(((double)dig_P4)*65536.0);
	var1 = (((double)dig_P3)*var1*var1/524288.0+((double)dig_P2)*var1)/524288.0;
	var1 = (1.0+var1/32768.0)*((double)dig_P1);
	P = 1048576.0-(double)adc_P;
	P = (P-(var2/4096.0))*6250.0/var1;
	var1 = ((double)dig_P9)*P*P/2147483648.0;
	var2 = P*((double)dig_P8)/32768.0;
	Bmp280Data.P = P+(var1+var2+((double)dig_P7))/16.0;
	
	return 1;
}


bmp280.h文件

#ifndef __BMP280_H
#define __BMP280_H

#include "stm32f10x.h"

typedef struct 
{
	long P;
	long T;
}Bmp280DataTypeDef;

extern Bmp280DataTypeDef Bmp280Data;

#define AddrWrite 0xEC // 从机地址+写信号  SDO默认接地
#define AddrRead 0xED // 从机地址+读取信号  0xEC+1
#define NumRestAddr 0XE0 // 数据复位地址
#define NumRestDate 0XB6 // 数据复位数据


void Bmp280Init(void);
uint8_t bmp280_GetValue(void);
	
#endif


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

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

相关文章

数据库实验五:数据库设计实验

实验五 数据库设计实验 1.实验目的 ​ 掌握数据库设计基本方法及数据库设计工具。 2.实验内容和要求 ​ 掌握数据库设计基本步骤&#xff0c;包括数据库概念结构设计、逻辑结构设计&#xff0c;物理结构设计&#xff0c;数据库模式SQL语句生成。能够使用数据库设计工具进行…

ctf笔记:编码

常见编码 博客链接&#xff1a;https://www.blog.23day.site/articles/76 计算机中的数据都是按字节存储。一个字节(Byte)由8个二进制位组成(bit)。&#xff08;组成范围是0~255(28))一个字节一共可以用来表示256种不同的状态&#xff0c;每一个状态对应一个符号&#xff0c;就…

推荐系统学习笔记-隐语义模型

由来 该算法最早在文本挖掘领域被提出&#xff0c;用于找到文本的隐含语义。 核心思想是通过隐含特征(latent factor) 联系用户兴趣和物品。 参数 f&#xff1a;隐向量维度&#xff0c;决定隐向量表达能力强弱 n&#xff1a;用户数 m&#xff1a;物品数 求解方法&#xff1a;…

ADI Blackfin DSP处理器-BF533的开发详解57:DSP控制ADV7180采集图像到LCD显示(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了采集一帧 720625 尺寸的 P 制 CVBS 信号源&#xff0c;以 YUYV422 的数据格式保存&#xff0c;通过 MDMA 将奇偶场数据交…

【轻松掌握C语言】文件操作

目录 一、为什么使用文件&#xff1f; 二、什么是文件&#xff1f; 1、程序文件 2、数据文件 3、文件名 三、文件操作 1、文件指针 2、文件打开与关闭 . 3、文件的顺序读写 4、文件的随机读写 5、文本文件和二进制文件 6、文件读取结束判定 四、文件缓冲区 一、…

C++ Reference: Standard C++ Library reference: Containers: map: map: rbegin

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/rbegin/ 公有成员函数 <map> std::map::rbegin C98 reverse_iterator rbegin(); const_reverse_iterator rbegin() const; C11 reverse_iterator rbegin() noexcept; const_reverse_iterator rbegin(…

这个大力神杯,梅西已足足等了16年,AI预测:阿根廷冠军

潘帕斯雄鹰和高卢雄鸡的决战&#xff0c;在三十多小时后即将上演。AI预测&#xff1a;胜率接近&#xff0c;阿根廷略高。 12月18日&#xff0c;卡塔尔世界杯总决赛将正式开战。 由卫冕军法国对上寻求队史第三冠的阿根廷&#xff0c;同时也是两位顶尖球星兼巴黎圣日耳曼队友梅…

LeetCode | 二叉树高频面试算法题汇总【速来】

小伙子&#xff0c;来给我✍棵树【LeetCode】144.二叉树的前序遍历C版本C语言版本&#xff08;递归算法展开图&#xff09;【LeetCode】94.二叉树的中序遍历C版本C语言版本【LeetCode】145.二叉树的后序遍历C版本C语言版本【LeetCode】102.二叉树的层序遍历DSF——深度优先搜索…

Linux 之centos7:一、Linux安装

Linux 之centos7 1.Linux简介 ​ Linux内核最初只是由芬兰人李纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 ​ Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、支持多…

C#,基于视频的目标识别算法(Moving Object Detection)的原理、挑战及其应用

本文概述了基于监控视频之连续帧信息的各种目标识别算法及其存在的问题与挑战&#xff0c;结合实际应用开发的工作&#xff0c;文中给出了实验性基于帧差算法和改进型背景算法的非人工智能目标识别算法的实际效果。 目标识别算法一直并将持续成为人工智能研究与应用的重点&…

交换机设备上的G口、F口、E口、S口区别是什么?一台交换机有哪些接口呢?每个接口都有哪些作用?

交换机设备上的G口、F口、E口、S口区别是什么? 一台交换机有哪些接口呢?每个接口都有哪些作用? 交换机的主要功能包括:学习功能、转发过滤和消除回路。 学习功能:以太网交换机知道连接到每个端口的设备的MAC地址,将该地址与相应的端口进行映射,并存储在交换机缓存的MA…

jsp+ssm计算机毕业设计大学生互助系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

点云 3D 目标检测 - VoxelNet(CVPR 2018)

点云 3D 目标检测 - VoxelNet&#xff08;CVPR 2018&#xff09;摘要1. 引言1.1 相关工作1.2 贡献2. VoxelNet2.1 VoxelNet架构2.1.1 特征学习网络2.1.2 卷积中层2.1.3 区域提案网络2.2 损失函数2.3 高效实施3. 训练详情3.1 网络详细信息3.2 数据增强4. 实验4.1 KITTI验证集评估…

【算法】动态规划 ⑧ ( 动态规划特点 )

文章目录一、动态规划特点1、求解类型2、方向性3、动态规划状态选择4、动态规划方程设计一、动态规划特点 1、求解类型 求解类型 : 动态规划 必须是求 最值 , 可行性 , 方案数 , 三者之一 , 如果求其它内容 , 则不能使用动态规划算法 ; 求最值 : 最大值 , 最小值 等 ; 大规模问…

[附源码]Node.js计算机毕业设计工资管理系统PPTExpress

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

加入CSDN的第一百天,也是学C的第一百天

加入CSDN的一百天 1.学习总结 2.个人感悟 1.学习总结 学习c语言已经有100天&#xff0c;从一个初出茅庐的无知青年&#xff0c;敲出第一个hello world 都激动的不行&#xff0c;到现在&#xff1a; 常见的数据类型&#xff0c; 变量的命名方式&#xff0c; 变量的分类 到变…

[2022-12-17]神经网络与深度学习 hw9 - bptt

contentshw9 - Back Propagation Through Timetask1题目内容题目思路题目解答题目总结task2题目内容题目思路题目解答题目总结hw9 - Back Propagation Through Time task1 题目内容 推导RNN反向传播算法BPTT。 题目思路题目解答 首先我们要清楚RNN进行前向传播的过程&…

0. Canal 的安装和使用

我看过一场风景&#xff0c;后来我才知道&#xff0c;那是我人生中最美的一段时光。 我爱的人&#xff0c;爱我的人&#xff0c;都能度过这场新型感冒&#xff0c;那该多好。 Canal 的官网: https://github.com/alibaba/canal Canal 能干什么 为什么出现 Canal Canal 是阿里…

[ 数据结构 -- 手撕排序算法第二篇 ] 冒泡排序

文章目录前言一、常见的排序算法二、冒泡排序的实现2.1 基本思想2.2 单趟冒泡排序2.2.1 思路分析2.2.2 单趟代码实现三、冒泡排序的实现五、冒泡排序的时间复杂度5.1 最坏情况5.2 最好情况优化六、冒泡排序的特性总结总结前言 手撕排序算法第一篇&#xff1a;插入排序&#xf…

截止12.17 bitahub踩坑,mask无数次更改,lama代码的那些痛,羊了个羊,imwrite不生效

前面那篇跑出了STCN&#xff0c;倒是STCN熟悉了很多了 对bitahub&#xff0c;需要注意一个问题 要进ssh请用debug卡&#xff01;&#xff01;&#xff01;&#xff01; 要进ssh请用debug卡&#xff01;&#xff01;&#xff01;&#xff01; 要进ssh请用debug卡&#xff01;&…