记录学习过程,看的是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)https://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