基于I2C协议利用STM32进行温湿度传感器的数据采集

2023-05-16

目录

  • 一、I2C总线通信协议的介绍
      • 1.I2C简介
      • 2.I2C总线时序图
      • 3.五种速率
      • 4.四种信号
      • 5.I2C的优缺点
      • 6.软件IIC和硬件IIC
  • 二、创建工程
      • 1.实验目的
      • 2.工具的选择
      • 3.相关代码分析
  • 三、线路的连接
  • 四、结果实现
  • 五、总结
  • 参考文献

一、I2C总线通信协议的介绍

1.I2C简介

I2C 是很常见的一种总线协议, I2C 是 NXP 公司设计的, I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),若不接上拉电阻,这两个引脚为悬空状态,由于悬空状态引脚的电平是无法确定的,所以这两条数据线需要接上拉电阻,一般是4.7K,总线空闲的时候SCL 和 SDA都处于高电平。
I2C 总线标准模式下速度可以达到 100Kb/S快速模式下可以达到 400Kb/S。 I2C 总线工作是按照一定的协议来运行的,I2C 是支持多从机的,也就是一个 I2C 控制器下可以挂多个 I2C 从设备,这些不同的 I2C从设备有不同的器件地址,这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C设备 了,一个 I2C 总线连接多个 I2C 设备。在这里插入图片描述

2.I2C总线时序图

在这里插入图片描述

3.五种速率

I2C协议可以工作在以下5种速率模式下,不同的器件可能支持不同的速率。
标准模式(Standard):100kbps
快速模式(Fast):400kbps
快速模式+(Fast-Plus):1Mbps
高速模式(High-speed):3.4Mbps
超快模式(Ultra-Fast):5Mbps(单向传输)

4.四种信号

I2C协议最基础的几种信号:起始、停止、应答和非应答信号。
起始信号
I2C协议规定,SCL处于高电平时,SDA由高到低变化,这种信号是起始信号。
停止信号
I2C协议规定,SCL处于高电平,SDA由低到高变化,这种信号是停止信号。
在这里插入图片描述

5.I2C的优缺点

优点:仅使用两根信号线,支持多个主设备和多个从设备,ACK / NACK位用于确认每个帧都已成功传输,硬件没有UART复杂。
缺点:数据传输速率比SPI慢,数据帧的大小限制为8位,硬件设计比SPI复杂。

6.软件IIC和硬件IIC

IIC分为软件IIC和硬件IIC

软件IIC:
软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。

工作方式:直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平,从而模拟I2C。

使用: 需要在控制产生 I2C 的起始信号时,控制作为SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL线切换为低电平,这样就输出了一个标准的 I2C 起始信号。

硬件IIC:
一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。

工作方式:直接利用 STM32 芯片中的硬件 I2C 外设。

使用: 只要配置好对应的寄存器,外设就会产生标准串口协议的时序。在初始化好 I2C 外设后,只需要把某寄存器位置 1,此时外设就会控制对应的 SCL 及 SDA 线自动产生 I2C 起始信号,不需要内核直接控制引脚的电平。

两者区别:
硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。

二、创建工程

1.实验目的

每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机。

2.工具的选择

温湿度传感器AHT20
串口调试助手
STM32最小核心板
杜邦线若干

3.相关代码分析

根据其他公司提供的示例代码进行修改与代码添加。(如正点原子或者野火)

在官网自行对照阅读进行查看相关AHT20资料

AHT20芯片的使用过程read_AHT20_once函数:

void  read_AHT20_once(void)
{
	delay_ms(10);

	reset_AHT20();//重置AHT20芯片
	delay_ms(10);

	init_AHT20();//初始化AHT20芯片
	delay_ms(10);

	startMeasure_AHT20();//开始测试AHT20芯片
	delay_ms(80);

	read_AHT20();//读取AHT20采集的到的数据
	delay_ms(5);
}

AHT20芯片读取数据 read_AHT20函数:

void read_AHT20(void)
{
	uint8_t   i;

	for(i=0; i<6; i++)
	{
		readByte[i]=0;
	}
	I2C_Start();//I2C启动

	I2C_WriteByte(0x71);//I2C写数据
	ack_status = Receive_ACK();//收到的应答信息
	readByte[0]= I2C_ReadByte();//I2C读取数据
	Send_ACK();//发送应答信息

	readByte[1]= I2C_ReadByte();
	Send_ACK();

	readByte[2]= I2C_ReadByte();
	Send_ACK();

	readByte[3]= I2C_ReadByte();
	Send_ACK();

	readByte[4]= I2C_ReadByte();
	Send_ACK();

	readByte[5]= I2C_ReadByte();
	SendNot_Ack();
	//Send_ACK();

	I2C_Stop();//I2C停止函数
	//判断读取到的第一个字节是不是0x08,0x08是该芯片读取流程中规定的,如果读取过程没有问题,就对读到的数据进行相应的处理
	if( (readByte[0] & 0x68) == 0x08 )
	{
		H1 = readByte[1];
		H1 = (H1<<8) | readByte[2];
		H1 = (H1<<8) | readByte[3];
		H1 = H1>>4;

		H1 = (H1*1000)/1024/1024;

		T1 = readByte[3];
		T1 = T1 & 0x0000000F;
		T1 = (T1<<8) | readByte[4];
		T1 = (T1<<8) | readByte[5];

		T1 = (T1*2000)/1024/1024 - 500;

		AHT20_OutData[0] = (H1>>8) & 0x000000FF;
		AHT20_OutData[1] = H1 & 0x000000FF;

		AHT20_OutData[2] = (T1>>8) & 0x000000FF;
		AHT20_OutData[3] = T1 & 0x000000FF;
	}
	else
	{
		AHT20_OutData[0] = 0xFF;
		AHT20_OutData[1] = 0xFF;

		AHT20_OutData[2] = 0xFF;
		AHT20_OutData[3] = 0xFF;
		printf("读取失败!!!");

	}
	printf("\r\n");
	//根据AHT20芯片中,温度和湿度的计算公式,得到最终的结果,通过串口显示
	printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);
	printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
	printf("\r\n");
}

编译成功及核心代码展示编译成功
完整代码在温湿度传感器的数据采集分支下

三、线路的连接

在这里插入图片描述
分析代码可知,关于温度传感器的解法如图所示在这里插入图片描述

SCL–>PB6
SDA–>PB7

在这里插入图片描述

四、结果实现

打开串口调试助手,将手放在温度器上,可以看到温度和湿度都发生了变化,则实验成功。

基于I2C协议进行温湿度传感器的数据采集

五、总结

在本次的实践过程中,我发现了许多问题,如温度传感器发送回的数据不显示,温度一致在测量,无测量值等问题,在排除接线故障以及代码错误的问题后,发现基础工程文件中的代码数据没有完全匹配,在进行修改后,顺利进行。
注意:在对温度传感器进行串接时,一定要仔细核对引脚的解法,否则可能引起一些严重的后果!!
为完成本次实践的操作,查询了大量资料以及I2C协议,在动手实践的的过程中受益匪浅,也希望可以帮助到看到这篇文章的你!

参考文献

I2C总线协议简介
I2C通信协议详解
IIC原理超详细讲解—值得一看
I2C协议靠这16张图彻底搞懂(超详细)
AHT20芯片的相关信息

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于I2C协议利用STM32进行温湿度传感器的数据采集 的相关文章

  • axios请求封装

    一 简单封装 封装get请求 function ajax get url params 61 return new Promise resolve 61 gt axios get url params then r 61 gt consol
  • 外接设备superblock问题解决方案

    can 39 t read superblock 1 查询device自动备份的节点 mkfs ext4 n device dev sda1 2 恢复节点 mkfs ext4 b superblocknum device dev sda1
  • Python+Webdriver实现淘宝、京东等抢单操作

    最近双十一已经到了 xff0c 笔者为了拓展技术水平研究了一下网络爬虫技术 xff0c 其中双十一给人印象最深刻地就是抢单了 xff0c 爬虫学的好 xff0c 监狱进得早 本着学术和技术研究的态度 xff0c 笔者仅使用了普通商品进行测试
  • Ubuntu用户创建及sudo权限配置

    在Ubuntu中 xff0c 如果您想让某个用户拥有sudo权限 xff0c 您需要执行以下步骤 xff1a 使用root用户或具有sudo权限的用户登录到系统 执行以下命令来添加新用户 xff1a sudo adduser usernam
  • UCOII信号量与消息邮箱

    信号量 信号量是用来保护共享资源用的 表示共享资源的个数 共享资源有被用的 xff0c 需要释放共享资源 共享资源被占用一个 xff0c 信号量的值会减1 共享资源被释放一个 xff0c 信号量的值会加1 OS EVENT OSSemCre
  • shell编程===》变量

    文章目录 变量一 变量介绍二 变量的使用2 1 先定义 后引用2 2 删除变量 三 变量的三大组成部分3 1 变量名的命名规范3 2 变量值的三种来源 三 预定变量四 常量 变量 一 变量介绍 什么是变量 xff1f 量指的是记录事物的状态
  • 串口传输数据到FPGA上用VGA显示的可能问题及注意事项

    1 vga分辨率的选择和显示屏分辨率 显示屏尺寸 型号无关 显示器能自动识别输入信号并调整分辨率 xff0c 输入640 480信号就自动分配到整个屏幕上 PLL的时钟配置时注意别填错 xff0c 显示器会报错 输入信号不匹配 2 注意ua
  • 四旋翼无人机调试时,电机滴滴滴响问题及解决办法汇总

    机型 xff1a 大疆450的机架 xff08 我太喜欢这个机架了 xff0c 可以不装腿儿 xff0c 不容易摔坏 xff09 电机 xff1a T motor的air系列 电调 xff1a 好盈的x系列 飞控 xff1a px4 插上电
  • 智能车模块详解——按键及按键调参

    同以往文章一样 xff0c 会附上几个讲理论的优质博客链接 xff0c 本文重点讲怎么用代码实现 按键 xff1a lcd showint8 0 0 P37 p37接一个按键 xff0c 按键没按下显示0 xff0c 按下显示1 xff1b
  • Nginx配置反向代理解决跨域问题

    通过Nginx配置反向代理结果跨域问题 第一步 xff1a 下载Nginx 一 下载 官网下载地址 xff1a http nginx org en download html 我下载的版本 xff1a http nginx org down
  • C++笔试试题讲解(~~~可能是全站唯独一份有解析的~~~)

    C 43 43 笔试题讲解 前言一 面向对象程序概论基本理论笔试题 二 从C到C 43 43 基本理论笔试题 三 类与对象基本理论笔试题 四 继承机制基本理论笔试题 五 多态性和虚函数基本理论笔试题 六 运算符重载基本理论笔试题 七 模板基
  • Linux C/C++ 学习路线(已拿腾讯、百度等)

    Linux C C 从零基础到入门 到熟悉的一些路线 xff0c 对于想走这个方向的同学 xff0c 可以认真看看 xff0c 分享到这里来 xff0c 希望对于正在走 Linux C C 路上的同学能有所帮助 我将大致按照以下的目录 xf
  • python架构之Django学习------基础篇一

    学习环境 xff1a ubuntu16 0 4 1 创建虚拟环境 mkvirtualenv test test为虚拟环境名称 2 删除虚拟环境 rmvirtualenv 3 在制定的虚拟环境上工作 workon test 4 退出虚拟环境
  • 无人机取证——飞行日志分析取证

    前言 随着科技发展日新月异 xff0c 利用无人机犯罪的途径和案例越来越多 xff0c 无人机除了拍照录像的用途外 xff0c 亦可能被有心人士用于运送违法物品等不法行为 xff0c 甚至 xff0c 若是绑上自制炸弹 xff0c 刻意飞去
  • 树莓派4B(4G/8G)安装Ubuntu18.04桌面版+ROS(Melodic)+Realsense SDK(T265+D400系列)

    文章目录 前言一 下载安装树莓派4B镜像 xff08 Ubuntu mate 18 04 xff09 1 树莓派4B服务器镜像2 准备物品3 镜像烧录4 安装桌面基础软件5 为了防止树莓派内存不够 xff0c 需要增加交换空间 xff0c
  • C++程序员这行能干一辈子吗?

    有人说 xff0c 程序员这一行就是吃青春饭 xff0c 不能干一辈子 xff0c 因为程序员面对的是一份高强度的工作 xff0c 同时面临着技术的快速迭代 xff0c 对于身体素质 学习能力等都有很高的要求 xff0c 所以很多人都面临入
  • 学习记录--PID(角度双环)

    一 xff0c 理论理解 参考 xff1a 从不懂到会用 xff01 PID从理论到实践 哔哩哔哩 bilibili 1 三个参数 Kp xff1a 比例系数 xff1a pid gt p out 61 pid gt kp pid gt e
  • FreeRTOS多任务调度器原理

    1 xff1a 多任务启动 1 xff1a 创建空闲任务 2 xff1a 配置SysTick和PendSV为最低优先级 3 xff1a 配置SysTick寄存器 4 xff1a 调用SVC中断 2 xff1a SVC业务流程 1 xff1a
  • 立创EDA使用教程

    1 xff1a 绘制原理图 1 1 放置元件 立创EDA可以在线编辑 xff0c 不同于AD和PADS需要自己绘制或者导入封装 立创可以直接在线拉取别人的封装过来使用 xff0c 当然也可以自己绘制 1 2添加导线和网络 W是连线 xff0
  • ubuntu电脑共享文件夹给另一台windows电脑

    1 xff1a 安装samba工具 sudo apt get install samba samba version 2 xff1a 配置共享文件夹路径 vi etc samba smb conf 在文件末尾添加 share comment

随机推荐

  • FreeRTOS 学习(一)

    一 使用FreeRTOS点亮LED灯 在STM32有一定基础 xff0c 在开始学习操作系统的小白 xff0c 介绍使用STM32用操作系统点亮第一盏灯 xff0c 这也是学习单片机最开始的地方 xff1b 下面来图文配置 xff0c 我这
  • FreeRTOS的启动流程,编码风格与调试方法

    一 启动流程 RTOS主要有两种比较流行的启动方式 xff0c 下面会通过伪代码讲解两种启动方式的区别 xff0c 然后看看STM32cubeMX集成的FreeRTOS采用哪种启动方式 1 方法一 xff1a 在main函数中将硬件初始化
  • 2021AIOps挑战赛|基于移动通信网络运维中的多指标时空序列预测

    2021国际AIOps挑战赛决赛暨AIOps创新高峰论坛于2021年5月13日在北京成功举行 本文根据中国移动研究院首席科学家 人工智能与智慧运营中心总经理冯俊兰博士现场发言纪要整理而成 演讲内容 各位领导 xff0c 各位老师 xff0c
  • python架构之Django学习------基础篇二

    学习环境 xff1a ubuntu16 0 4 1 创建项目 django admin startproject studypy studypy为项目名称 注意 xff1a 项目创建完成之后 xff0c 会有一个文件夹和项目名称一样 xff
  • VNC配置端口占用

    问题描述 xff1a 配置VNC环境时 执行systemctl配置端口发现有些端口被占用 systemctl status vncserver span class token operator span user 64 span clas
  • SNMP概述

    目录 SNMP的架构 SNMP的版本 SNMPv1 v2c 报文结构 操作类型 工作原理 SNMPv3 报文结构 SNMPv3体系结构 工作原理 用户组和用户名 SNMP的配置 基本配置 v2c配置 SNMPv3配置 xff08 USM用户
  • (18)ROS学习-TF坐标变换之静态坐标变换

    1 坐标msg消息 xff1a 订阅发布模型中数据载体 msg 是一个重要实现 xff0c 首先需要了解一下 xff0c 在坐标转换实现中常用的 msg geometry msgs TransformStamped和geometry msg
  • CentOS8.4 Samba服务配置

    目录 Samba服务简介 基本操作 Samba服务主配置文件 全局配置参数 局部配置参数 题一 创建共享资源 创建系统用户组和系统用户并查看 对系统用户设置Samba密码 查看已设置Samba密码的用户 建立共享资源目录并分配权限 修改主配
  • X86汇编语言从实模式到保护模式(Linux环境搭建)

    前言 在学完了计算机组成原理和王爽的汇编语言后 xff0c 虽然操作系统的理论知识能看懂了 xff0c 但做起xv6和ucore实验还是有一定难度 xff0c 所以还是得补一补x86汇编的知识 环境搭建 xff1a 因为书中的工具包和环境都
  • 【机器学习】二分类算法实现及算法精度比较

    文章目录 一 数据集选择1 感知机2 K近邻 xff08 knn xff09 3 朴素贝叶斯4 决策树id35 逻辑斯蒂回归总结 一 数据集选择 鸢尾花数据集 iris data Iris数据集是常用的分类实验数据集 xff0c 由Fish
  • OpenStack实战

    开源OpenStack实战 公有云 一个用户就是一个VPC虚拟私有云 在同一个VPC中的不同子网可以互通 不同VPC之间不能互通 一个VPC 就属于regin一个路由器 VPC不可以跨Regin 两个租户是不可以打通的 Regin xff1
  • VScode怎样从gitee上拉取项目?很简单,赶快学起来

    1 xff0c 在你写项目的磁盘里新建文件夹 2 xff0c 登录Gitee 3 xff0c 复制克隆 下载处的地址 4 xff0c 打开VScode xff0c 在新建的文件夹下 xff0c 打开终端 5 xff0c 运行 git clo
  • 《操作系统》-进程的定义组成和特征

    进程的定义组成和特征 进程的定义 程序 xff1a 就是一个指令序列 早期的计算机只支持单道程序 引用多道程序技术 xff1a 为了方便操作系统管理完成各程序并发执行 xff0c 引入了进程和进程实体的概念 进程实体 xff08 进程映像
  • 【完整教程】在win10平台下使用d435i深度相机读取数据并保存到本地,以便进行后续3D点云处理

    1 下载RealSense SDK 2 0 进入网址 xff1a RealSense SDK 2 0 直接拉到网站最下端 xff0c 在Asset下可以看到很多exe可执行软件 xff0c 由于我的电脑是win10 xff0c 所以选择第三
  • python架构之Django学习(管理站点)------基础篇三

    学习环境 xff1a ubuntu16 0 4 1 创建管理员 http 127 0 0 1 8000 admin python manage py createsuperuser 创建用户名密码 注册
  • VMware虚拟机安装Linux教程(超详细)

    一 安装 VMware 官方正版VMware下载 xff08 16 pro xff09 xff1a https www aliyundrive com s wF66w8kW9ac 下载Linux系统镜像 xff08 阿里云盘不限速 xff0
  • WIFI模块——ESP8266

    1 ESP8266简介 ESP8266是一款高性能的WIFI串口模块 xff0c 内部集成MCU能实现单片机之间串口通信 xff0c 是目前使用最广泛的一种WIFI模块之一 可以简单理解为一个WIFI转串口的设备 xff0c 不用知道太多W
  • 姿态传感器——MPU6050

    1 MPU6050介绍 MPU6050是由三个陀螺仪和三个加速度传感器组成的6轴运动处理组件 xff0c 是一款六轴 xff08 三轴加速度 43 三轴角速度 xff08 陀螺仪 xff09 xff09 传感器 内部主要结构 陀螺仪 加速度
  • Arch | Nodejs 配置

    今天在使用 npm 时出现了一些错误 xff0c 之前那个文章内容有点多 xff0c 找起来比较麻烦 xff0c 所以这里单独把一些软件的配置单独拉出来写一个文章 参考 ArchWiki Node js 安装 如果没有多版本需求的话 xff
  • 基于I2C协议利用STM32进行温湿度传感器的数据采集

    目录 一 I2C总线通信协议的介绍1 I2C简介2 I2C总线时序图3 五种速率4 四种信号5 I2C的优缺点6 软件IIC和硬件IIC 二 创建工程1 实验目的2 工具的选择3 相关代码分析 三 线路的连接四 结果实现五 总结参考文献 一