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

news2024/12/12 16:40:13

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)
    {
        //选择通道0
        TCA9548A_WriteByte(0);
        Data = TCA9548A_ReadByte();
        OLED_ShowHexNum(1, 1, Data, 2);
        AHT10_Measure();
        
        //选择通道7
        TCA9548A_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,表示即将读取,0x71
    MyI2C_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,表示即将写入,0x70
    MyI2C_ReceiveAck();
    MyI2C_SendByte(1 << Channel);
    MyI2C_ReceiveAck();
    MyI2C_Stop();
}

//TCA9548A初始化
void TCA9548A_Init(void)
{
    MyI2C_Init(); 
}

现象

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

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

总结

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

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

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

相关文章

鸿蒙调试打包(非正式打包)

文章目录 前言第一步&#xff1a;生成.p12和.csr文件第二步&#xff1a;申请证书的前置步骤第三步&#xff1a;申请证书 前言 HarmonyOS 应用打包后的文件为.app 格式&#xff0c; android 打包后的文件为.apk&#xff0c;IOS 打包后的文件为.apa HarmonyOS通过数字证书&#…

手机租赁系统开发全流程解析与实用指南

内容概要 在如今快速发展的科技时代&#xff0c;手机租赁系统已经成为一种新兴的商业模式&#xff0c;非常符合当下市场需求。那么&#xff0c;在开发这样一个系统的时候&#xff0c;首先要从需求分析和市场调研开始。在这一阶段&#xff0c;你需要了解用户需要什么&#xff0…

C++是如何工作的?

首先来看一个最基本的C程序段。 #include <iostream>int main() {std::cout << "HelloWorld" << std::endl;std::cin.get(); } 第一行 #include 的含义是预处理的意思&#xff0c;这条语句的作用是将一个名为iostream的文件拷贝到源代码中这个…

在 Windows WSL 上部署 Ollama 和大语言模型:从镜像冗余问题看 Docker 最佳实践20241208

&#x1f6e0;️ 在 Windows WSL 上部署 Ollama 和大语言模型&#xff1a;从镜像冗余问题看 Docker 最佳实践 ⭐ 引言 随着大语言模型&#xff08;LLM&#xff09;和人工智能技术的迅猛发展&#xff0c;开发者们越来越多地尝试在本地环境中部署模型进行实验。 但部署过程中常…

2、开发环境优化与创建第一个插件程序

一、创建测试用例二、vscode优化2.1 修改默认终端为普通cmd2.2 配置一键编译&&运行&&监视一、创建测试用例 使用命令yo code生成一个测试用例,选择或输入下面的内容。2. 命令的最后会提示是否使用vscode打开,选择打开就行。 3. 在当前目录下会产生helloworld…

公有云和私有云的区别

目录 ​1、公有云&#xff08;PublicClouds&#xff09; ​2、私有云&#xff08;PrivateClouds&#xff09; ​2.1 私有云又分为两种 3、混合云&#xff08;hybrid cloud&#xff09; ​3.1 公有云和私有云的区别 ​3.2 选择公有云或者是私有云 4 政务云&#xff08;Go…

TortoiseGit的下载、安装和配置

一、TortoiseGit的简介 tortoiseGit是一个开放的git版本控制系统的源客户端&#xff0c;支持Winxp/vista/win7.该软件功能和git一样 不同的是&#xff1a;git是命令行操作模式&#xff0c;tortoiseGit界面化操作模式&#xff0c;不用记git相关命令就可以直接操作&#xff0c;读…

jmeter调整字号无法生效?

调整之前如上图&#xff0c;字体非常小&#xff0c;哪怕我设置的字号是48 查阅了资料&#xff0c;试了几次&#xff0c;解决办法如下&#xff1a; 用编辑器打开jmeter.bat 在echo off的下一行添加以下代码 set JVM_ARGS%JVM_ARGS% -Dswing.plaf.metal.controlFontDialog-20…

【实操GPT-SoVits】声音克隆模型图文版教程

项目github地址&#xff1a;https://github.com/RVC-Boss/GPT-SoVITS.git官方教程&#xff1a;https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/tkemqe8vzhadfpeu本文旨在迅速实操GPT-SoVits项目&#xff0c;不阐述技术原理&#xff08;后期如果有时间研究&#…

【Web】2023安洵杯第六届网络安全挑战赛 WP

目录 Whats my name easy_unserialize signal Swagger docs 赛题链接&#xff1a;GitHub - D0g3-Lab/i-SOON_CTF_2023: 2023 第六届安洵杯 题目环境/源码 Whats my name 第一段正则用于匹配以 include 结尾的字符串&#xff0c;并且在 include 之前&#xff0c;可以有任…

大模型简单实践

大模型简单实践 最近参加了Datawhale AI冬令营&#xff08;第一期&#xff09;的活动 网站链接 手把手教学&#xff0c;借助Chat-嬛嬛 搭上讯飞星辰MaaS平台&#xff0c;快速训练处一个可以自由聊天的对话机器人。

Linux的基本功能和命令

Linux的基本功能和命令 切换目录 pwd 查询当前目录地址 cd /xxx/xxx 转到目录 cd …/ 回到上一级目录 cd ./ 当前目录 创建、删除文件/文件夹 创建文件\文件夹 touch filename 创建空文件mkdir 创建目录 mkdir -p 目标目录存在也不报错mkdir -p xxx/xxx 递归创建目录…

LLC谐振变换器的工作模态分析

概述 LLC谐振变换器在传统串联LC和并联LC谐振变换器的基础之上进行改进&#xff0c;既有LC串联谐振变换器谐振电容所起到的隔直作用和谐振网络电流随负载轻重而变化&#xff0c;轻载时效率较高的优点。同时又有LC并联谐振变化器可以在空载条件下&#xff0c;对滤波电容的电流脉…

Goby AI 2.0 自动化编写 EXP | Mitel MiCollab 企业协作平台 npm-pwg 任意文件读取漏洞(CVE-2024-41713)

漏洞名称&#xff1a;Mitel MiCollab 企业协作平台 npm-pwg 任意文件读取漏洞(CVE-2024-41713) English Name&#xff1a;Mitel MiCollab /npm-pwg File Read Vulnerability (CVE-2024-41713) CVSS core: 6.8 漏洞描述&#xff1a; Mitel MiCollab 是加拿大 Mitel 公司推出…

视频安防监控平台:Liveweb视频监控管理云平台方案

LiveWeb是深圳市好游科技有限公司开发的一套综合视频汇聚管理平台&#xff0c;可提供多协议&#xff08;RTSP/RTMP/GB28181/海康Ehome/大华&#xff0c;海康SDK等&#xff09;的视频设备接入&#xff0c;支持GB/T28181上下级联&#xff0c;RTSP\RTMP转GB/T28181&#xff0c;云台…

ip地址暴露了怎么办?手机怎样改ip地址以保障安全

在数字化时代,IP地址作为我们连接互联网的“身份证”,其安全性至关重要。然而,有时我们的IP地址可能会因各种原因暴露,从而引发隐私泄露、网络攻击等风险。本文将为您详细解析IP地址暴露后的应对措施,特别是针对手机用户,提供实用的更改IP地址方法,帮助您有效保障网络安…

组合分支预测

前言 这篇文章讨论了几种分支预测的实现方式。具体内容如下&#xff1a; 内容 introduction 这篇文章只考虑预测分支跳转方向&#xff0c;不讨论跳转的目标地址。 Bimodal Branch Prediction 分支行为的特点&#xff1a;大多数程序中的分支指令并不是随机的&#xff0c;通…

爬虫基础之代理的基本原理

在做爬虫的过程中经常会遇到一种情况&#xff0c;就是爬虫最初是正常运行、正常抓取数据的&#xff0c;一切看起来都是那么美好&#xff0c;然而一杯茶的工夫就出现了错误&#xff0c;例如 403 Forbidden&#xff0c;这时打开网页一看&#xff0c;可能会看到“您的IP访问频率太…

数据结构——对顶堆

对顶堆 由一个大根堆和一个小根堆组成&#xff0c;小根堆里面的数永远比大根堆里面的数要大 用途&#xff1a;用于动态维护区间内第k大的数&#xff0c;要比线段树和动态平衡树写起来更简单 比如说我们要维护第k大的数&#xff0c;那么我们肯定是将前k大的数放进小根堆&#…

设计模式之原型模式:深入浅出讲解对象克隆

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 原型模式概述 在我们的日常生活中&#xff0c;经常会遇到"复制"这样的场景。比如我们在准备文件时&#xff0c;常常会复印一份原件&a…