加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

STM32傳感器外設(shè)集-溫濕度模塊(AH120)驅(qū)動(dòng)代碼編寫

06/11 09:59
2067
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
    • 一、前言
    • 二、資料獲取
    • 三、代碼部分
    • 四、參考
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

一、前言

AH120是一種溫濕度模塊,它是由傳感器和信號處理電路組成的,用于測量周圍環(huán)境的溫度和濕度。 AH120模塊具有以下特點(diǎn)和優(yōu)勢:

1. 高精度測量:AH120采用高精度的溫濕度傳感器,能夠提供準(zhǔn)確的溫濕度測量結(jié)果。溫度測量精度一般可以達(dá)到±0.5℃,濕度測量精度一般可以達(dá)到±3%RH。

2. 寬工作范圍:AH120模塊的溫度測量范圍一般為-40℃至+125℃,濕度測量范圍一般為0%RH至100%RH,可以滿足多種應(yīng)用場景的需求。

3. 數(shù)字輸出:AH120模塊通常采用數(shù)字接口輸出,如I2CSPI接口,方便和微控制器或其他數(shù)字設(shè)備進(jìn)行連接和通信

4. 低功耗:AH120模塊通常具有低功耗特性,適合在電池供電的設(shè)備中使用,可以有效延長設(shè)備的工作時(shí)間。

5. 小型化設(shè)計(jì):AH120模塊通常采用緊湊的封裝,體積小、重量輕,便于集成到各種設(shè)備和系統(tǒng)中。

AH120溫濕度模塊常見于室內(nèi)溫濕度監(jiān)測、氣象儀器、智能家居設(shè)備、空調(diào)系統(tǒng)、溫室監(jiān)測等領(lǐng)域,為用戶提供準(zhǔn)確的溫濕度數(shù)據(jù),以便進(jìn)行數(shù)據(jù)分析、環(huán)境控制和決策制定等。

原理圖

在這里插入圖片描述

1.優(yōu)點(diǎn)

  • 高精度,完全校準(zhǔn)
  • 極高的可靠性與卓越的長期穩(wěn)定性(較上一代aht10有極大的提升)
  • 抗干擾能力強(qiáng)
  • 性價(jià)比極高
  • 適用于惡劣的環(huán)境條件下

AH120相比與DHT11,采用的IIC數(shù)據(jù)采集協(xié)議,精度實(shí)現(xiàn)更高,耐用性與穩(wěn)定性更好

二、資料獲取

關(guān)注微信公眾號--星之援工作室 發(fā)送關(guān)鍵字(AHT20

????

三、代碼部分

?main.c

 int main(void)
 {	 	
    u32 CT_data[2]={0};
    volatile float  hum=0,tem=0;     
     
    delay_init();	    	 //延時(shí)函數(shù)初始化	  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
    uart_init(115200);	 //串口初始化為115200
    LED_Init();			     //LED端口初始化
    temphum_init();     //ATH20初始化    
	
	while(1)
	{
        AHT20_Read_CTdata(CT_data);       //不經(jīng)過CRC校驗(yàn),直接讀取AHT20的溫度和濕度數(shù)據(jù) 

        hum = CT_data[0]*100*10/1024/1024;  //計(jì)算得到濕度值(放大了10倍)
        tem = CT_data[1]*200*10/1024/1024-500;//計(jì)算得到溫度值(放大了10倍)

        printf("濕度:%.1f%%rn",(hum/10));
        printf("溫度:%.1f度rn",(tem/10));
        printf("rn");
        
        //延時(shí)2s,LED閃爍提示串口發(fā)送狀態(tài)
        LED=0;
        delay_ms(1000);
        LED=1;
        delay_ms(1000);
	 }

}

myiic.h

#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h"

//IO方向設(shè)置
 
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

//IO操作函數(shù)	 
#define IIC_SCL    PBout(6) //SCL
#define IIC_SDA    PBout(7) //SDA	 
#define READ_SDA   PBin(7)  //輸入SDA 

//IIC所有操作函數(shù)
void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//發(fā)送IIC開始信號
void IIC_Stop(void);	  			//發(fā)送IIC停止信號
void IIC_Send_Byte(u8 txd);			//IIC發(fā)送一個(gè)字節(jié)
u8 IIC_Read_Byte(unsigned char ack);//IIC讀取一個(gè)字節(jié)
u8 IIC_Wait_Ack(void); 				//IIC等待ACK信號
void IIC_Ack(void);					//IIC發(fā)送ACK信號
void IIC_NAck(void);				//IIC不發(fā)送ACK信號

void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);	  
#endif

myiic.c

#include "myiic.h"
#include "delay.h"
 
//初始化IIC
void IIC_Init(void)
{					     
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );	//使能GPIOB時(shí)鐘
	   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); 	//PB6,PB7 輸出高
}
//產(chǎn)生IIC起始信號
void IIC_Start(void)
{
	SDA_OUT();     //sda線輸出
	IIC_SDA=1;	  	  
	IIC_SCL=1;
	delay_us(4);
 	IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	IIC_SCL=0;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) 
}	  
//產(chǎn)生IIC停止信號
void IIC_Stop(void)
{
	SDA_OUT();//sda線輸出
	IIC_SCL=0;
	IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
 	delay_us(4);
	IIC_SCL=1; 
	IIC_SDA=1;//發(fā)送I2C總線結(jié)束信號
	delay_us(4);							   	
}
等待應(yīng)答信號到來
返回值:1,接收應(yīng)答成功
        0,接收應(yīng)答失敗
u8 IIC_Wait_Ack(void)
{
	u8 ucErrTime=0;
	SDA_IN();      //SDA設(shè)置為輸入  
	IIC_SDA=1;delay_us(1);	   
	IIC_SCL=1;delay_us(1);	 
	while(READ_SDA)
	{
		ucErrTime++;
		if(ucErrTime>250)
		{
			IIC_Stop();
			return 0;
		}
	}
	IIC_SCL=0;//時(shí)鐘輸出0 	   
	return 1; 
}    

//產(chǎn)生ACK應(yīng)答
void IIC_Ack(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=0;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}
//不產(chǎn)生ACK應(yīng)答		    
void IIC_NAck(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=1;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}					 				     
//IIC發(fā)送一個(gè)字節(jié)
//返回從機(jī)有無應(yīng)答
//1,有應(yīng)答
//0,無應(yīng)答			  
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
	SDA_OUT(); 	    
    IIC_SCL=0;//拉低時(shí)鐘開始數(shù)據(jù)傳輸
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1; 	  
		delay_us(2);   //對TEA5767這三個(gè)延時(shí)都是必須的
		IIC_SCL=1;
		delay_us(2); 
		IIC_SCL=0;	
		delay_us(2);
    }	 
} 	    
//讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
	unsigned char i,receive=0;
	SDA_IN();//SDA設(shè)置為輸入
    for(i=0;i<8;i++ )
	{
        IIC_SCL=0; 
        delay_us(2);
		IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
		delay_us(1); 
    }					 
    if (!ack)
        IIC_NAck();//發(fā)送nACK,表示停止接收
    else
        IIC_Ack(); //發(fā)送ACK,表示繼續(xù)接收   
    return receive;
}


temhum.h

#ifndef __TEMHUM_H
#define __TEMHUM_H

/*******************
*
*  @file    temhum.h 
*  @author  LYJ
*  @version V1.0
*  @attention
*       用于AHT20溫濕度傳感器通信的相關(guān)函數(shù)
*
********************/

#include "myiic.h"
#include "delay.h"

void temphum_init(void);
u8 AHT20_Read_Status(void);
void AHT20_SendAC(void);
void AHT20_Init(void);
void AHT20_Read_CTdata(u32 *ct);


#endif

temhum.c

#include "temhum.h"

//讀取AHT20的狀態(tài)寄存器
u8 AHT20_Read_Status(void)
{
	u8 Byte_first,flag;	
	IIC_Start();
    IIC_Send_Byte(0x71);
	flag=IIC_Wait_Ack();
	Byte_first = IIC_Read_Byte(flag);
	IIC_NAck();
	IIC_Stop();

	return Byte_first;
}

//向AHT20發(fā)送AC命令
void AHT20_SendAC(void) 
{
	IIC_Start();
	IIC_Send_Byte(0x70);    //啟動(dòng)傳輸后發(fā)送的01110000 (最后1bit表示讀/寫 0--寫,1--讀)
	IIC_Wait_Ack();
	IIC_Send_Byte(0xac);//0xAC采集命令 命令參數(shù)有兩個(gè)字節(jié),第一個(gè)字節(jié)為 0x33,第二個(gè)字節(jié)為0x00。
	IIC_Wait_Ack();
	IIC_Send_Byte(0x33);
	IIC_Wait_Ack();
	IIC_Send_Byte(0x00);
	IIC_Wait_Ack();
	IIC_Stop();

}

//初始化AHT20
void AHT20_Init(void)   
{	
	IIC_Init();
	IIC_Start();
	IIC_Send_Byte(0x70);
	IIC_Wait_Ack();
	IIC_Send_Byte(0xa8);//0xA8進(jìn)入NOR工作模式
	IIC_Wait_Ack();
	IIC_Send_Byte(0x00);
	IIC_Wait_Ack();
	IIC_Send_Byte(0x00);
	IIC_Wait_Ack();
	IIC_Stop();

	delay_ms(10);//延時(shí)10ms左右

	IIC_Start();
	IIC_Send_Byte(0x70);
	IIC_Wait_Ack();
	IIC_Send_Byte(0xbe);//0xBE初始化命令,AHT20的初始化命令是0xBE,   AHT10的初始化命令是0xE1
	IIC_Wait_Ack();
	IIC_Send_Byte(0x08);//相關(guān)寄存器bit[3]置1,為校準(zhǔn)輸出
	IIC_Wait_Ack();
	IIC_Send_Byte(0x00);
	IIC_Wait_Ack();
	IIC_Stop();
	delay_ms(10);//延時(shí)10ms左右
}

void temphum_init()
{
	delay_ms(40);//剛上電,延時(shí)40ms才可以讀取狀態(tài)
	
    //首先發(fā)0x71讀取狀態(tài)字bit[3],如果=1,為校準(zhǔn)輸出,無須初始化!!!正常情況下讀回來的狀態(tài)是0x1C或者是0x18,讀回來是0x80表示忙狀態(tài);
	if(!((AHT20_Read_Status()&0x08)==0x08))
	{
        AHT20_Init(); //初始化AHT20 
	}
}

//沒有CRC校驗(yàn),直接讀取AHT20的溫度和濕度數(shù)據(jù)    
void AHT20_Read_CTdata(u32 *ct) 
{
	volatile u8 Byte_1th=0,Byte_2th=0,Byte_3th=0;
    volatile u8 Byte_4th=0,Byte_5th=0,Byte_6th=0;
	u32 RetuData = 0;
	u16 cnt = 0,flag;
	AHT20_SendAC();//向AHT20發(fā)送AC命令
	delay_ms(80);	//大約延時(shí)80ms
    
	while(((AHT20_Read_Status()&0x80)==0x80))//直到狀態(tài)bit[7]為0,表示為空閑狀態(tài),若為1,表示忙狀態(tài)
	{
		delay_ms(1);
		if(cnt++>=100) break;
	}
    
	IIC_Start();
	IIC_Send_Byte(0x71);
	flag=IIC_Wait_Ack();
	Byte_1th = IIC_Read_Byte(flag);//狀態(tài)字
	Byte_2th = IIC_Read_Byte(flag);//濕度,發(fā)送ACK(繼續(xù)發(fā)送)
	Byte_3th = IIC_Read_Byte(flag);//濕度
	Byte_4th = IIC_Read_Byte(flag);//濕度/溫度
	Byte_5th = IIC_Read_Byte(flag);//溫度
	Byte_6th = IIC_Read_Byte(!flag);//溫度,發(fā)送NACK(停止發(fā)送)  
	IIC_Stop();
    
    //保存得到的數(shù)據(jù)到RetuData中
	RetuData = (RetuData|Byte_2th)<<8;  
	RetuData = (RetuData|Byte_3th)<<8;
	RetuData = (RetuData|Byte_4th);
	RetuData =RetuData >>4;
	ct[0] = RetuData;//濕度
    
	RetuData = 0;
	RetuData = (RetuData|Byte_4th)<<8;
	RetuData = (RetuData|Byte_5th)<<8;
	RetuData = (RetuData|Byte_6th);
	RetuData = RetuData&0x0fffff;
	ct[1] =RetuData; //溫度
}

四、參考

Arduino uno R3結(jié)合溫濕度模塊AHT10的參考代碼icon-default.png?t=N7T8https://blog.csdn.net/qq_45512059/article/details/106281476?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170218292516800182154274%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=170218292516800182154274&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-4-106281476-null-null.142^v96^pc_search_result_base7&utm_term=%E6%B8%A9%E6%B9%BF%E5%BA%A6%E6%A8%A1%E5%9D%97AH120&spm=1018.2226.3001.4187

聯(lián)系方式 微信號:13648103287

  • 聯(lián)系方式.docx

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險(xiǎn)等級 參考價(jià)格 更多信息
AD590MF 1 General Electric Solid State Sensor/Transducer, 2 Pin, Ceramic
$91.96 查看
LM20BIM7/NOPB 1 Texas Instruments ±1.5&deg;C Analog Output Temperature Sensor 5-SC70 -55 to 130

ECAD模型

下載ECAD模型
$1.5 查看
AD7814ARTZ-REEL7 1 Analog Devices Inc Temperature Sensor: 10-Bit Digital in 6-Lead SOT-23

ECAD模型

下載ECAD模型
$2.83 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

方案定制,程序設(shè)計(jì)方案、單片機(jī)程序設(shè)計(jì)與講解、APP定制開發(fā)。本公眾號致力于向讀者傳遞關(guān)于程序設(shè)計(jì)和開發(fā)的相關(guān)知識,并分享一些關(guān)于軟件開發(fā)的最佳實(shí)踐。如果您有什么問題或建議,請隨時(shí)聯(lián)系我們。我們將竭誠為您服務(wù)