温度と湿度の測定は、ホームオートメーション、環境モニタリング、気象観測所などの多くのアプリケーションで役立つことがよくあります。LM35の次に最も一般的に使用されている温度センサーはDHT11です。これまで、ArduinoやRaspberryとのインターフェースにより、多くのDHT11プロジェクトを構築してきました。 Piおよび他の多くの開発ボード。この記事では、このDHT11を8ビットPICマイクロコントローラーであるPIC16F87Aとインターフェースする方法を学習します。このマイクロコントローラーを使用して、DHT11を使用して温度と湿度の値を読み取り、LCDディスプレイに表示します。 PICマイクロコントローラーの使用にまったく慣れていない場合は、PICチュートリアルシリーズを使用して、PICマイクロコントローラーのプログラミングと使用方法を学ぶことができます。それでは、始めましょう。
DHT11 –仕様と動作
DHT11センサーは、モジュール形式またはセンサー形式のいずれかで入手できます。このチュートリアルではセンサーを使用していますが、両者の唯一の違いは、モジュール形式では、センサーにフィルターコンデンサーとプルアップ抵抗がセンサーの出力ピンに接続されていることです。したがって、モジュールを使用している場合は、外部から追加する必要はありません。センサー形式のDHT11を以下に示します。
DHT11センサーには、青または白のカラーケーシングが付属しています。 このケーシングの内部 には、相対湿度と温度を感知するのに役立つ2つの重要なコンポーネントがあります。 最初のコンポーネントは一対の電極です。これら2つの電極間の電気抵抗は、水分保持基板によって決定されます。したがって、測定された抵抗は、環境の相対湿度に反比例します。相対湿度が高いほど抵抗の値は低くなり、逆もまた同様です。また、相対湿度は実際の湿度とは異なることに注意してください。相対湿度は、空気中の温度に対する空気中の水分量を測定します。
他のコンポーネントは、表面実装されたNTCサーミスタです。NTCという用語は、負の温度係数を表します。温度が上昇すると、抵抗の値が減少します。センサーの出力は工場で校正されているため、プログラマーとしてセンサーの校正について心配する必要はありません。1-Wire通信によって与えられるセンサーの出力、このセンサーのピンと接続図を見てみましょう。
製品は4ピン単列パッケージです。1番目のピンはVDDの両端に接続され、4番目のピンはGNDの両端に接続されます。2番目のピンはデータピンであり、通信目的で使用されます。このデータピンには5kのプルアップ抵抗が必要です。ただし、4.7kから10kなどの他のプルアップ抵抗も使用できます。3番目のピンは何にも接続されていません。したがって、無視されます。
データシートには、技術仕様と、以下の表に記載されているインターフェース情報が記載されています-
上記の表は、温度と湿度の測定範囲と精度を示しています。摂氏0〜50度の温度を摂氏+/- 2度の精度で測定でき、相対湿度を摂氏20〜90%の範囲で+/- 5%RHの精度で測定できます。詳細仕様は下表のとおりです。
DHT11センサーとの通信
データを読み取るために、以前、順に説明したようにPICでDHT11我々は、使用する必要がPIC 1つのワイヤー通信プロトコルを。これを実行する方法の詳細は、データシートに記載されているDHT11のインターフェース図から理解できます。同じことが以下に示されています。
DHT11は、通信を開始するためにMCUからの開始信号を必要とします。したがって、MCUがDHT11センサーに開始信号を送信して、温度と湿度の値を送信するように要求する必要があるたびに。開始信号が完了すると、DHT11は温度と湿度の情報を含む応答信号を送信し ます。データ通信は、シングルバスデータ通信プロトコルによって行われます。完全なデータ長は40ビットで、センサーはより高いデータビットを最初に送信します。
プルアップ抵抗により、アイドルモード中はデータラインは常にVCCレベルのままです。MCUは、18msの最小スパンの間、この電圧をハイからローにプルダウンする必要があります。この間、DHT11センサーが開始信号を検出し、マイクロコントローラーがデータラインを20〜40usの間Highにします。この20〜40usの時間は、DHT11が応答を開始する待機期間と呼ばれます。この待機期間の後、DHT11はデータをマイクロコントローラユニットに送信します。
DHT11センサーデータフォーマット
データは、小数部と整数部を組み合わせて構成されています。センサーは以下のデータ形式に従います–
8ビット積分RHデータ+8ビット10進数RHデータ+8ビット積分Tデータ+8ビット10進数Tデータ+8ビットチェックサム。
受信したデータでチェックサム値を確認することで、データを検証できます。これができるのは、すべてが適切で、センサーが適切なデータを送信した場合、チェックサムは 「8ビット整数RHデータ+8ビット10進数RHdata + 8ビット整数Tデータ+8ビット10進数Tデータ」 の合計である必要があるため です。
必要なコンポーネント
このプロジェクトでは、以下のものが必要です-
- PICマイクロコントローラー(8ビット)プログラミングセットアップ。
- ブレッドボード
- 5V500mA電源ユニット。
- 4.7k抵抗2個
- 1k抵抗
- PIC16F877A
- 20mHz水晶
- 33pFコンデンサ2個
- 16x2文字のLCD
- DHT11センサー
- ジャンパー線
回路図
DHT11とPIC16F877Aのインターフェースの回路図を以下に示します。
16x2 LCDを使用して、DHT11から測定した温度と湿度の値を表示しました。LCDは4線式モードでインターフェースされ、センサーとLCDの両方が5V外部電源から電力を供給されます。ブレッドボードを使用して必要なすべての接続を行い、外部5Vアダプターを使用しました。このブレッドボード電源ボードを使用して、5Vでボードに電力を供給することもできます。
回路の準備ができたら、このページの下部にあるコードをアップロードするだけで、以下に示すように温度と湿度の読み取りを開始できます。コードがどのように書かれ、どのように機能するかを知りたい場合は、さらに読んでください。また、このページの下部にあるビデオで、このプロジェクトの完全な動作を見つけることができます。
DHT11とPICMPLABXコードの説明
コードはMPLABXIDEを使用して記述され、XC8コンパイラを使用してコンパイルされました。どちらもMicrochip自体が提供しており、無料でダウンロードして使用できます。プログラミングの基本を理解するには、基本的なチュートリアルを参照してください。DHT11センサーとの通信に必要な3つの重要な機能についてのみ以下で説明します。機能は-
void dht11_init(); void find_response(); char read_dht11();
最初の関数は、dht11の開始信号に使用されます。前に説明したように、DHT11とのすべての通信は開始信号で始まります。ここでは、最初にピンの方向を変更して、データピンをマイクロコントローラーからの出力として構成します。次に、データラインがローに引き下げられ、18mSを待ち続けます。その後、再びマイクロコントローラによってラインがハイになり、最大30usまで待機し続けます。その待機時間の後、データを受信するためにマイクロコントローラへの入力としてデータピンが設定されます。
void dht11_init(){ DHT11_Data_Pin_Direction = 0; // RD0を出力として構成します DHT11_Data_Pin = 0; // RD0はセンサーに0を送信します __delay_ms(18); DHT11_Data_Pin = 1; // RD0は1をセンサーに送信します __delay_us(30); DHT11_Data_Pin_Direction = 1; // RD0を入力として構成します }
次の機能は、データピンの状態に応じてチェックビットを設定するために使用されます。DHT11センサーからの応答を検出するために使用されます。
void find_response(){ Check_bit = 0; __delay_us(40); if(DHT11_Data_Pin == 0){ __ delay_us(80); if(DHT11_Data_Pin == 1){ Check_bit = 1; } __delay_us(50);} }
最後に、dht11読み取り関数。ここで、データは8ビット形式に読み取られ、データピンのステータスに応じてビットシフト演算を使用してデータが返されます。
char read_dht11(){ char data、for_count; for(for_count = 0; for_count <8; for_count ++){ while(!DHT11_Data_Pin); __delay_us(30); if(DHT11_Data_Pin == 0){ data&=〜(1 <<(7 --for_count)); //ビットをクリア(7-b) } else { data- =(1 <<(7 --for_count)); //ビット(7-b) を 設定しますwhile(DHT11_Data_Pin); } } データを返します。 }
その後、すべてがmain関数に実行されます。まず、システムの初期化が行われ、LCDが初期化され、LCDピンのポート方向が出力に設定されます。アプリケーションはmain関数内で実行されています
void main(){ system_init(); while(1){ __ delay_ms(800); dht11_init(); find_response(); if(Check_bit == 1){ RH_byte_1 = read_dht11(); RH_byte_2 = read_dht11(); Temp_byte_1 = read_dht11(); Temp_byte_2 = read_dht11(); 合計= read_dht11(); if(Summation ==((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2)&0XFF)){ 湿度= Temp_byte_1; RH = RH_byte_1; lcd_com(0x80); lcd_puts( "Temp:"); // lcd_puts( ""); lcd_data(48 +((湿度/ 10)%10)); lcd_data(48 +(湿度%10)); lcd_data(0xDF); lcd_puts( "C"); lcd_com(0xC0); lcd_puts( "湿度:"); // lcd_puts( ""); lcd_data(48 +((RH / 10)%10)); lcd_data(48 +(RH%10)); lcd_puts( "%"); } else { lcd_puts( "チェックサムエラー"); } } else { clear_screen(); lcd_com(0x80); lcd_puts( "エラー!!!"); lcd_com(0xC0); lcd_puts( "応答なし。"); } __delay_ms(1000); } }
DHT11センサーとの通信は、開始信号がセンサーに送信される while ループ内で行われます。その後、 find_response 関数がトリガーされます。場合 Check_bitを 1次に、さらに通信が他に行われるされるLCDは、エラーダイアログを表示します。
40bitデータによって、 read_dht11は 5回(5回X 8ビット)と呼ばれ、データシートに設けられたデータフォーマットに従ってデータを記憶します。チェックサムの状態もチェックされ、エラーが見つかった場合、それはまた、LCDに通知します。最後に、データが変換され、16x2文字のLCDに送信されます。
このPICの温度と湿度の測定の完全なコードは、ここからダウンロードできます。下記のデモビデオもご覧ください。
あなたがプロジェクトを理解し、何か役に立つものを作るのを楽しんだことを願っています。ご不明な点がございましたら、下のコメントセクションに残すか、フォーラムを使用してその他の技術的な質問をご覧ください。