采集温度数据,用串口传输到上位机

2023-05-16

这里写目录标题

    • 一、实验要求
    • 二、I2C总线通信协议
      • (一)概念
      • (二)I2C总线特征
      • (三)I2C总线协议
      • (四)I2C的两种方式——硬件I2C和软件I2C
    • 三、AHT20采集温度并上传上位机
    • 四、总结
    • 五、参考文献

一、实验要求

学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:

1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C–读写EEPROM”原理章节)

2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。

二、I2C总线通信协议

(一)概念

I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
I2C的物理拓扑结构:
在这里插入图片描述

(二)I2C总线特征

I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(可以从I2C器件的数据手册得知),主从设备之间就通过这 个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。

I2C总线上可挂接的设备数量受总线的最大电容400pF 限制,如果所挂接的是相同型号的器件,则还受器件地址位的限制。

I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。

I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。

(三)I2C总线协议

I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生。总线在空闲状态 时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当SCL为高而SDA由低到高的跳变,表示产生一个 停止条件。在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备 将释放总线,总线再次处于空闲状态。如图所示:

在这里插入图片描述
在了解起始条件和停止条件后,我们再来看看在这个过程中数据的传输是如何进行的。前面我们已经提到过,数据传输以字节为单位。主设备在SCL线上产生每个 时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位, 此时才认为一个字节真正的被传输完成。当然,并不是所有的字节传输都必须有一个应答位,比如:当从设备不能再接收主设备发送的数据时,从设备将回传一个否 定应答位。数据传输的过程如图所示:
在这里插入图片描述
在前面我们还提到过,I2C总线上的每一个设备都对应一个唯一的地址,主从设备之间的数据传输是建立在地址的基础上,也就是说,主设备在传输有效数据之前 要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来 数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据。如图所示:
在这里插入图片描述

(四)I2C的两种方式——硬件I2C和软件I2C

①硬件I2C
直接利用 STM32 芯片中的硬件 I2C 外设。

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

②软件I2C
直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平,从而模拟I2C。

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

③两者的差别
硬件 I2C 直接使用外设来控制引脚,可以减轻 CPU 的负担。不过使用硬件I2C 时必须使用某些固定的引脚作为 SCL 和 SDA,软件模拟 I2C 则可以使用任意 GPIO 引脚,相对比较灵活。对于硬件I2C用法比较复杂,软件I2C的流程更清楚一些。如果要详细了解I2C的协议,使用软件I2C可能更好的理解这个过程。在使用I2C过程,硬件I2C可能通信更加快,更加稳定。

三、AHT20采集温度并上传上位机

了解AHT20芯片的相关信息
具体信息请到官方下载对应产品介绍文档,资料链接如下
http://www.aosong.com/class-36.html
具体代码添加过程
在野火提供的示例代码中,打开一个只包含固件库的空项目。向工程中添加相关代码,添加代码的具体内容请参考下面链接:
https://blog.csdn.net/hhhhhh277523/article/details/111397514

完整代码在最后面

主要代码的分析
①AHT20芯片的使用过程

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芯片读取数据

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进行实现,可以查看关于STM32的原理图,可以看到硬件I2C接口,野火stm32mini开发板的I2C接口是PA2,PA3,要实现硬件I2C读取数据,就根据上面介绍的方式进行配置,即可完成通讯。
结果展示:
先进行程序烧录,在连接AHT20芯片采集温度上传上位机
在这里插入图片描述
这里我使用的是野火串口调试助手,设置好波特率为115200,得到结果:
在这里插入图片描述
视频效果见下面连接:
可以看到在手捂和哈气的时候可以观察到温度和湿度的变化
https://www.bilibili.com/video/BV12L4y1p7Nf/

四、总结

这个实验是通过I2C的串口通信来完成对于温度和湿度的采集,其实这个实验的代码都在老师给的博客里,我们只需要简单的进行连线完成在进行烧录实验就行了,过程比较简单,但是通过这个实验我们还是对于I2C的原理由了一个更加深入的了解与应用。

五、参考文献

https://blog.csdn.net/qq_43279579/article/details/111597278
https://zhuanlan.zhihu.com/p/388200151

完整代码:
https://pan.baidu.com/s/1TVVGrpdrr4QLQhEZIYz7mQ
提取码:wpj0

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

采集温度数据,用串口传输到上位机 的相关文章

  • C++类库开发详解

    前言 xff1a 这是一篇总结性的文章 xff0c 需要有一点C 43 43 和dll基本知识的基础 xff0c 在网上查阅了很多资料感觉没有一篇详细 具体 全面的dll开发介绍 xff0c 我这是根据最近项目和网上资料整理出来的 xff0
  • ROS下建立工作空间以及编译一个包

    在ROS层面上编写软件 xff0c 需要有相关的工作空间 xff08 workspace xff09 生成工作控件并不复杂 xff0c 首先 xff0c 我们打开一个控制台 xff08 Ctrl 43 Alt 43 T xff09 xff0
  • python socket小结

    Python socket 简单编程小结 首先创建服务器端的socket socket server import socket 定义变量 HOST 61 34 localhost 34 PORT 61 是数字类型 xff0c 不是字符串类
  • STM32 IO口模拟I2C+驱动MPU6050

    一年前写的博客 xff0c 没有把驱动代码分享出来是我疏忽了 xff0c 可以到网盘下载驱动代码 链接 xff1a https pan baidu com s 1SDVQfyoOoycCY 6eSXamlQ 密码 xff1a ipj7 之后
  • git常用操作(branch tag)

    git日常总结 1 初次在本地下载分支代码操作2 初次下载远程代码3 创建分支3 1 创建本地分支3 2创建远程分支 4 删除分支4 1 删除本地分支4 2删除远程分支 5 删除文件5 1 删除本地文件5 2 删除远程文件 6 删除提交6
  • openwrt出现md5sum mismatch错误

    原文地址 xff1a http catinmay com openwrt E5 87 BA E7 8E B0md5sum mismatch E9 94 99 E8 AF AF 刚刚帮人搞路由器一运行安装命令就会出现此错误 xff0c 错误提
  • python——系统交互subprocess

    目录 一 os与commands模块 1 os system 函数实例 2 os popen 函数实例 3 commands getstatusoutput 函数实例 二 subprocess模块 1 subprocess模块中的常用函数
  • strcat 你真的懂吗?

    http blog chinaunix net uid 26914516 id 4215338 html 声明 xff1a 使用GCC编译 strcat xff08 连接两字符串 xff09 函数定义 xff1a char strcat c
  • HTTP超全详解

    HTTP协议简介 超文本传输协议 xff08 英文 xff1a HyperText Transfer Protocol xff0c 缩写 xff1a HTTP xff09 是一种用于分布式 协作式和超媒体信息系统的应用层协议 HTTP是一个
  • 【Linux】三次握手和四次挥手详解

    三次握手和四次挥手 TCP 协议提供的是 xff1a 面向连接 可靠的 字节流服务 使用 TCP 协议通信的双发必须先建立连接 xff0c 然后才能开始数据的读写 双方都必须为该连接分配必要的内核资源 xff0c 以管理连接的状态和连接上数
  • Sion 450行的c++ HttpClient

    Sion Sion是一个轻量级的c 43 43 http客户端 xff0c 仅单头文件450行 xff0c 自带std string的扩展Sion is a lightweight C 43 43 HTTP Client with only
  • bluerov软件调试教程(一 )

    bluerov是目前最流行的一款消费级ROV xff0c 其架构简单 xff0c 可操作性强 xff0c 比同类型的ROV体验感要高很多 xff0c 本系列教程将从bluerov的软件调试 xff0c 硬件调试 xff0c 装舱等三个方面去
  • 安装完成Ubuntu20.04之后要做的事:基础配置、界面美化、异常处理与常用软件的安装

    文章目录 一 换源1 1 通过软件更新1 2 通过修改源文件 二 安裝显卡驱动2 1 解决显卡驱动安装的错误 三 设置新建文件模板四 卸载系统软件五 安裝中文输入法5 1 安装5 2 解决键盘短暂失灵和延迟的问题 六 双系统时间同步七 修改
  • 【C++】Windows客户端与Ubuntu服务器基于socket的简易网络编程

    C 43 43 Windows客户端与Ubuntu服务器基于socket的简易网络编程 服务器端 本人使用的clion远程连接的ubuntu服务器来运行以下代码 xff0c 理论上也可以直接放在服务器上 创建项目后 xff0c 先运行以下代
  • Python中pyusb的开发及使用

    Python中pyusb的开发及使用 因为项目的需求 xff0c 需要将FPGA端的图像像素数据经过USB2 0协议传输到PC端 xff0c 因此需要使用python的pyusb库来进行数据的发送和接收 以下纪录在使用pyusb库的方法和所
  • NVIDIA Jetson Xavier NX 实现官方Jeston-inference深度学习样例

    一 jetson inference相关项目组件的下载 首先附上官方提供的jetson inference项目文件的Github仓库地址 xff0c 大家可以自行前往下载 jetson inference下载地址 xff1a https g
  • CMake 混编c和c++代码

    准备工作 wsl 或者 有linux 系统 购买阿里云或者其他云服务器 xff09 cmake gcc git 等一些必要的软件安装 环境 windows 下 的 wsl wsl 安装下载 例子 拿 Unix网络编程 举例 作者对原生接口进
  • Ros中使用find_object_2d快速实现物体的检测识别

    运行环境 xff1a Ubuntu16 04 ros kinetic版本 准备工作 xff1a 需要r提前安装的webcam的驱动 xff0c 这里推荐使用两种usb cam和uvc camera xff08 1 xff09 usb cam
  • ubuntu16.04多版本Python任意切换(亲测有效)

    UBUNTU16 04的系统安装ROS之后 xff0c 自带的是Python2 7 12的版本 然后实际使用中 xff0c 可能用到其他工具需要装Python3 5以上的版本 安装完之后 xff0c 可能经常在编译某些工程的时候出现一些代码
  • ROS中级教程学习笔记1-手动创建ROS package

    之前在基础教程中 xff0c 我们使用的是catkin create pkg自动创建ros包 xff0c 实际上就是一个package xml文件和CMakeLists txt文件加文件夹 xff0c 所以手动创建看看能不能呢和自动创建有一

随机推荐

  • 串口分类

    串口一般来说就是UART xff0c 它实际只定义了数据链路层的规范 xff0c 也就是起始位 数据位 停止位 但是在不同的物理层又分为 xff1a TTL串口 RS232串口 RS485串口等 TTL串口 xff1a 它是MCU芯片之间进
  • ROS通信机制(二) —— 服务(service)与srv文件

    文章目录 简述特点相关常用命令通信模型核心元素通信过程代码示例 xff08 服务端和客户端 xff09 服务端 xff08 server cpp xff09 客户端 xff08 client cpp xff09 配置 CMakeLists
  • 学习日志之stm32——固件库编程规范

    对stm32固件库驱动的一点理解 stm32f4固件库主要有三个抽象层 xff1a gt 用C语言定义的寄存器地址与所有bits xff0c bit fields和寄存器的映射 所有后面这些都可以寻址 gt 所有的片上外设可用功能的程序接口
  • vs2010 webapi开发http请求以及website中如何实现http请求

    一 vs2010 webapi开发 第一步 xff1a 创建 第二步 xff1a 离线安装NuGet 1 复制链接到浏览器打开 xff1a http visualstudiogallery msdn microsoft com 27077b
  • 字节和bit的大小端简介

    C语言的位域虽然很多人强烈建议不要使用 xff0c 但现有系统里还广泛存在位域的使用 xff0c 所以还是很有必要理清楚的 对big endian和little endian的区别 xff0c 很多人认为是对多字节数据类型而言 其实 xff
  • C++ 数字与char*的转换

    目录 1 数字转char 1 1 sprintf1 2 itoa1 3 ltoa ultoa 2 char 转数字2 1 atoi2 2 atol2 3 atof2 4 strtol2 5 strtoul2 6 strtod 1 数字转ch
  • 【C语言】printf输出16进制: %x %02x %#x

    x即按十六进制输出 xff0c 英文字母小写 xff0c 右对齐 02X有以下变化 xff1a 英文字母变大写 xff0c 如果输出字符不足两位的 xff0c 输出两位宽度 xff0c 右对齐 xff0c 空的一位补0 超过两位的 xff0
  • 【c语言】结构体初始化4中方法

    今天在6轴传感器的驱动代码源文件中看到结构体没见过的写法 xff1a typedef struct uint8 t xlda 1 uint8 t gda 1 uint8 t tda 1 uint8 t not used 01 5 lsm6d
  • 【debug】stm32 指针奇数地址问题导致HardFault

    很久很久没有记录过debug了 xff0c 今天有空就正好记录一下 嵌入式开发 xff0c stm32F407的MCU的开发板 遇到如下问题 xff1a 变量的地址竟然为奇数 xff01 xff01 xff01 导致程序运行到写入该地址的数
  • 【Autosar】学习总结-BSW层

    一 简介 AUTOSAR AUTomotive Open Systems ARchitecture xff0c 汽车开放系统架构 1 优势 xff1a 有利于提高软件复用度 xff0c 尤其是跨平台的复用度 xff1b 便于软件的交换与更新
  • 【PWM】从stm32到pwm到OLED屏幕调光到晚上不要玩手机

    一 前言 最近做项目 xff0c 配置了单片机中PWM波形输出 xff0c 配置单片机中的一个引脚输出PWM波 xff0c 示波器查看这个波形 xff0c 做了实践操作 xff0c 有一些感想 xff0c 将一些了解过的知识和常识结合 xf
  • 算法提高 高精度加法

    1051 算法提高 高精度加法 时间限制 1 Sec 内存限制 256 MB 提交 5 解决 2 提交 状态 讨论版 题目描述 在C C 43 43 语言中 xff0c 整型所能表示的范围一般为 231到231 xff08 大约21亿 xf
  • 【Autosar】学习总结-MCAL

    一 简介 MCAL xff1a 微控制器抽象层 xff1b 位于BSW层中的最下层 xff1b MCAL细分 xff0c 可将驱动分为 xff1a 微控制器驱动 存储器驱动 通信驱动 IO驱动 xff1a 二 MCAL的配置 xff08 E
  • 【2022】年度总结

    一 月报 xff1a 1 一月 二月 初入新公司 xff0c 还在试用期 xff1b 进的外包安卓手机升级项目 xff0c 是一个短期的项目 xff0c 3 4个月左右 xff1b 第一次了解到外包项目原来是这种模式 xff1a 建立黄区
  • 【笔试总结 网络】IP地址分类 划分子网 子网掩码 (相关例题分析)

    xff08 最近做了很多春招公司笔试卷子 xff0c 发现很多是学过的东西 xff0c 看着很熟悉 xff0c 就是不会 很多学过的概念模棱两可 xff0c 这在笔试中很吃亏 说不会吧会点 xff0c 说会吧 xff0c 做不出来 就比如关
  • 网页登录时密码如何传输?

    今天突发奇想想看下一般网站登录时密码是如何传输的 首先是QQMail xff0c gmail xff0c 各大网上银行等对于我非常重要的登录网站 xff1a https https的安全性自然是很高 其次是通常的腾讯微博以及其他腾讯常用的网
  • C/C++中简单数据结构的对齐

    这里只讨论简单的数据结构 xff0c 从MSDN上的例子开始 struct x char a 1 byte int b 4 bytes short c 2 bytes char d 1 byte 在没有对齐的情况下 xff0c x 中的所有
  • yolo数据增强以及批量修改图片和xml名

    记录下打完标签对数据集进行扩增 xff0c 数据增强后的图片及标签名字进行修改 xff0c 重点在代码只需更改文件名就可使用 无论数据增强还是修改名称 xff0c 标签框位置都会跟着改变 xff01 xff01 xff01 前人之鉴 xff
  • 利用select实现服务器和客户端的随时收发

    服务器代码实现 xff1a include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt arpa inet h gt inclu
  • 采集温度数据,用串口传输到上位机

    这里写目录标题 一 实验要求二 I2C总线通信协议 xff08 一 xff09 概念 xff08 二 xff09 I2C总线特征 xff08 三 xff09 I2C总线协议 xff08 四 xff09 I2C的两种方式 硬件I2C和软件I2