7-I2C与AHT20温湿度传感器

news2024/11/25 4:55:55

I2C与AHT20温湿度传感器

嵌入式领域另一种常见的通信IIC通信,并用其与AHT20传感器进行交互,获取房间的温度与湿度。

在这里插入图片描述

I2C有一条用于传递数据的数据线称为SDA(Serial Data),另一条是用于提供同步时钟脉冲的时钟线SCL(Serical clock)。SDA可以双向通信,但同一时刻只允许一段发送信号。

而串口的两根数据线TX-RX 和 RX-TX 为全双工通信,可以同时进行双向通信。

为了避免冲突,I2C采用了主从模式,一台为主机,另一台(或多台)为从机

在这里插入图片描述

只能由主机发起通信,从机才能根据主机的指令回复相应的信息。一问一答

或者与多台从机交互

在这里插入图片描述

这种总线协议,只需要在发送数据时带有目标地址的数据,相应地址的设备才会回应,其他设备则选择性“失聪”

IIC 采用同步通信,第二根线,SCL 保证

在而串口采用异步通信,没有SCL线,通信的双方都是基于各自的时钟,好处是比较便捷,其缺点就是通信的双方必须保证各自的系统时钟系统是精确的。若一方有问题,就会不知所云。

I2C1上有两个传感器:AHT20以及OLED

点击可查看具体过程

开始编码

1.新建文件

取名iic,将USART2打开用于串口接收数据,在图形界面 Connectivity -> I2C1 -> 配置为标准的I2C模式 参数保持默认

Project mange -> Code Generator (代码生成器) -> 勾选 Generate peripheral initializationxxxx of ‘.c/.h’ filesXXX 为每一个外设生成一对.c/.h文件 就可以在其他文件中include 相应的头文件,就能拿到huart2 或者 hi2c1这类外设操作句柄了

保存后,代码多生成了

在这里插入图片描述

2.自定义AHT20的.c/.h文件

在这里插入图片描述

在aht20.h中

#include "i2c.h"

在aht20.c中

#include "aht20.h"

就可以引用串口,I2C的相关变量。

根据温湿度手册初始化AHT20

在这里插入图片描述

1.上电后需要等待40ms

2.先向ATH20发送0x71 , aht20回返回1字节的状态信息。并判断此状态信息的第三位是否为1,是1才进行后面的操作,如果不是,则要发送0xBE命令(初始化),此命令参数有两个字节,第一个字节为0x08,第二个字节为0x00

  • 0x71 是AHT20作为IIC从机的地址 AHT20_ADDRESS

IIC通信一般使用7位地址码,但发送时都是发送一字节即,8位,所以规定从机地址要向左移一位,左边补0还是1,则取决于如果主机发起通信的目的是为了设置(写)从机 那这一位为0,如果发起通信的目的是为了从从机读取数据,那这一位则为1,HAL对于0x70还是0x71的设置,相关函数会自动帮我们处理。一般默认说0

AHT20的地址码为0111000,但需要发送的数据地址为0x70

在这里插入图片描述

I2C通信指令:

I2C接收函数
HAL_I2C_Master_Receive(&hi2c1, AHT20_ADDRESS , &readBuffer, 3, HAL_MAX_DELAY);

参数说明

1.外设操作句柄的指针

2.读取的从机地址

3.用于接收数据的地址

4.读取的长度

5.设置超时时间。

I2C发送函数
HAL_I2C_Master_Transmit(&hi2c1, AHT20_ADDRESS , &readBuffer, 3, HAL_MAX_DELAY);

参数说明:

1.外设操作句柄的指针

2.发送到的从机地址

3.发送的数据指针

4.发送的长度

5.设置超时时间。

根据说明

在这里插入图片描述

在aht20.c中编写代码

#include"aht20.h"

#define AHT20_ADDRESS 0x70

void AHT20_Init(){
    uint8_t readBuffer;
	HAL_Delay(40);  //①
	
	HAL_I2C_Master_Receive(&hi2c1, AHT20_ADDRESS , &readBuffer, 1 , HAL_MAX_DELAY);  //②
	
	if ((readBuffer  &  0x08) == 0x00) {   //③
		uint8_t sendBuffer[3] = { 0xBE , 0x08 , 0x00 };  //④
		HAL_I2C_Master_Transmit(&hi2c, AHT20_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY); //④
	}
	
}

在这里插入图片描述

在这里插入图片描述

void AHT20_Read(float *Temperature, float *Humidty){   //读取温湿度并返回
    uint8_t sendBuffer[3] = {0xAC,0x33,0x00};   //①

    HAL_I2C_Master_Transmit(&hi2c1, AHT20_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY);  //②

    HAL_Delay(75);   //③

    uint8_t readBuffer[6];
    HAL_I2C_Master_Receive(&hi2c1, AHT20_ADDRESS , readBuffer, 6 , HAL_MAX_DELAY); //⑤
    if( (readBuffer[0] & 0x80 ) == 0x00) {
    	//计算
    	uint32_t data = 0;
    	data  = ((uint32_t)readBuffer[3]>>4)+((uint32_t)readBuffer[2]  << 4) + ((uint32_t)readBuffer[1]<<12);
    	*Humidty = data * 100.0f / (1<<20);


    	data = (((uint32_t)readBuffer[3]  &  0x0f )<<16 )  +   ((uint32_t)readBuffer[4]  << 8) + ((uint32_t)readBuffer[5]);
    	*Temperature = data *  200.0f/(1<<20) - 50;
	}


温湿度拼接以及计算公式

在这里插入图片描述

在这里插入图片描述

接着在aht20.h中声明

void AHT20_Init();
void AHT20_Read(float *Temperature,float *Humidity);

在main.c中:

#include "aht20.h"
#include "stdio.h"
#include "string.h"
//其他代码
//||||||
//其他代码 
/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  AHT20_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	  float temperature;
	  	float humidity;
	  	AHT20_Read(&temperature, &humidity);
	  	char message[50];
	  	sprintf(message,"温度:%.1f\t 湿度:%.1f%%\t\r",temperature,humidity);

	  	HAL_UART_Transmit(&huart2, (uint8_t *)message, strlen(message), HAL_MAX_DELAY);
	  	HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

接着在串口助手中查看

在这里插入图片描述

自此就完成了使用I2C与AHT20之间的通信发送并读取了温湿度相关信息。

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

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

相关文章

看图识微分与导数概念。

可建立如草图所示的局部坐标系。增量Δydy余项是草图中曲线的方程&#xff0c;微分dyydx&#xff08;是关于dx的一次函数&#xff09;是草图中切线的方程。草图形象直观地显示曲线Δy不切线dy。

安全可靠测评结果公告(2024年第1号)

大家可以选择对应的数据库&#xff0c;中央处理器&#xff0c;供参考&#xff1b;尤其是 水资源安可系统 智慧农业安可系统 智慧水利安可系统、智慧水务安可系统&#xff0c;企业安可系统 等参考使用

# 在执行 rpm 卸载软件使用 nodeps 参数时,报错 error: package nodeps is not installed 分析

在执行 rpm 卸载软件使用 nodeps 参数时&#xff0c;报错 error: package nodeps is not installed 分析 一、问题描述&#xff1a; 在执行 rpm 卸载软件使用 nodeps 参数时&#xff0c;报错 error: package nodeps is not installed 如下图&#xff1a; 二、报错分析&…

Java项目分层思路

Java项目分层思路 一、前言二、了解常见的术语1. 应用开发中使用的术语2. 建模和架构设计层面术语总结 三、如何划分1. 单个module2. 多个module 一、前言 每个人、每个开发团队的规范习惯都不太一样&#xff0c;没有固定标准&#xff0c;合适的才是最好的。 二、了解常见的术…

Python Django 查询集的延迟加载特性

Django 查询集的延迟加载特性 一、引言 在 Django 的开发过程中&#xff0c;查询集&#xff08;QuerySet&#xff09;是我们与数据库进行交互的重要工具。查询集提供了一种高效的方式来检索和操作数据库中的数据&#xff0c;且能够进行懒加载&#xff08;Lazy Loading&#x…

Gin框架教程02:AsciiJSON

什么是 AsciiJSON&#xff1f; AsciiJSON 是 Gin 框架中的一个方法&#xff0c;用于生成仅包含 ASCII 字符的 JSON。对于非 ASCII 字符&#xff08;例如汉字、特殊符号&#xff09;&#xff0c;AsciiJSON 会将其转义为 Unicode 表示&#xff08;如 \uXXXX&#xff09;&#xff…

使用CSS+SVG实现加载动画

使用CSSSVG实现加载动画 效果展示 CSS知识点 SVG元素使用SVG相关CSS属性运用 整体页面布局 <section><div class"box"><div class"loader"><svg><circle cx"40" cy"40" r"40"></circl…

vue从0开始的项目搭建(含环境配置)

一、环境准备 下载node.js 检查node.js版本 替换npm下载源 1.下载node.js: Node.js — 在任何地方运行 JavaScript (nodejs.org) 2.查看版本: windowsr输入cmd进入输入node -v命令查看版本号是否出现确认是否安装 2.替换npm下载源: npm config set registry https://reg…

深入Semantic Kernel:插件开发与实践应用(进阶篇)

文章目录 一、引言二、开发Semantic Kernel插件三、实战3.1 时间信息插件3.2 小部件工厂插件3.3 初始化Semantic Kernel实例3.4 四个实战示例3.4.1 模型幻觉3.4.2 给模型提供时间信息3.4.3 AI自动调用函数3.4.4 AI自动调用和使用枚举 四、结论 一、引言 在上一篇入门文章《探索…

vue3.x系列之v-model的使用技巧及面试高频问题

在前面的一篇文章中&#xff0c;我们分析了v-model在v2版中的用法。这次我们分析下在v3中的使用技巧。学习之前&#xff0c;请忘记之前的v2语法&#xff0c;现在的更加简洁易用。 组件上面的v-model 在v3.4版之前的写法如下 子组件Child.vue <!-- Child.vue --> <…

MobileViews: A Large-Scale Mobile GUI Dataset论文学习

这一片论文的工作主要集中在探索app上。 “ 设计#1&#xff1a;LLM增强型自动应用爬虫。为了提高应用程序遍历效率&#xff0c;我们引入了MobileViews Crawler&#xff0c;它使用固定的交互规则来处理繁琐的应用程序操作&#xff0c;LLM增强了其处理复杂UI状态的能力。在这个…

[C++ 核心编程]笔记 4.1.2 struct和class的区别

4.1.2 struct和class的区别 在C中 struct和class唯一的区别就在于 默认的访问权限不同 区别: struct 默认权限为公共class 默认权限为私有 #include<iostream> using namespace std;class C1 {int m_A;//默认私有 }; struct C2 {int m_A;//默认共有 };int main() {//s…

Android -- [SelfView] 多动画效果图片播放器

Android – [SelfView] 多动画效果图片播放器 效果&#xff08;录制的有点卡&#xff09; 1. 引用&#xff1a; <com.nepalese.virgolib.widget.image.BaseImageViewandroid:id"id/base_image"android:layout_width"match_parent"android:layout_heigh…

2024让我爱不释手的Mac清理神器CleanMyMac X4.15.8免费版

大家好&#xff0c;今天我要和大家分享一款让我爱不释手的Mac清理神器——CleanMyMac X。作为一个长期使用Mac的用户&#xff0c;我深知电脑在长时间使用后容易出现卡顿、存储空间不足等问题。而自从我遇到了CleanMyMac X&#xff0c;这些问题都迎刃而解啦&#xff01; #### 一…

实现一个进度条对话框

效果如下&#xff1a; 点击按钮后开启1个线程模拟加载什么东西&#xff0c;同时弹出1个进度条对话框&#xff0c;进度条达到最大值后&#xff0c;进度条对话框慢慢变透明然后消失 关键点是我们要在进度条类中添加1个槽函数&#xff0c;在这个槽函数中设置进度条的值 代码如下…

高校学科竞赛平台:SpringBoot实现的高效开发流程

3系统分析 3.1可行性分析 通过对本高校学科竞赛平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本高校学科竞赛平台采用SSM框架&#xff0c;JAVA作为开发语…

【Java】集合中单列集合详解(一):Collection与List

目录 引言 一、Collection接口 1.1 主要方法 1.1.1 添加元素 1.1.2 删除元素 1.1.3 清空元素 1.1.4 判断元素是否存在 1.1.5 判断是否为空 1.1.6 求取元素个数 1.2 遍历方法 1.2.1 迭代器遍历 1.2.2 增强for遍历 1.2.3 Lambda表达式遍历 1.2.4 应用场景 二、…

Autosar Dcm配置-App到Boot的跳转及1002回复配置及实现-基于ETAS软件

文章目录 前言App软复位的实现Dcm配置BswM配置BswMModeRequestPortBswMModeConditionBswMLogicalExpressionBswMActionListApp回复1002的实现Dcm配置代码实现App回NRC78的实现Dcm配置代码实现总结前言 在软件刷写流程中,上位机(诊断仪)发送1002后,APP检查允许跳转boot后,在…

python脚本处理--批量压缩解压文件(zip、rar) / 读取txt文件并在txt每行文件后面增加内容

一、批量压缩、解压文件 os库是为了监测生成的文件夹是否已存在。主要的库是zipfile&#xff0c;它提供了有关windows下的文件/文件夹的压缩、解压的函数。 压缩、解压函数及整体代码如下&#xff1a; import os import zipfiledef Compress_path_zip(path_all):path_all_list…

接口测试-day3-jmeter-3http请求默认值

postman只需要写上请求方式和url即可&#xff0c;但是在jmeter中则是分开写的。 对于同一个项目的接口而言&#xff1a;他们的协议、域名、端口号、内容编码都是一样的。这样就相当于做了重复的工作。 不一样的地方只是在路径。不同的页面的路径是不同的。 如果我们设置了相…