菜鳥入門9,在I2C通訊協議的基礎上完成的溫溼度採集

小馬不識途菜鳥號發表於2020-12-21


前言

這次本菜鳥要帶領大家一起學習一個晶片和一個模組,AHT20溫溼度感測器晶片和stm32指南者的I2C通訊模組,那就話不多說,現在開始吧


提示:以下是本篇文章正文內容,下面案例可供參考

一、介紹

AHT20介紹

首先讓我們看看ATH20長什麼樣
在這裡插入圖片描述
在這裡插入圖片描述

2020年上市,奧鬆生產;
3mmx3mmx1mm 超小體積;
經過標定的數字訊號,標準I2C輸出格式;
由一個電容式溼度感測元件和一個標準的片上溫度感測元件組成;
採用SMD封裝適於迴流焊;
響應迅速、抗干擾能力強;
AHT20 的供電範圍為 2.0-5.5V, 推薦電壓為3.3V。

應用場景
它廣泛應用於暖通空調 、除溼器、測試及檢測裝置、消費品、汽車 、自動控制、資料記錄器、氣象站、家電、溼度調節、醫療及其他相關溼度檢測控制等領域。

I2C協議簡介

I2C通訊協議(Inter-Integrated Circuit)是由Phiilps公司開發的一種簡單、雙向二線制同步序列匯流排。它只需要兩根線即可在連線於匯流排上的器件之間傳送資訊。由於它引腳少,硬體實現簡單,可擴充套件性強,不需要 USART、CAN 等通訊協議的外部收發裝置,現在被廣泛地使用在系統內多個積體電路(IC)間的通訊。

軟體I2C和硬體I2C的區別

硬體I2C對應晶片上的I2C外設,有相應I2C驅動電路,其所使用的I2C管腳也是專用的,因而效率要遠高於軟體模擬的I2C;一般也較為穩定,但是程式較為繁瑣。硬體(韌體)I2C是直接呼叫內部暫存器進行配置;而軟體I2C是沒有暫存器這個概念的。

軟體I2C一般是使用GPIO管腳,用軟體控制SCL,SDA線輸出高低電平,模擬i2c協議的時序。

主要對比:
1.硬體IIC用法比較複雜,模擬IIC的流程更清楚一些。
2.硬體IIC速度比模擬快,並且可以用DMA
3.模擬IIC可以在任何管腳上,而硬體只能在固定管腳上。

二、溫溼度採集

要求
每隔2秒鐘採集一次溫溼度資料
通過串列埠傳送到上位機(windows10)

程式碼部分

本來可以用之前的串列埠工程的模板,但是不知道為啥搞了好幾天都沒有成功,本菜鳥就換了一條路子
首先從奧鬆電子官網下載程式碼
再仔細閱讀AHT20的中午說明,根據上面給的資料修改程式碼

修改後的程式碼如下
main.c

#include "delay.h"
#include "temhum.h"
#include "sys.h"
#include "usart.h"

 int main(void)
 {	 	
    u32 CT_data[2]={0};
    volatile float  hum=0,tem=0;     
     
    delay_init();	    	 //延時函式初始化	  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設定NVIC中斷分組2:2位搶佔優先順序,2位響應優先順序
    uart_init(115200);	 //串列埠初始化為115200
    temphum_init();     //ATH20初始化    
	
	while(1)
	{
        AHT20_Read_CTdata(CT_data);       //不經過CRC校驗,直接讀取AHT20的溫度和溼度資料 

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

        printf("此刻溼度:%.1f%%\r\n",(hum/10));
        printf("此刻溫度:%.1f度\r\n",(tem/10));
        printf("\r\n");
        
	 }

myiic.c

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

void IIC_Init(void)
{					     
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );	
	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); 	
}

void IIC_Start(void)
{
	SDA_OUT();    
	IIC_SDA=1;	  	  
	IIC_SCL=1;
	delay_us(4);
 	IIC_SDA=0;
	delay_us(4);
	IIC_SCL=0;
}	  
//²úÉúIICÍ£Ö¹ÐźÅ
void IIC_Stop(void)
{
	SDA_OUT();
	IIC_SCL=0;
	IIC_SDA=0;
 	delay_us(4);
	IIC_SCL=1; 
	IIC_SDA=1;
	delay_us(4);							   	
}

u8 IIC_Wait_Ack(void)
{
	u8 ucErrTime=0;
	SDA_IN();     
	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; 
	return 1; 
}    


void IIC_Ack(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=0;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}
//²»²úÉúACKÓ¦´ð		    
void IIC_NAck(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=1;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}					 				     
  
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
	SDA_OUT(); 	    
    IIC_SCL=0;
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1; 	  
		delay_us(2);  
		IIC_SCL=1;
		delay_us(2); 
		IIC_SCL=0;	
		delay_us(2);
    }	 
} 	    

u8 IIC_Read_Byte(unsigned char ack)
{
	unsigned char i,receive=0;
	SDA_IN();
    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();
        
    else
        IIC_Ack(); 
        
    return receive;
}

編譯過程不再贅述,生成hex檔案後
連線焊接好的aht20和指南者,接法如下
在這裡插入圖片描述

在這裡插入圖片描述
連線指南者與上位機
將生成的hex檔案用mcuisp燒錄進板子中,開啟串列埠除錯程式
顯示如下:
在這裡插入圖片描述
此時再用手捂住晶片,重新觀察
在這裡插入圖片描述
溫度溼度都發生變化

總結

以上就是今天學習的I2C通訊模組和AHT20溫溼度感測器晶片的全部內容,這次的學習使我對於I2C通訊協議的原理有了更加深入的理解。

相關文章