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;所以其一般…

LabVIEW实现HTTP通信

目录 1、HTTP通信原理 2、硬件环境部署 3、云端环境部署 4、HTTP通信函数 5、程序架构 6、前面板设计 7、程序框图设计 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和…

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

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

虚幻引擎C++按键绑定

在项目的 Project Settings -> Engine -> Input 中进行配置。 配置输入映射的步骤&#xff1a; 打开 Project Settings: 在 Unreal Editor 中&#xff0c;点击菜单栏的 Edit -> Project Settings。 导航到 Input: 在 Project Settings 窗口的左侧导航栏中&#xff0…

态感知与势感知

“态感知”和“势感知”是两个人机交互中较为深奥的概念&#xff0c;它们虽然都与感知、认知相关&#xff0c;但侧重点不同。下面将从这两个概念的定义、区分以及应用领域进行解释&#xff1a; 1. 态感知 态感知通常指的是对事物当前状态、属性或者内在特征的感知。它强调的是在…

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

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

FUXA:基于Web的工艺可视化(SCADAHMI仪表板)软件安装与使用指南

FUXA&#xff1a;基于Web的工艺可视化&#xff08;SCADA/HMI/仪表板&#xff09;软件安装与使用指南 项目地址:https://gitcode.com/gh_mirrors/fu/FUXA 1. 项目介绍 FUXA是一款完全基于Web的跨平台全栈式软件&#xff0c;专为过程可视化设计&#xff0c;涵盖SCADA/HMI/仪表板…

scala的隐式转换2

隐士类:implicit class 隐式转换函数 类 第一步:定义一个有updateUser功能的类 PowerUser 第二步: 定义一个隐式转换函数&#xff0c;把BaseUser ---> PowerUser 代码如下: package test1 //隐士类:implicit class 隐式转换函数 类 object y1 {class BaseUser(){def…

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…

全新的命令行自动化测试框架/运用于云原生/中间件/云计算/混沌测试等场景

CmdLinker CmdLinker将为您提供简单、可操作的命令对象的调用方式&#xff0c;通过链式调用去使用各种命令&#xff0c;获取请求/响应&#xff0c;不在局限于将简单的命令字符串交给各种ssh工具包&#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…

【mysql】数据库存量数据双主实现

数据库存量数据双主实现 概述 在现代数据库管理中&#xff0c;主从复制是一种常见的数据同步技术&#xff0c;用于实现数据的高可用性和灾难恢复。本文将详细介绍如何配置MySQL的双主(仅对一个库进行写入&#xff09;&#xff0c;并展示一个实际的迁移过程。 步骤1&#xff…

enable_shared_from_this

用途 struct S {shared_ptr<S> dangerous(){return shared_ptr<S>(this); // dont do this!} };int main() {shared_ptr<S> sp1(new S);shared_ptr<S> sp2 sp1->dangerous();return 0; }考虑以上代码&#xff0c;从一个被shared_ptr管理的struc…