HT66F2390/STM32——AM2320温湿度传感器

1、说明

AM2320 数字温湿度传感器采用单总线、标准 I²C 两种通信方式。本文主要基于HT66F2390单片机,采用单总线通讯,实现AM2320传感器数据获取。关于AM2320传感器的使用,可参考AM2320产品手册。在文章最后,分享了AM2320的相关资料,里面有我写的STM32的例程,大家可以参考一下。
在这里插入图片描述

2、AM2320单总线通讯

在这里插入图片描述
在这里插入图片描述

3、代码

下面是基于HT66F2390的AM2320传感器开发代码:

AM2320.h

#ifndef __AM2320_H
#define __AM2320_H
#include "HT66F2390.h"
//#include "sys.h"
#include "Type.h"

#define GPIO_AM2320 	_pdc3
#define PIN_AM2320	    _pd3


void AM2320_IO_OUT(void);
void AM2320_IO_IN(void);
void AM2320_DQ_OUT(u8 i);
u8 AM2320_DQ_IN(void);
u8 AM2320_Init(void);
void AM2320_Rst(void);
u8 AM2320_Check(void);
u8 AM2320_Read_Bit(void);
u8 AM2320_Read_Byte(void);
u8 AM2320_Read_Data(float *temperature,float *humidity);

#endif

sys.h文件为系统时钟配置头文件,没用到可以不调用。
Type.h文件主要是结构体类型的重定义,方便后面调用。

Type.h

typedef	unsigned char	u8;
typedef	char			s8;
typedef	unsigned short	u16;
typedef	short			s16;
typedef	unsigned long	u32;
typedef	long			s32;

AM2320.c

#include"AM2320.h"

/* 输出模式 */
void AM2320_IO_OUT(void)  
{
	 GPIO_AM2320=0;
}
/* 输入模式 */
void AM2320_IO_IN(void)   
{
	 GPIO_AM2320=1;
	 _pgpu1=1;  //上拉使能
}

/* AM2320初始化 */
u8 AM2320_Init(void) 
{	 
	GPIO_AM2320=0;   //输入模式
	PIN_AM2320=1;  //输出
	AM2320_Rst();  //发送开始信号
	return AM2320_Check();	//检测AM2320的响应
} 

void AM2320_Rst(void)	   
{                 
    GPIO_AM2320=0; 	//输出模式
    PIN_AM2320=0; 	//拉低
    delay_ms(20);    	//拉低至少800us
    PIN_AM2320=1; 	//拉高 
	GCC_DELAY(120);     	//拉高20~40us
}

u8 AM2320_Check(void) 	   //检查
{   
	u8 retry=0;
	AM2320_IO_IN();      //输入模式 
	while (PIN_AM2320&&retry<100)   //AM2320会拉低80us
	{
		retry++;
		GCC_DELAY(4);
	};	 
	if(retry>=100)	//超时未响应/未收到开始信号,退出检测
	{
		return 1;	
	}
	else 
		retry=0;
	while (!PIN_AM2320&&retry<100) //AM2320拉低后会再次拉高80us
	{
		retry++;
		GCC_DELAY(4);
	};
	if(retry>=100)
	{
		return 1;   //超时,AM2320工作出错,退出检测
	}
	return 0;	//设备正常响应,可以正常工作
}
/* 读1位 */
u8 AM2320_Read_Bit() 		 
{
 	u8 retry=0;
	while(PIN_AM2320&&retry<100)//等待变成低电平,开始数据接收准备
	{
		retry++;
		GCC_DELAY(4);
	}
	retry=0;
	while(!PIN_AM2320&&retry<100)//等待变成高电平,数据开始传输
	{
		retry++;
		GCC_DELAY(4);
	}
	GCC_DELAY(160);         //等待40us
	
	//0信号为26-28us,1信号则为70us,所以说超过40us去读取引脚状态就可以知道传输的值了
	if(PIN_AM2320)
	 {
		return 1;
	 }
	else
	 {
		return 0;
	 }		   
}
/* 读8位 */
u8 AM2320_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=AM2320_Read_Bit();
    }	
    return dat;
}

/* 读温湿度 */
u8 AM2320_Read_Data(float *temperature,float *humidity) 
{        
 	u8 buf[5];   
	u8 i;
	u8 sum;
	*humidity=0;
	*temperature=0;
	AM2320_Rst();
	if(AM2320_Check()==0)	//设备响应正常
	{
		for(i=0;i<5;i++)//读取40位数据
		{
			buf[i]=AM2320_Read_Byte();
		}
		AM2320_IO_OUT(); 	//输出模式
		PIN_AM2320=1; 	//拉高 
		sum = buf[0]+buf[1]+buf[2]+buf[3];
		if(sum == buf[4])   //校验数据接收是否正确
		{
			*humidity=(float)buf[0]*25.6+(float)0.1*buf[1];   //湿度高8位
			*temperature=(float)buf[2]*25.6+(float)0.1*buf[3];   //温度高八位和低八位
		}
	}
	else 
	{
		return 1;	//设备未成功响应,返回1
	}
	return 0;	  //读取数据成功返回0
}

建议直接使用官方的GCC_DELAY()函数,自定义的延时函数会造成延时不准从而无法获取传感器数据。

4、资源分享

链接:https://pan.baidu.com/s/17HEFl1VQY7macNFTNDbYig
提取码:2320
本链接是AM2320的资料包,其中有PDF的传感器说明书,还有STM32、Arduino和51的开发例程。因为某些原因,合泰的开发例程没有放进去。如果本文对你有用,点赞收藏支持一下呗,蟹蟹大家啦。

版权声明:本文为CSDN博主「龙之幻」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44490498/article/details/122355442

1、说明

AM2320 数字温湿度传感器采用单总线、标准 I²C 两种通信方式。本文主要基于HT66F2390单片机,采用单总线通讯,实现AM2320传感器数据获取。关于AM2320传感器的使用,可参考AM2320产品手册。在文章最后,分享了AM2320的相关资料,里面有我写的STM32的例程,大家可以参考一下。
在这里插入图片描述

2、AM2320单总线通讯

在这里插入图片描述
在这里插入图片描述

3、代码

下面是基于HT66F2390的AM2320传感器开发代码:

AM2320.h

#ifndef __AM2320_H
#define __AM2320_H
#include "HT66F2390.h"
//#include "sys.h"
#include "Type.h"

#define GPIO_AM2320 	_pdc3
#define PIN_AM2320	    _pd3


void AM2320_IO_OUT(void);
void AM2320_IO_IN(void);
void AM2320_DQ_OUT(u8 i);
u8 AM2320_DQ_IN(void);
u8 AM2320_Init(void);
void AM2320_Rst(void);
u8 AM2320_Check(void);
u8 AM2320_Read_Bit(void);
u8 AM2320_Read_Byte(void);
u8 AM2320_Read_Data(float *temperature,float *humidity);

#endif

sys.h文件为系统时钟配置头文件,没用到可以不调用。
Type.h文件主要是结构体类型的重定义,方便后面调用。

Type.h

typedef	unsigned char	u8;
typedef	char			s8;
typedef	unsigned short	u16;
typedef	short			s16;
typedef	unsigned long	u32;
typedef	long			s32;

AM2320.c

#include"AM2320.h"

/* 输出模式 */
void AM2320_IO_OUT(void)  
{
	 GPIO_AM2320=0;
}
/* 输入模式 */
void AM2320_IO_IN(void)   
{
	 GPIO_AM2320=1;
	 _pgpu1=1;  //上拉使能
}

/* AM2320初始化 */
u8 AM2320_Init(void) 
{	 
	GPIO_AM2320=0;   //输入模式
	PIN_AM2320=1;  //输出
	AM2320_Rst();  //发送开始信号
	return AM2320_Check();	//检测AM2320的响应
} 

void AM2320_Rst(void)	   
{                 
    GPIO_AM2320=0; 	//输出模式
    PIN_AM2320=0; 	//拉低
    delay_ms(20);    	//拉低至少800us
    PIN_AM2320=1; 	//拉高 
	GCC_DELAY(120);     	//拉高20~40us
}

u8 AM2320_Check(void) 	   //检查
{   
	u8 retry=0;
	AM2320_IO_IN();      //输入模式 
	while (PIN_AM2320&&retry<100)   //AM2320会拉低80us
	{
		retry++;
		GCC_DELAY(4);
	};	 
	if(retry>=100)	//超时未响应/未收到开始信号,退出检测
	{
		return 1;	
	}
	else 
		retry=0;
	while (!PIN_AM2320&&retry<100) //AM2320拉低后会再次拉高80us
	{
		retry++;
		GCC_DELAY(4);
	};
	if(retry>=100)
	{
		return 1;   //超时,AM2320工作出错,退出检测
	}
	return 0;	//设备正常响应,可以正常工作
}
/* 读1位 */
u8 AM2320_Read_Bit() 		 
{
 	u8 retry=0;
	while(PIN_AM2320&&retry<100)//等待变成低电平,开始数据接收准备
	{
		retry++;
		GCC_DELAY(4);
	}
	retry=0;
	while(!PIN_AM2320&&retry<100)//等待变成高电平,数据开始传输
	{
		retry++;
		GCC_DELAY(4);
	}
	GCC_DELAY(160);         //等待40us
	
	//0信号为26-28us,1信号则为70us,所以说超过40us去读取引脚状态就可以知道传输的值了
	if(PIN_AM2320)
	 {
		return 1;
	 }
	else
	 {
		return 0;
	 }		   
}
/* 读8位 */
u8 AM2320_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=AM2320_Read_Bit();
    }	
    return dat;
}

/* 读温湿度 */
u8 AM2320_Read_Data(float *temperature,float *humidity) 
{        
 	u8 buf[5];   
	u8 i;
	u8 sum;
	*humidity=0;
	*temperature=0;
	AM2320_Rst();
	if(AM2320_Check()==0)	//设备响应正常
	{
		for(i=0;i<5;i++)//读取40位数据
		{
			buf[i]=AM2320_Read_Byte();
		}
		AM2320_IO_OUT(); 	//输出模式
		PIN_AM2320=1; 	//拉高 
		sum = buf[0]+buf[1]+buf[2]+buf[3];
		if(sum == buf[4])   //校验数据接收是否正确
		{
			*humidity=(float)buf[0]*25.6+(float)0.1*buf[1];   //湿度高8位
			*temperature=(float)buf[2]*25.6+(float)0.1*buf[3];   //温度高八位和低八位
		}
	}
	else 
	{
		return 1;	//设备未成功响应,返回1
	}
	return 0;	  //读取数据成功返回0
}

建议直接使用官方的GCC_DELAY()函数,自定义的延时函数会造成延时不准从而无法获取传感器数据。

4、资源分享

链接:https://pan.baidu.com/s/17HEFl1VQY7macNFTNDbYig
提取码:2320
本链接是AM2320的资料包,其中有PDF的传感器说明书,还有STM32、Arduino和51的开发例程。因为某些原因,合泰的开发例程没有放进去。如果本文对你有用,点赞收藏支持一下呗,蟹蟹大家啦。

版权声明:本文为CSDN博主「龙之幻」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44490498/article/details/122355442

生成海报
点赞 0

龙之幻

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

HT66F2390/STM32——AM2320温湿度传感器

1、说明 AM2320 数字温湿度传感器采用单总线、标准 I²C 两种通信方式。本文主要基于HT66F2390单片机,采用单总线通讯,实现AM2320传感器数据获取。关于AM2320传感器的使用,可参