7-I2C与AHT20温湿度传感器

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 0x70void 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.rhkb.cn/news/446349.html

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

相关文章

oracle数据坏块处理(一)-通过rman备份修复

表有坏块时&#xff0c;全表查询会报错&#xff1a; 这时候如果有前面正常的rman备份&#xff0c;那么我们就可以通过rman备份直接对数据文件块做恢复 先对数据文件做个逻辑检查&#xff1a; RMAN> backup check logical VALIDATE DATAFILE EXB_DATA/exb/datafile/cuteinf…

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器 源链接&#xff1a;https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idchinaFlag 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.com/z2586300277/three-ce…

【算法思想·二叉树】用「遍历」思维解题 II

本文参考labuladongsuanfa笔记[【强化练习】用「遍历」思维解题 II | labuladong 的算法笔记] 如果让你在二叉树中的某些节点上做文章&#xff0c;一般来说也可以直接用遍历的思维模式。 270. 最接近的二叉搜索树值 | 力扣 | LeetCode | 给你二叉搜索树的根节点 root 和一个目…

Android Studio开发Kotlin项目中遇到的问题解决集

背景&#xff1a;Android Studio 2022.3.1 1.Unexpected tokens (use ; to separate expressions on the same line) 无法在同一行声明一个变量并实例化。 解决&#xff1a;分开 &#xff08;1&#xff09; var aaCo:Runoob<String>aaCoRunoob("aa") &…

阿里云dataworks测试

文章目录 开始查看全局信息查看数据源信息(endpoint与project的信息)查看绑定、解绑钉钉创建、查看AccessKey(Access Key ID与Access Key Secret) 线上开发新建开发节点mysqlpython 本地开发python 程序调度 开始 参考文档&#xff1a;https://help.aliyun.com/zh/ram/user-gu…

Stm32+Esp8266连接阿里云程序移植教程(MQTT协议)

Stm32Esp8266连接阿里云程序移植教程&#xff08;MQTT协议&#xff09; 一、前期准备二、移植过程三、程序的使用3.1 连接上阿里云3.2 传输用户数据到阿里云3.3 解析从阿里云下发给用户的数据3.4 关于调试接口 一、前期准备 自己要的工程文件移植所需的文件&#xff08;如下图&…

UML(统一建模语言)

面向对象设计主要就是使用UML的类图&#xff0c;类图用于描述系统中所包含的类以及它们之间的相互关系&#xff0c;帮助人们简化对系统的理解&#xff0c;它是系统分析和设计阶段的重要产物&#xff0c;也是系统编码和测试的重要模型依据。 画图软件&#xff1a;ProcessOn思维…

ROS2 “通信方式” 参数服务器

为什么加“通信方式”引号&#xff0c;因为我觉得他就不算通信&#xff0c;最多最多就是一个动态加载参数方式 所以ros通信方式就三种&#xff0c;topic service action 别犟&#xff0c;犟就是你对&#xff01; 常用的 param参数方法如下&#xff1a; # declare_parameter…

五款专业三维数据处理工具:GISBox、Cesiumlab、OSGBLab、灵易智模、倾斜伴侣深度解析

随着三维数据处理技术的广泛应用&#xff0c;尤其是在城市规划、地理信息系统&#xff08;GIS&#xff09;、工程监测等领域&#xff0c;处理倾斜摄影、三维建模以及大规模数据管理的需求日益增加。以下是五款我精心挑选的倾斜摄影和三维数据处理工具——GISBox、Cesiumlab、OS…

视频号直播自动回复与循环发送话术-自动化插件

我们在做视频号直播的时候&#xff0c;会有这种自动回复咨询问题的功能 唯一客服浏览器插件现在就支持&#xff0c;在视频号直播后台&#xff0c;自动化回复用户问题&#xff0c;以及循环发送我们的介绍话术

第十四章 RabbitMQ延迟消息之延迟队列

目录 一、引言 二、死信队列 三、核心代码实现 四、运行效果 五、总结 一、引言 什么是延迟消息&#xff1f; 发送者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间后收到消息。 什么是延迟任务&#xff1f; 设置在一定时间之后才…

【动手学深度学习】6.3 填充与步幅(个人向笔记)

卷积的输出形状取决于输入形状和卷积核的形状在应用连续的卷积后&#xff0c;我们最终得到的输出大小远小于输入大小&#xff0c;这是由于卷积核的宽度和高度通常大于1导致的比如&#xff0c;一个 240 240 240240 240240像素的图像&#xff0c;经过10层 5 5 55 55的卷积后&am…

Mac 下编译 libaom 源码教程

AV1 AV1是一种开放、免版税的视频编码格式&#xff0c;由开放媒体联盟&#xff08;AOMedia&#xff09;开发&#xff0c;旨在提供高压缩效率和优秀的视频质量。AV1支持多种分辨率&#xff0c;包括SD、HD、4K和8K&#xff0c;并适用于视频点播&#xff08;VOD&#xff09;、直播…

2014年国赛高教杯数学建模B题创意平板折叠桌解题全过程文档及程序

2014年国赛高教杯数学建模 B题 创意平板折叠桌 某公司生产一种可折叠的桌子&#xff0c;桌面呈圆形&#xff0c;桌腿随着铰链的活动可以平摊成一张平板&#xff08;如图1-2所示&#xff09;。桌腿由若干根木条组成&#xff0c;分成两组&#xff0c;每组各用一根钢筋将木条连接…

Redis——持久化

文章目录 Redis持久化Redis的两种持久化的策略定期备份&#xff1a;RDB触发机制rdb的触发时机&#xff1a;手动执行save&bgsave保存测试不手动执行bgsave测试bgsave操作流程测试通过配置&#xff0c;自动生成rdb快照RDB的优缺点 实时备份&#xff1a;AOFAOF是否会影响到red…

基于opencv答题卡识别判卷

我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色&#xff1a;深度实…

【Qt】窗口预览(1)—— 菜单栏

窗口预览&#xff08;1&#xff09; 1. QMainWindow2. QMenuBar——菜单栏2.1 创建菜单栏/将菜单栏添加到widget中2.2 addMenu——在菜单栏中添加菜单2.3 在菜单中添加选项2.4 添加快捷键2.5 支持嵌套添加菜单2.6 添加信号2.7 添加分割线 1. QMainWindow Qt窗口是通过QMainWin…

基于SSM框架学籍管理系统的设计与实现

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 &#x1f393;擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号&#xff1a;乡下小哥编程。回复 Java全套视频教程 或 前端全套视频教…

微信小程序和抖音小程序的分享和广告接入代码

开发完成小程序或者小游戏之后&#xff0c;我们为什么要接入分享和广告视频功能&#xff0c;主要原因有以下几个方面。 微信小程序和抖音小程序接入分享和广告功能主要基于以下几个原因&#xff1a; 用户获取与增长&#xff1a;分享功能可以帮助用户将小程序内容传播给更多人&…

# 在执行 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; 二、报错分析&…