IIC协议采集温湿度

目录

1.解释什么是“软件I2C”和“硬件I2C”?

2.编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。

1. 学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:

1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C--读写EEPROM”原理章节)

在I2C总线通信中,"软件I2C"和"硬件I2C"是两种实现方式。

1)软件I2C:
软件I2C是通过控制通用输入输出引脚(GPIO)的状态变化来模拟I2C总线的时钟和数据线。简单来说,软件I2C是通过软件代码来实现I2C通信协议。通过使用这种方式,可以使用任意的GPIO引脚实现I2C通信。

软件I2C的实现需要考虑如下几个方面:

  • 时钟信号(SCL):通过软件控制GPIO引脚使其在指定的时间间隔内切换高电平和低电平信号,以模拟I2C总线上的时钟信号。
  • 数据信号(SDA):通过软件控制GPIO引脚的状态来传输数据,包括开始位、停止位、数据位和应答位。

软件I2C的优点是灵活性更高,可以使用任意的GPIO引脚来实现,适用于低速设备或资源受限的应用。但是,由于软件控制引起的延迟和不稳定性,通信速度较慢。

2)硬件I2C:
硬件I2C是通过专门的硬件模块来处理I2C总线的时钟和数据线。硬件I2C通常集成在微控制器或其他芯片中,以提供更高的精确性和速度。

硬件I2C的实现通常具备以下特点:

  • 时钟信号(SCL):硬件I2C模块(如STM32F103中的I2C1和I2C2)内部通过硬件定时器生成时钟信号,无需CPU干预。
  • 数据信号(SDA):硬件I2C模块提供了寄存器用于接收和发送数据。

硬件I2C的优点是速度更快且稳定,因为通信交由硬件模块负责,而不会受到软件延迟的影响。但是,硬件I2C的灵活性较低,只能使用指定的引脚来实现。

总的来说,软件I2C和硬件I2C都是实现I2C总线通信协议的方式,其选择取决于应用的具体要求和资源限制。在STM32F103中,您可以选择使用硬件I2C(I2C1或I2C2)来连接AHT20温湿度传感器并进行数据采集。

2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。

为了实现每隔2秒钟采集一次AHT20温湿度数据,并通过串口发送到上位机(Win10),您可以按照以下步骤进行:

  1. 首先,阅读AHT20数据手册,根据其通信协议和寄存器配置,编写驱动程序完成I2C总线访问和AHT20温湿度传感器的数据读取。

  2. 在主函数中,初始化串口通信和I2C总线,并设置AHT20的I2C地址、寄存器地址等参数。

  3. 编写循环代码,在其中使用I2C总线访问AHT20温湿度传感器,并读取温度和湿度值。

  4. 将读取的温度和湿度值转换为实际的温度和湿度值,并将其保存到变量中。

  5. 将温度和湿度值格式化为字符串,并通过串口发送到上位机。

以下是一个示例代码,实现了每隔 2 秒采集一次温湿度数据,并通过串口发送到上位机(Windows 10):

#include "stm32f10x.h"
#include "stdio.h"

#define AHT20_ADDRESS  0x38  // AHT20 温湿度传感器的 I2C 地址

void I2C_Init(void);
void USART_Configuration(void);
void USART_SendString(const char* str);
void AHT20_Init(void);
void AHT20_StartMeasurement(void);
void AHT20_ReadMeasurement(uint16_t* data);

int main(void)
{
    I2C_Init();
    USART_Configuration();
    AHT20_Init();
    
    while (1) {
        AHT20_StartMeasurement();
        Delay(2000);
        
        uint16_t temperature, humidity;
        AHT20_ReadMeasurement(&temperature, &humidity);
        
        char buf[64];
        snprintf(buf, sizeof(buf), "Temperature: %d.%02d C, Humidity: %d.%02d %%\r\n",
                 temperature / 100, temperature % 100, humidity / 100, humidity % 100);
        
        USART_SendString(buf);
    }
}

void I2C_Init(void)
{
    // 配置 I2C 端口、时钟等
    // ...
}

void USART_Configuration(void)
{
    // 配置 USART 串口通信
    // ...
}

void USART_SendString(const char* str)
{
    while (*str) {
        while (!(USART1->SR & USART_FLAG_TXE));
        USART_SendData(USART1, *str++);
    }
}

void AHT20_Init(void)
{
    // AHT20 初始化配置
    // ...
}

void AHT20_StartMeasurement(void)
{
    // 启动 AHT20 温湿度测量
    // ...
}

void AHT20_ReadMeasurement(uint16_t* temperature, uint16_t* humidity)
{
    // 读取 AHT20 温湿度测量结果
    // ...
}

上述部分参考自 ---WeTab AL Pro

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值