[stm32] DHT20とI2Cインターフェースによる温湿度取得

1. I2C

I2Cについて学ぶ

  通信用の I2C プロトコルを理解して学習するには、このプロトコルをより明確に理解する必要があります。また、コードを読み取る方法を理解するには、DHT20 チップからデータを読み取るプロセスを明確に理解する必要があります。この実験では、I2C を明確に理解できるだけでなく、C8T6 についてもより多くのことを学ぶことができます。I2C (Inter-Integrated Circuit)はI²Cとも呼ばれます. I2C バスは、フィリップスが開発した単純な双方向 2 線式同期シリアル バスです。バスに接続されたデバイス間で情報を転送するには、2 本のワイヤしか必要としません。マザーボード、組み込みシステム、または携帯電話と周辺コンポーネント間の通信を容易にします。そのシンプルさから、マイクロコントローラーとセンサーアレイ、ディスプレイ、IoT デバイス、EEPROM などの間の通信に広く使用されています。

I2C プロトコルは次の 5 つの速度モードで動作し、異なるデバイスは異なる速度をサポートする場合があります。

標準モード (Standard): 100kbps
高速モード (Fast): 400kbps高速モード+
(Fast-Plus): 1Mbps
高速モード (High-speed): 3.4Mbps
超高速モード (Ultra-Fast): 5Mbps (1-高速
モードは、通常、応答する必要のない LED、LCD、およびその他のデバイスに使用される一方向のデータ転送です. 通常の I2C 操作シーケンスに似ていますが、データを書き込むだけで、 ACK 応答信号。

4 種類の信号
I2C プロトコルの最も基本的な信号: 起始、停止、应答和非应答信号.

開始信号
I2C プロトコルは、SCL处于高电平时,SDA由高到低变化,这种信号是起始信号.

停止信号
I2C プロトコルは、SCL处于高电平,SDA由低到高变化,这种信号是 停止信号 .

つまり、SCL がハイレベルのときのみ SDA のデータ転送が有効になり、SDA
信号線はデータ転送に使用され、SCL 信号線はデータ同期を確保するために使用されます。
ここに画像の説明を挿入

I2C通信機器の一般的な接続方法(山火事資料の写真引用)
ここに画像の説明を挿入

I2C の 2 つの方法 - ハードウェア I2C とソフトウェア I2C

①ハードウェア I2C
  の理解 通信用の I2C プロトコルを学んだ後、このプロトコルをより明確に理解する必要があります。また、コードを読み取る方法を理解するには、DHT20 チップからデータを読み取るプロセスを明確に理解する必要があります。この実験では、I2C を明確に理解できるだけでなく、C8T6 についてもより多くのことを学ぶことができます。STM32 チップのハードウェア I2C ペリフェラルを直接使用。

硬件I2C通信に I2C プロトコルを使用することを理解するには
  、このプロトコルをより明確に理解する必要があります。また、コードを読み取る方法を理解するには、DHT20 チップからデータを読み取るプロセスを明確に理解する必要があります。この実験では、I2C を明確に理解できるだけでなく、C8T6 についてもより多くのことを学ぶことができます。対応するレジスタが設定されている限り、ペリフェラルは標準シリアル ポート プロトコルのタイミングを生成します。I2C ペリフェラルを初期化した後、特定のレジスタ ビットを 1 に設定するだけで、ペリフェラルは対応する SCL および SDA ラインを制御して、I2C 開始信号を自動的に生成します。コアが I2C 開始信号のレベルを直接制御する必要はありません。ピン。

②ソフトウェア I2C は、
  通信のための I2C プロトコルを理解し、学習します。このプロトコルをより明確に理解する必要があります。また、コードを読み取る方法を理解するには、DHT20 チップからデータを読み取るプロセスを明確に理解する必要があります。この実験では、I2C を明確に理解できるだけでなく、C8T6 についてもより多くのことを学ぶことができます。CPU コアを直接使用して、I2C プロトコルの要件に従って GPIO 出力の高レベルと低レベルを制御し、I2C をシミュレートします。

软件I2C通信に I2C プロトコルを使用することを理解するには
  、このプロトコルをより明確に理解する必要があります。また、コードを読み取る方法を理解するには、DHT20 チップからデータを読み取るプロセスを明確に理解する必要があります。この実験では、I2C を明確に理解できるだけでなく、C8T6 についてもより多くのことを学ぶことができます。I2C のスタート信号を制御する場合は、GPIO 端子を SCL ラインとして制御してハイレベルを出力し、SDA ラインとして GPIO 端子を制御してこの間にハイレベルからローレベルへの切り替えを完了させ、最後に標準の I2C スタート信号が出力されるように、SCL ラインを制御してロー レベルに切り替えます。

③ 両者の違いを理解する
  通信のための I2C プロトコルを学んだ後、このプロトコルをより明確に理解する必要があります。また、コードを読み取る方法を理解するには、DHT20 チップからデータを読み取るプロセスを明確に理解する必要があります。この実験では、I2C を明確に理解できるだけでなく、C8T6 についてもより多くのことを学ぶことができます。ハードウェア I2C は周辺機器を直接使用してピンを制御するため、CPU の負担を軽減できます。ただし、ハードウェア I2C を使用する場合、いくつかの固定ピンを SCL および SDA として使用する必要がありますが、ソフトウェア アナログ I2C は比較的柔軟な任意の GPIO ピンを使用できます。ハードウェア I2C の使用法はより複雑で、ソフトウェア I2C のプロセスはより明確です。I2C プロトコルを詳細に理解したい場合は、ソフトウェア I2C を使用すると、プロセスをよりよく理解できる場合があります。I2C を使用する過程で、ハードウェア I2C はより高速で安定した通信を行う場合があります。

2. 実験要件

  通信用の I2C プロトコルを理解して学習するには、このプロトコルをより明確に理解する必要があります。また、コードを読み取る方法を理解するには、DHT20 チップからデータを読み取るプロセスを明確に理解する必要があります。この実験では、I2C を明確に理解できるだけでなく、C8T6 についてもより多くのことを学ぶことができます。I2C バス通信プロトコルを学習し、STM32F103 を使用して、I2C プロトコルに基づいて DHT20 温度および湿度センサーのデータ収集を完了し、収集した温度湿度値をシリアル ポート経由で出力します。特定のタスク:

1) 「ソフトウェア I2C」と「ハードウェア I2C」とは何か説明してください。(Wildfire Companion Textbook の第 23 章「I2C – EEPROM の読み取りと書き込み」の原則の章を参照)

2) DHT20 データ マニュアルを読み、次のことを達成するようにプログラムします。2 秒ごとに温度と湿度のデータを収集し、シリアル ポートを介してホスト コンピュータ (win10) に送信します。

3.DHT20について

  通信用の I2C プロトコルを理解して学習するには、このプロトコルをより明確に理解する必要があります。また、コードを読み取る方法を理解するには、DHT20 チップからデータを読み取るプロセスを明確に理解する必要があります。この実験では、I2C を明確に理解できるだけでなく、C8T6 についてもより多くのことを学ぶことができます。DHT20 の詳細な紹介については、Baidu ネットワーク ディスク データ リンクをクリックして、抽出コードをダウンロードしてください。8520
ファイルには、製造元によって作成されたコード データが含まれており、学習にも使用できます。
ここに画像の説明を挿入

ここに画像の説明を挿入
ここに画像の説明を挿入

4. コードの書き方

  通信用の I2C プロトコルを理解して学習するには、このプロトコルをより明確に理解する必要があります。また、コードを読み取る方法を理解するには、DHT20 チップからデータを読み取るプロセスを明確に理解する必要があります。この実験では、I2C を明確に理解できるだけでなく、C8T6 についてもより多くのことを学ぶことができます。既存のプロジェクト テンプレートを開くか、DHT20 温度取得のコード部分を参照するか、DHT20 メーカーが提供するファームウェア ライブラリを記述します.メーカーのコードをダウンロードするには、Baiduネットワーク ディスク データ リンクをクリックして抽出コードをダウンロードしてください: 8520
メインコード解析
① DHT20チップ 使用プロセス

void  read_AHT20_once(void)
{
	delay_ms(10);

	reset_AHT20();//重置AHT20芯片
	delay_ms(10);

	init_AHT20();//初始化AHT20芯片
	delay_ms(10);

	startMeasure_AHT20();//开始测试AHT20芯片
	delay_ms(80);

	read_AHT20();//读取AHT20采集的到的数据
	delay_ms(5);
}

②AHT20チップ読み込みデータ

void read_AHT20(void)
{
	uint8_t   i;
	for(i=0; i<6; i++)
	{
		readByte[i]=0;
	}
	I2C_Start();//I2C启动

	I2C_WriteByte(0x71);//I2C写数据
	ack_status = Receive_ACK();//收到的应答信息
	readByte[0]= I2C_ReadByte();//I2C读取数据
	Send_ACK();//发送应答信息

	readByte[1]= I2C_ReadByte();
	Send_ACK();

	readByte[2]= I2C_ReadByte();
	Send_ACK();

	readByte[3]= I2C_ReadByte();
	Send_ACK();

	readByte[4]= I2C_ReadByte();
	Send_ACK();

	readByte[5]= I2C_ReadByte();
	SendNot_Ack();
	//Send_ACK();

	I2C_Stop();//I2C停止函数
	//判断读取到的第一个字节是不是0x08,0x08是该芯片读取流程中规定的,如果读取过程没有问题,就对读到的数据进行相应的处理
	if( (readByte[0] & 0x68) == 0x08 )
	{
		H1 = readByte[1];
		H1 = (H1<<8) | readByte[2];
		H1 = (H1<<8) | readByte[3];
		H1 = H1>>4;

		H1 = (H1*1000)/1024/1024;

		T1 = readByte[3];
		T1 = T1 & 0x0000000F;
		T1 = (T1<<8) | readByte[4];
		T1 = (T1<<8) | readByte[5];

		T1 = (T1*2000)/1024/1024 - 500;

		AHT20_OutData[0] = (H1>>8) & 0x000000FF;
		AHT20_OutData[1] = H1 & 0x000000FF;

		AHT20_OutData[2] = (T1>>8) & 0x000000FF;
		AHT20_OutData[3] = T1 & 0x000000FF;
	}
	else
	{
		AHT20_OutData[0] = 0xFF;
		AHT20_OutData[1] = 0xFF;

		AHT20_OutData[2] = 0xFF;
		AHT20_OutData[3] = 0xFF;
		printf("读取失败!!!");

	}
	printf("\r\n");
	//根据AHT20芯片中,温度和湿度的计算公式,得到最终的结果,通过串口显示
	printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);
	printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
	printf("\r\n");
}

5. ハードウェア接続

ここに画像の説明を挿入
SCL は PB6 に接続し、SDA は PB7 に接続します。

#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;} #define
SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32) 3<<28;}
#define IIC_SCL PBout(6) //SCL
#define IIC_SDA PBout(7) //SDA
#define READ_SDA PBin(7)

6. ディスプレイ

ここに画像の説明を挿入
息を吐いた後、湿度が大幅に上昇

7. まとめ

  通信用の I2C プロトコルを理解して学習するには、このプロトコルをより明確に理解する必要があります。また、コードを読み取る方法を理解するには、AHT20 チップからデータを読み取るプロセスを明確に理解する必要があります。この実験では、I2C を明確に理解できるだけでなく、C8T6 についてもより多くのことを学ぶことができます。

8.参考文献

I2Cプロトコル
AHT20温度取得
STM32がOLED画面表示文字列を実現する記事を1つ

おすすめ

転載: blog.csdn.net/qq_52201641/article/details/127531198