10.STM32F103C8T6+CUBEMX+AHT20

        记录学习过程,看的是b站keysking的视频

一、配置cubemx

1、打开I2C1,设置模式

2、打开串口2

3、生成文件

二、写代码

1、新建.c .h文件,注意要在对应的文件夹下

2、对照AHT20手册进行写

        把文字对应的注释在后面了,注意HAL_I2C_Master_Transmit函数里的sendbuffer数组前面不用取地址符。

void AHT20_Init()
{
  uint8_t readBuffer;
  HAL_Delay(40);			//上电后要等待40ms
  HAL_I2C_Master_Receive(&hi2c1, AHT20_ADDRESS, &readBuffer, 1, HAL_MAX_DELAY);		//读取温湿度值
  if ((readBuffer & 0x08) == 0x00)		//判断校准使能位Bit[3]是否为 1
  {
    uint8_t sendBuffer[3] = {0xBE, 0x08, 0x00};
    HAL_I2C_Master_Transmit(&hi2c1, AHT20_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY);		//发送数组
  }
}

void AHT20_Read(float *Temperature, float *Humidity)
{
  uint8_t sendBuffer[3] = {0xAC, 0x33, 0x00};
  uint8_t readBuffer[6] = {0};

  HAL_I2C_Master_Transmit(&hi2c1, AHT20_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY);		//直接发送触发测量命令
  HAL_Delay(80);			//等待80ms待测量完成
  HAL_I2C_Master_Receive(&hi2c1, AHT20_ADDRESS, readBuffer, 6, HAL_MAX_DELAY);		//读取

  if ((readBuffer[0] & 0x80) == 0x00)			//判断读取状态字Bit[7]是否为0
  {
    uint32_t data = 0;	
		
    data = ((uint32_t)readBuffer[3] >> 4) + ((uint32_t)readBuffer[2] << 4) + ((uint32_t)readBuffer[1] << 12);		//拼接数据
    *Humidity = data * 100.0f / (1 << 20);			//注意%以及float型

    data = (((uint32_t)readBuffer[3] & 0x0F) << 16) + ((uint32_t)readBuffer[4] << 8) + (uint32_t)readBuffer[5];	
    *Temperature = data * 200.0f / (1 << 20) - 50;
  }
}

       3、main

/* USER CODE BEGIN Includes */
#include "AHT20.h"
#include <stdio.h>
#include <string.h>
/* USER CODE END Includes */
  /* USER CODE BEGIN 2 */
	AHT20_Init();
	float temperature, humidity; 
	char message[50];           
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		AHT20_Read(&temperature, &humidity);
		sprintf(message, "Temperature: %.1f,Humidity: %.1f %%\r\n", temperature, humidity);		
		HAL_UART_Transmit(&huart2, (uint8_t *)message, strlen(message), HAL_MAX_DELAY);
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

        最后,注意串口波特率和设置的要一样,就可以成功啦!
波特律动 串口助手 (keysking.com)icon-default.png?t=O83Ahttps://serial.keysking.com/

下面附有AHT20的全部代码:

AHT20.c


#include "AHT20.h"

/***************手册第八面5.4****************/

#define AHT20_ADDRESS 0x70
uint8_t readBuffer[6] = {0};

void AHT20_Init()
{
  uint8_t readBuffer;
  HAL_Delay(40);			//上电后要等待40ms
  HAL_I2C_Master_Receive(&hi2c1, AHT20_ADDRESS, &readBuffer, 1, HAL_MAX_DELAY);		//读取温湿度值
  if ((readBuffer & 0x08) == 0x00)		//判断校准使能位Bit[3]是否为0
  {
    uint8_t sendBuffer[3] = {0xBE, 0x08, 0x00};
    HAL_I2C_Master_Transmit(&hi2c1, AHT20_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY);		//发送数组
  }
}

void AHT20_Read(float *Temperature, float *Humidity)
{
  uint8_t sendBuffer[3] = {0xAC, 0x33, 0x00};
  uint8_t readBuffer[6] = {0};

  HAL_I2C_Master_Transmit(&hi2c1, AHT20_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY);		//直接发送触发测量命令
  HAL_Delay(80);			//等待80ms待测量完成
  HAL_I2C_Master_Receive(&hi2c1, AHT20_ADDRESS, readBuffer, 6, HAL_MAX_DELAY);		//读取

  if ((readBuffer[0] & 0x80) == 0x00)			//判断读取状态字Bit[7]是否为0
  {
    uint32_t data = 0;	
		
    data = ((uint32_t)readBuffer[3] >> 4) + ((uint32_t)readBuffer[2] << 4) + ((uint32_t)readBuffer[1] << 12);		//拼接数据
    *Humidity = data * 100.0f / (1 << 20);			//注意%以及float型

    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

#ifndef __AHT20_H
#define __AHT20_H

#include "I2C.h"
#include "main.h"

void AHT20_Init();
void AHT20_Read(float *Temperature, float *Humidity);
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值