基於I2C的AHT20溫濕度傳感器的數據采集


關於:IC( Inter-- Integrated Circuit)總線是一種由 PHILIPS公司開發的兩線式串行總線,用於連接微控制器及其外圍設備。它是由數據線SDA和時鍾SCL構成的串行總線,可發送和接收數據。
在CPU與被控I2C之間、I2C與I2C之間進行雙向傳送,高速IC總線一般可達400kbps以上。 I2C總線在傳送數據過程中共有三種類型信號,它們分別是:開始信號、結束信號和應答信號。

開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據。

結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結東傳送數據。

應答信號:接收數據的IC在接收到8bit數據后,向發送數據的IC發出特定的低電平脈沖表示已收到數據。CPU向受控單元發出一個信號后,等待受控單元發出一個應答信號,CPU接
收到應答信號后,根據實際情況作出是否繼續傳遞信號的判斷。若未收到應答信號,由判斷為 受控單元出現故障  ;

關於:AHT20是國內奧松生成的I2C接口的MEMS溫濕度傳感器,ADC位數為20Bit,具有體積小、精度高、成本低等優點。

由於AHT10/15/20 具有國產化、體積小、精度高、成本低等特點,可以替代 DHT11/DHT12/AM2320/SHT20/SHT30,單芯片價格在¥2~3,體積小巧很輕松嵌入到產品上

參數如下:

  AHT20
供電電壓 2.0-5.5V
工作電流(休眠) 0.25uA
工作電流(測量) 23uA
測量范圍(濕度) 0~100%RH
測量范圍(溫度) -40~+85℃
溫度精度 ±2%RH(25℃)
濕度精度 ±0.3℃
分辨率 溫度: 0.01℃ 濕度: 0.024%RH
信號輸出 I²C信號
防護
封裝大小 3x3x1.0mm(DFN)

AHT20是國內奧松生成的I2C接口的MEMS溫濕度傳感器,ADC位數為20Bit,具有體積小、精度高、成本低等優點。

由於AHT10/15/20 具有國產化、體積小、精度高、成本低等特點,可以替代 DHT11/DHT12/AM2320/SHT20/SHT30,單芯片價格在¥2~3,體積小巧很輕松嵌入到產品上

參數如下:

歷程准備:第一步:下載驅動包:http://www.aosong.com/products-61.html

網站最下方:歷程下載;將下載后的歷程解壓;得到.C和.h文件;

第二步:打開正點原子STM32  IIC實驗歷程;在HARDWARE文件下下新建AHT20文件,將解壓的.C和.h文件復制進去;

第三步:在工程中添加解壓的.C和.h文件;

第四步:歷程.c文件的修改:修改AHT20_Clock_Init()函數,歷程中為:

void AHT20_Clock_Init(void) //ÑÓʱº¯Êý
{
RCC_APB2PeriphClockCmd(CC_APB2Periph_GPIOB,ENABLE);
}

改為:

void AHT20_Clock_Init(void) //ÑÓʱº¯Êý
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
}

函數;

void Init_I2C_Sensor_Port(void) //³õʼ»¯I2C½Ó¿Ú,Êä³öΪ¸ßµçƽ
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,& GPIO_InitStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_15);//Êä³ö¸ßµçƽ

GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,& GPIO_InitStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_15);//Êä³ö¸ßµçƽ

}

改為:

void Init_I2C_Sensor_Port(void) //³õʼ»¯I2C½Ó¿Ú,Êä³öΪ¸ßµçƽ
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,& GPIO_InitStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_11);//Êä³ö¸ßµçƽ

// GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,& GPIO_InitStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_10);//Êä³ö¸ßµçƽ
}

。。。。。。。。。。。。。源文件中有錯誤,主要是消錯;

然后,將.C文件中的所有GPIO_Pin_15改為:GPIO_Pin_7,將所有GPIO_Pin_14改為GPIO_Pin_6;與開發板IIC硬件電路對應:

 

 

最后將.c文件中的main()函數注釋掉;

第五步:修改main.c文件為:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usmart.h"
#include "myiic.h"
//#include "24cxx.h"
#include "AHT20-21_DEMO_V1_3.h"
/****my code start lee***/
//struct m_AHT20 AHT20;
int32_t main(void)
{
uint32_t CT_data[2];
volatile int c1,t1;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//
LED_Init(); //???LED
delay_init(); //?????
IIC_Init(); //IIC???
uart_init(115200); //??????115200
AHT20_Init();
// float c2,t2;
/*********************
**************************************************************/
/**剛上電,產品芯片內部需要就緒時間建議延時100-500ms
/***********************************************************************************/
Delay_1ms(500);
/***********************************************************************************/
/**/上電第一次發送0x71讀取狀態字,判斷是否為0x18,如果不是進行寄存器初始化;
/***********************************************************************************/
if((AHT20_Read_Status()&0x18)!=0x18)
{
AHT20_Start_Init(); //初始化寄存器
Delay_1ms(10);
}

/***********************************************************************************/
/**///¢Û¸ù¾Ý¿Í»§×Ô¼ºÐèÇó·¢²âÁ¿ÃüÁî¶ÁÈ¡ÎÂʪ¶ÈÊý¾Ý£¬µ±Ç°while£¨1£©Ñ­»··¢²âÁ¿ÃüÁî¶ÁÈ¡ÎÂʪ¶ÈÊý¾Ý£¬½ö¹©²Î¿¼
/***********************************************************************************/
while(1)
{
//AHT20_Read_CTdata(CT_data); //不經過CRC校驗  推薦每隔1s讀一次

AHT20_Read_CTdata_crc(CT_data); //crc校驗

c1 = CT_data[0]*100*10/1024/1024; //計算得到的濕度值c1,此處放大了10倍
t1 = CT_data[1]*200*10/1024/1024-500;//計算得到的溫度值t1,此處放大了10倍
////數據顯示打印在串口助手
printf("***************************\n");
printf("\r\n\r\n"); //插入換行
printf("AHT20溫濕度傳感器財務室數據;\n");
printf("\r\n\r\n"); //
printf("溫度:%d.%d ℃\n",(t1/10),(t1%10));
printf("\r\n\r\n"); //
printf("濕度:%d.%d  %%\n",(c1/10),(c1%10));
printf("\r\n\r\n"); //
printf("\n");
delay_ms(500);
if(c1>=600||t1>=600)
{
LED0=!LED0;
}
else
LED0=1;
}
}

下載到開發板,顯示結果為:

 

注意:刪除歷程中的關於24CXX相關內容,.C和.h文件等;

 

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM