STM32软件IIC驱动TCA9548A多路测量AHT10

STM32软件IIC驱动TCA9548多路测量AHT10

  • TCA9548A
  • AHT10
  • 代码逻辑
  • 代码展示
  • 现象
  • 总结

TCA9548A

在这里插入图片描述

TCA9548A 有八个可通过 I2C 总线控制的双向转换开关,SCL/SDA 上行对扩展到八个下行对,或者通道,适用于系统中存在I2C目标地址冲突的情况。8路双向转换开关,同一时刻只能选择打开一个通道。
三个地址引脚A0,A1,A2,I2C 总线最多支持八个TCA9548A 器件。最多可以在同一条线下接8个TCA9548A模块,每个TCA9548A模块下可以再接8个I2C设备,这样在一个总线下最高可以挂载64个设备。
在这里插入图片描述

TCA9548A写指令:
开始 → 写命令(0x70)→ 选择对应的通道(eg:选择通道0,则写入0x01) → 结束
在这里插入图片描述

选择哪个通道就对应的哪个通道置1
在这里插入图片描述

TCA9548A读指令:
开始 → 读命令(0x71)→ 接收从机数据 → 结束
在这里插入图片描述

AHT10

在这里插入图片描述

关于AHT10的详细说明可以看一下两篇文章进行了解: STM32驱动AHT10(OLED显示),51驱动AHT10串口输出,这里就不做具体的说明介绍了。
这里说下相关指令的流程和注意事项:
AHT10写指令:
开始 → 写指令(0x70) → 触发测量指令(0xac) → 命令参数(0x33) → 命令参数(0x00) → 结束
在这里插入图片描述

AHT10读指令(温湿度数据都是20bit):
开始 → 读指令(0x71) → 状态寄存器数据读取 → 湿度数据[19:12] → 湿度数据[11:4] → 湿度数据[3:0] + 温度数据[19:16] → 温度数据[15:8] → 温度数据[7:0] → 结束
在这里插入图片描述

还有两个注意事项:
1.上电后,传感器最多需要20毫秒时间(此时 SCL为高电平)以达到空闲状态,即做好准备接收由主机(MCU)发送的命令。
2.传感器在采集时需要时间,主机发出测量指令(0xAC)后,延时75毫秒以上再读取转换后的数据并判断返回的状态位是否正常。若状态比特位[Bit7]为0代表数据可正常读取,为1时传感器为忙状态,主机需要等待数据处理完成。

代码逻辑

在这里插入图片描述

代码展示

STM32F103C8T6软件IIC驱动TCA9548A拓展2路AHT10温湿度测量(OLED显示通道0温湿度测试数据,串口1输出通道7温湿度数据)
main.c :

uint32_t CT_data[2];
volatile int  c1,t1;
uint8_t Data;
void AHT10_Measure(void)
{OLED_ShowString(1, 5, "AHT10_Test");OLED_ShowString(2, 4, "HUM:");OLED_ShowString(3, 4, "TEM:");while(AHT10_Read_Cal_Enable()==0)//等到校准输出使能位为1,才读取。{AHT10_Init();//如果为0再使能一次Delay_ms(50);}AHT10_Read_CTdata(CT_data);  //读取温度和湿度 , 可间隔1.5S读一次c1 = CT_data[0] * 1000 / 1024 / 1024;  //计算得到湿度值(放大了10倍,如果c1=523,表示现在湿度为52.3%)t1 = CT_data[1] * 200 * 10 / 1024 / 1024 - 500;//计算得到温度值(放大了10倍,如果t1=245,表示现在温度为24.5℃)//显示湿度OLED_ShowNum(2, 10, c1 / 10, 2);OLED_ShowString(2, 12, ".");OLED_ShowNum(2, 13, c1 % 10, 1);OLED_ShowString(2, 15, "%");//显示温度OLED_ShowNum(3, 10, t1 / 10, 2);OLED_ShowString(3, 12, ".");OLED_ShowNum(3, 13, t1 %  10, 1);OLED_ShowString(3, 15, "C");  Delay_ms(1500); //延时1.5S 
}
int main(void)
{/*模块初始化*/OLED_Init();		//OLED初始化TCA9548A_Init();     //TCA9548初始化Serial_Init();while(1){//选择通道0TCA9548A_WriteByte(0);Data = TCA9548A_ReadByte();OLED_ShowHexNum(1, 1, Data, 2);AHT10_Measure();//选择通道7TCA9548A_WriteByte(7);Data = TCA9548A_ReadByte();while(AHT10_Read_Cal_Enable()==0)//等到校准输出使能位为1,才读取。{AHT10_Init();//如果为0再使能一次Delay_ms(30);}AHT10_Read_CTdata(CT_data);  //读取温度和湿度 , 可间隔1.5S读一次c1 = CT_data[0]*1000/1024/1024;  //计算得到湿度值(放大了10倍,如果c1=523,表示现在湿度为52.3%)t1 = CT_data[1] *200*10/1024/1024-500;//计算得到温度值(放大了10倍,如果t1=245,表示现在温度为24.5℃)//湿度Serial_Printf("       H:");Serial_SendNumber(c1/10, 2);Serial_Printf(".");Serial_SendNumber(c1%10, 1);Serial_SendString("%");Serial_Printf("        ");//温度Serial_Printf("T:");Serial_SendNumber(t1/10, 2);Serial_Printf(".");Serial_SendNumber(t1%10, 1);Serial_Printf(" C\n");}
}

TCA9548A.c

#include "stm32f10x.h"   
#include "TCA9548A.h"
#include "MyI2C.h"#define TCA9548_ADD  0x70       //TCA9548的I2C从机地址//TCA9548A读一个字节的寄存器
uint8_t TCA9548A_ReadByte(void)
{uint8_t Data;MyI2C_Start();MyI2C_SendByte(TCA9548_ADD << 1 | 0x01);   //发送从机地址,读写位为1,表示即将读取,0x71MyI2C_ReceiveAck();Data = MyI2C_ReceiveByte();MyI2C_SendAck(1);MyI2C_Stop();return Data;
}//TCA9548A写一个字节的寄存器,用来选择通道
void TCA9548A_WriteByte(uint8_t Channel)
{MyI2C_Start();MyI2C_SendByte(TCA9548_ADD << 1 | 0x00);    //发送从机地址,读写位为0,表示即将写入,0x70MyI2C_ReceiveAck();MyI2C_SendByte(1 << Channel);MyI2C_ReceiveAck();MyI2C_Stop();
}//TCA9548A初始化
void TCA9548A_Init(void)
{MyI2C_Init(); 
}

现象

通道7串口输出
在这里插入图片描述

通道0 OLED显示
在这里插入图片描述

总结

AHT10需要留够时间给模块初始化和测量数据,不然读出数据可能会有错误。
需要整个工程代码可以在下方评论留言哦!

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

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

相关文章

信奥赛CSP-J复赛集训(dfs专题)(15):洛谷P8838:[传智杯 #3 决赛] 面试

信奥赛CSP-J复赛集训(dfs专题-刷题题单及题解)(15):洛谷P8838:[传智杯 #3 决赛] 面试 题目背景 disangan233 和 disangan333 去面试了,面试官给了一个问题,热心的你能帮帮他们吗? 题目描述 现在有 n n n 个服务器,服务器

ARM学习(36)静态扫描规则学习以及工具使用

笔者来学习了解一下静态扫描以及其规则&#xff0c;并且亲身是实践一下对arm 架构的代码进行扫描。 1、静态扫描认识 静态扫描&#xff1a;对代码源文件按照一定的规则进行扫描&#xff0c;来发现一些潜在的问题或者风险&#xff0c;因为不涉及代码运行&#xff0c;所以其一般…

Python机器学习笔记(五、决策树集成)

集成&#xff08;ensemble&#xff09;是合并多个机器学习模型来构建更强大模型的方法。这里主要学习两种集成模型&#xff1a;一是随机森林&#xff08;random forest&#xff09;&#xff1b;二是梯度提升决策树&#xff08;gradient boosted decision tree&#xff09;。 1…

为什么数据平台需要敏捷版|直播回顾

11月28日&#xff0c;我们邀请到StartDT合伙人、CTO地雷和StartDT资深战略咨询专家何夕&#xff0c;围绕“为什么数据平台需要敏捷版”这个话题&#xff0c;向大家汇报了DataSimba敏捷版这半年来的最新进展&#xff0c;并带来了详细的产品解读。 敏捷版支持StarRocks、ClickHo…

SpringBoot【九】mybatis-plus之自定义sql零基础教学!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE mybatis-plus的基本使用&#xff0c;前两期基本讲的差不多&#xff0c;够日常使用&#xff0c;但是有的小伙伴可能就会抱怨了&#xff0c;若是遇到业务逻辑比较复杂的sq…

Android后端签到flask迁移到rust的axum的过程-签到性能和便携

本次变更了以下内容: 为了使用之前ip2sta的ip到端点名的python,dic变量,将其存入redis hashset.使用地址/api/ip2dic 手动执行之.并且定义在/station/init,这个每天初始化redis的路径下.在rust axum使用redis 连接池在test中 ip2dic,IP转端点名,转本日此端网址.在前端的人名下…

ThinkPHP知识库文档系统源码

知识库文档系统 一款基于ThinkPHP开发的知识库文档系统&#xff0c;可用于企业工作流程的文档管理&#xff0c;结构化记录沉淀高价值信息&#xff0c;形成完整的知识体系&#xff0c;能够轻松提升知识的流转和传播效率&#xff0c;更好地成就组织和个人。为部门、团队或项目搭…

交换排序(Swap Sort)详解

交换排序Swap Sort详解 冒泡排序冒泡算法代码实现冒泡分析 快速排序快排算法代码实现快排分析 交换类排序主要是通过两两比较待排元素的关键字&#xff0c;若发现与排序要求相逆&#xff0c;则交换之。在这类排序方法中最常见的是起泡排序&#xff08;冒泡排序&#xff09;和快…

091 脉冲波形的变换与产生

00 如何获得脉冲波形 01 单稳态触发器 1.分类 2.工作特点&#xff1a; ① 电路在没有触发信号作用时处于一种稳定状态。 ② 在外来触发信号作用下&#xff0c;电路由稳态翻转到暂稳态; ③ 由于电路中RC延时环节的作用&#xff0c;暂稳态不能长保持, 经过一段时间后&#xff0c…

高级排序算法(二):归并排序与堆排序详解

引言 在上一章中&#xff0c;我们探讨了高效的快速排序及其分治思想。这一次&#xff0c;我们将继续探索两种同样重要的排序算法&#xff1a;归并排序&#xff08;Merge Sort&#xff09; 和 堆排序&#xff08;Heap Sort&#xff09;。 它们与快速排序一样&#xff0c;都是O(…

JVM调优之如何排查CPU长时间100%的问题

对于CPU长时间100%的问题&#xff0c;其实有一个比较标准的排查流程&#xff0c;现在模拟一个垃圾回收导致的cup占用率过高的排查方法。 步骤如下&#xff1a; 1.先通过top命令找到消耗cpu很高的进程id 在服务器上输入top&#xff0c;显示如下&#xff1a; 通过top命令定位到…

中间件--MongoDB部署及初始化js脚本(docker部署,docker-entrypoint-initdb.d,数据迁移,自动化部署)

一、概述 MongoDB是一种常见的Nosql数据库&#xff08;非关系型数据库&#xff09;&#xff0c;以文档&#xff08;Document&#xff09;的形式存储数据。是非关系型数据库中最像关系型数据库的一种。本篇主要介绍下部署和数据迁移。 在 MongoDB 官方镜像部署介绍中&#xff…

SkyWalking Helm Chart 4.7.0 安装、配置

https://skywalking.apache.org/events/release-apache-skywalking-kubernetes-helm-chart-4.7.0/https://github.com/apache/skywalking-helm/tree/v4.7.0https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/简介 skywalking 是分布式系统的 APM(Applicat…

HTA8998 实时音频跟踪的高效内置升压2x10W免电感立体声ABID类音频功放

1、特征 输出功率(fIN1kHz,RL4Ω&#xff0c;BTL) VBAT 4V, 2x10.6W(VOUT9V,THDN10%) VBAT 4V, 2x8.6W (VOUT9V,THDN1%) 内置升压电路模式可选择:自适应实时音频跟踪 升压(可提升播放时间50%以上)、强制升压 最大升压值可选择&#xff0c;升压限流值可设置 ACF防破音功能 D类…

时间敏感网络与工业通信的融合:光路科技电力专用交换机和TSN工业交换机亮相EP电力展

12月7日&#xff0c;第三十一届中国国际电力设备及技术展览会&#xff08;EP Shanghai 2024&#xff09;暨上海国际储能技术应用展览会在上海新国际博览中心圆满落幕。本届展会以“数字能源赋能新质生产力”为主题&#xff0c;系统地呈现了电力设备行业在技术融合、转型升级及上…

前端请求后端接口报错(blockedmixed-content),以及解决办法

报错原因&#xff1a;被浏览器拦截了&#xff0c;因为接口地址不是https的。 什么是混合内容&#xff08;Mixed Content&#xff09; 混合内容是指在同一页面中同时包含安全&#xff08;HTTPS&#xff09;和非安全&#xff08;HTTP&#xff09;资源的情况。当浏览器试图加载非…

【Golang】Go语言编程思想(六):Channel,第四节,Select

使用 Select 如果此时我们有多个 channel&#xff0c;我们想从多个 channel 接收数据&#xff0c;谁来的快先输出谁&#xff0c;此时应该怎么做呢&#xff1f;答案是使用 select&#xff1a; package mainimport "fmt"func main() {var c1, c2 chan int // c1 and …

SpringBoot【八】mybatis-plus条件构造器使用手册!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 经过上一期的mybatis-plus 入门教学&#xff0c;想必大家对它不是非常陌生了吧&#xff0c;这期呢&#xff0c;我主要是围绕以下几点展开&#xff0c;重点给大家介绍 里…

算法-字符串-32.最长有效括号

一、题目 二、思路解析 1.思路&#xff1a; 滑动窗口&#xff01;&#xff01;&#xff01; 2.常用方法&#xff1a; 无 3.核心逻辑&#xff1a; 1.特殊情况&#xff1a;当字符串为空或不存在 if(snull||s.length()0)return 0; 2.一般情况 a.记录最长有效括符res&#xff1b;初…

9. Win11上原生运行Ubuntu

本文介绍如何在win11原生系统上运行ubuntu&#xff0c;不需要额外安装虚拟机&#xff0c;以及如何配置网络等。 1.安装正版Win11 由于正版Win11需要钱&#xff0c;网上能破解的win11可能有问题&#xff0c;但是它们的破解工具&#xff0c;却是能正常用的&#xff0c;所以&…