一般に、LM35温度センサーは、安価で入手が容易なため、マイクロコントローラーとともに使用して温度を測定します。しかし、LM35はアナログ値を提供するため、ADC(Analog to Digital Converter)を使用してそれらをデジタルに変換する必要があります。しかし、今日はDS18B20温度センサーを使用しており、温度を取得するためにADC変換は必要ありません。ここでは、PICマイクロコントローラーとDS18B20を使用して温度を測定します。
そこで、ここでは、マイクロチップのPIC16F877Aマイクロコントローラユニットを使用して、次の仕様の温度計を構築しています。
- -55度から+125度までの全温度範囲が表示されます。
- 温度が+/-。2度変化した場合にのみ温度が表示されます。
必要なコンポーネント:-
- Pic16F877A –PDIP40パッケージ
- ブレッドボード
- Pickit-3
- 5Vアダプター
- LCD JHD162A
- DS18b20温度センサー
- 周辺機器を接続するためのワイヤ。
- 4.7k抵抗器–2個
- 10kポット
- 20mHzクリスタル
- 2個の33pFセラミックコンデンサ
DS18B20温度センサー:
DS18B20は、温度を正確に感知するための優れたセンサーです。このセンサーは、温度検知で9ビットから12ビットの分解能を提供します。このセンサーは1本のワイヤーとのみ通信し、アナログ温度を取得してデジタルに変換するためにADCを必要としません。
センサーの仕様は次のとおりです。-
- -55°Cから+ 125°C(-67°Fから+ 257°F)の温度を測定します
- -10°Cから+ 85°Cまでの±0.5°Cの精度
- 9ビットから12ビットまでのプログラム可能な解像度
- 外部コンポーネントは必要ありません
- センサーは1-Wire®インターフェースを使用します
データシートの上のピン配置画像を見ると、センサーがBC547またはBC557パッケージのTO-92とまったく同じように見えることがわかります。最初のピンはグランド、2番目のピンはDQまたはデータ、3番目のピンはVCCです。
以下は、設計に必要となるデータシートの電気的仕様です。センサーの定格供給電圧は+ 3.0V〜 + 5.5Vです。また、上記の供給電圧と同じプルアップ供給電圧が必要です。
また、-10℃から+ 85℃の範囲では+ -0.5℃の精度マージンがあり、-55度から+の範囲では+ -2度の全範囲マージンで精度が変化します。 125度の範囲。
もう一度データシートを見ると、センサーの接続仕様がわかります。DATAとGNDの2本のワイヤーが必要な寄生電源モードでセンサーを接続することも、3本の別々のワイヤーが必要な外部電源を使用してセンサーを接続することもできます。2番目の構成を使用します。
センサーと接続関連領域の電力定格に精通しているので、回路図の作成に集中できます。
回路図:-
回路図を見ると、次のことがわかります。-
16x2文字のLCDはPIC16F877Aマイクロプロセッサに接続され、RB0、RB1、RB2はLCDピンRS、R / W、およびEに接続されます。RB4、RB5、RB6、およびRB7はLCDの4ピンD4、D5、D6、 D7。LCDは4ビットモードまたはニブルモードで接続されます。
OSC1ピンとOSC2ピンの間に、33pFの2つのセラミックコンデンサを備えた20MHzの水晶発振器が接続されています。マイクロコントローラに一定の20Mhzクロック周波数を提供します。
DS18B20も、ピン構成に従って、前述のように4.7kのプルアップ抵抗で接続されます。私はこれらすべてをブレッドボードで接続しました。
PICマイクロコントローラーを初めて使用する場合は、PICマイクロコントローラー入門を記載したPICマイクロコントローラーチュートリアルに従ってください。
手順またはコードフロー:-
- 発振器構成を含むマイクロコントローラの構成を設定します。
- TRISレジスタを含むLCDの目的のポートを設定します。
- ds18b20センサーのすべてのサイクルはリセットで始まるため、ds18b20をリセットし、プレゼンスパルスを待ちます。
- スクラッチパッドを書き込み、センサーの解像度を12ビットに設定します。
- ROM読み取りをスキップし、その後にリセットパルスを続けます。
- 温度変換コマンドを送信します。
- スクラッチパッドから温度を読み取ります。
- 温度値が負か正かを確認してください。
- 16x2LCDに温度を印刷します。
- 摂氏+/-。20度の温度変化を待ちます。
コードの説明:
このデジタル体温計の完全なコードは、このチュートリアルの最後にデモンストレーションビデオとともに示されています。このプログラムを実行するには、ここからダウンロードできるいくつかのヘッダーファイルが必要になります。
まず、PICマイクロコントローラで構成ビットを設定し、その後で起動する必要が 無効メイン 機能。
次いで、以下の4行はのために使用されるライブラリヘッダファイルを含む、 lcd.h と ds18b20.hを 。また、 xc.h はマイクロコントローラーヘッダーファイル用です。
#include
これらの定義は、温度センサーにコマンドを送信するために使用されます。コマンドはセンサーのデータシートに記載されています。
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E#defineresolution_12bit 0x7F #define read_scratchpad 0xBE
センサーのデータシートのこの表3は、マクロを使用してそれぞれのコマンドを送信するすべてのコマンドを示しています。
温度が+/- 。20度変化した場合にのみ、温度が画面に表示されます。この temp_gap マクロからこの温度ギャップを変更できます。このマクロの値を変更することにより、仕様が変更されます。
表示された温度データを保存し、温度ギャップでそれらを区別するために使用される他の2つのfloat変数
#define temp_gap 20 float pre_val = 0、aft_val = 0;
。
ボイドメイン() 関数、 lcd_init() 。LCDを初期化する機能です。この lcd_init() 関数は、lcd.hライブラリから呼び出されます。
TRISレジスタは、入力または出力としてI / Oピンを選択するために使用されます。2つの符号なし短い変数 TempL と TempH は、温度センサーからの 12ビット 解像度データを格納するために使用されます。
void main(void){TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; unsigned short TempL、TempH; unsigned int t、t2; フロートdifference1 = 0、difference2 = 0; lcd_init();
whileループを見てみましょう。ここでは、 while(1) ループを小さなチャンクに分割しています。
これらの線は、温度センサーが接続されているかどうかを検知するために使用されます。
while(ow_reset()){lcd_com(0x80); lcd_puts( "接続してください"); lcd_com(0xC0); lcd_puts( "Temp-Sense Probe"); }
このコードセグメントを使用して、センサーを初期化し、コマンドを送信して温度を変換します。
lcd_puts( ""); ow_reset(); write_byte(write_scratchpad); write_byte(0); write_byte(0); write_byte(resolution_12bit); // 12ビット解像度ow_reset(); write_byte(skip_rom); write_byte(convert_temp);
このコードは、12ビットの温度データを2つの符号なしshort変数に格納するためのものです。
while(read_byte()== 0xff); __delay_ms(500); ow_reset(); write_byte(skip_rom); write_byte(read_scratchpad); TempL = read_byte(); TempH = read_byte();
次に、以下の完全なコードを確認すると、if-else条件を作成して、温度記号が正か負かを調べます。
If ステートメントコードを使用して、データを操作し、温度が負であるかどうかを確認し、温度変化が+/-。20度の範囲にあるかどうかを判断します。そして、中に 他の 部分、我々は、温度が正であるかどうかをチェックし、温度検出を変更します。
コード
DS18B20温度センサーからのデータの取得:
1-Wire®インターフェースのタイムギャップを見てみましょう。20Mhzクリスタルを使用しています。ds18b20.cファイルの内部を見ると、次のことがわかります。
#define _XTAL_FREQ 20000000
この定義は、XC8コンパイラの遅延ルーチンに使用されます。水晶周波数として20Mhzを設定します。
5つの機能を作りました
- ow_reset
- read_bit
- read_byte
- write_bit
- write_byte
1- Wire® プロトコルは、通信するために厳密なタイミング関連のスロットを必要とします。データシートの中には、完璧なタイムスロット関連の情報が含まれています。
以下の関数内で、正確なタイムスロットを作成しました。ホールドとリリースの正確な遅延を作成し、それぞれのセンサーのポートのTRISビットを制御することが重要です。
unsigned char ow_reset(void){DQ_TRIS = 0; // Tris = 0(出力)DQ = 0; //ピン番号をロー(0)に設定します__delay_us(480); // 1本のワイヤには時間遅延が必要ですDQ_TRIS = 1; // Tris = 1(入力)__ delay_us(60); // 1本のワイヤに時間遅延が必要if(DQ == 0)//プレゼンスプラスがある場合{__delay_us(480); 0を返します。// 0を返します(1-wireは存在します)} else {__delay_us(480); 1を返します。// 1を返します(1線は存在しません)}} // 0 =存在し、1 =部分なし
ここで、読み取りと書き込みで使用される以下のタイムスロットの説明に従って、それぞれ 読み取り 関数と 書き込み 関数を作成しました。
unsigned char read_bit(void){unsigned char i; DQ_TRIS = 1; DQ = 0; // DQをローにプルして、タイムスロットを開始しますDQ_TRIS = 1; DQ = 1; //次にhighを返します(i = 0; i <3; i ++); //タイムスロットの開始から15us遅延return(DQ); // DQ行の戻り値} void write_bit(char bitval){DQ_TRIS = 0; DQ = 0; // DQをローにプルしてタイムスロットを開始しますif(bitval == 1)DQ = 1; // 1を書き込むとDQを高く返します__delay_us(5); //タイムスロットの残りの値を保持しますDQ_TRIS = 1; DQ = 1; } //遅延は、ループごとに16usと24usを提供します。したがって、delay(5)= 104us
ここで、関連するすべてのヘッダーファイルと.cファイルをさらに確認してください。
これが、DS18B20センサーを使用してPICマイクロコントローラーで温度を取得する方法です。
LM35を使用して単純なデジタル温度計を作成する場合は、他のマイクロコントローラーを使用した以下のプロジェクトを確認してください。
- RaspberryPiを使用した室温測定
- ArduinoとLM35を使用したデジタル体温計
- LM35および8051を使用したデジタル体温計
- LM35とAVRマイクロコントローラーを使用した温度測定