ds18b20溫度傳感器測體溫,ky028數(shù)字溫度傳感器模塊
chanong
溫度測量是制造商項目中最常見的功能需求之一。您還可以制作自己的溫度計并將其放在臥室或汽車中,這樣您就可以隨時了解周圍的溫度。通過添加其他輔助模塊和控制器,可以實現(xiàn)遠程測溫和控溫。所有這些的基礎(chǔ)是小型溫度傳感器芯片,最常見的是DS18B20 數(shù)字溫度傳感器。
DS18B20是常用的數(shù)字溫度傳感器,輸出數(shù)字信號,具有體積小、硬件開銷低、抗干擾能力強、精度高等特點。接線簡單,包裝后也可在各種場合使用。 DS18B20引腳定義:
DQ為數(shù)字信號輸入輸出端,GND為電源地,VDD為外部電源輸入端(寄生電源接線方式接地)。 DS18B20的主要特點:
它具有較寬的適應(yīng)電壓范圍:3.0 至5.5 V,并且可以在寄生電源模式下通過數(shù)據(jù)線供電。獨特的單線接口模式,DS18B20與微處理器連接時僅需一根端口線,微處理器與DS18B20之間雙向通信,DS18B20支持多點網(wǎng)絡(luò)功能,只需3根線即可將多個DS18B20并聯(lián),實現(xiàn)多點測溫網(wǎng)絡(luò)內(nèi),溫度測量范圍-55C至+125C、-10至+85C,精度0.5C,可編程分辨率為9至12位,兼容可分解溫度0.5、0.25 、0.125、0.0625?蛇M行9位分辨率測量,93.75ms內(nèi)將溫度轉(zhuǎn)換為數(shù)值,12位分辨率下,最長750ms內(nèi)將溫度值轉(zhuǎn)換為數(shù)值,測量結(jié)果原樣輸出更快,數(shù)字溫度信號發(fā)送至CPU通過“單線總線”,同時串行傳輸CRC校驗碼,具有很強的抗干擾和糾錯能力負電壓特性:如果電源極性不同,芯片會即使電源接反也不會被熱燒壞,但不工作屬于正,F(xiàn)象。 DS18B20內(nèi)部結(jié)構(gòu):
如圖所示,DS18B20的內(nèi)部結(jié)構(gòu)主要由四部分組成。 64 位光刻ROM、溫度傳感器、非易失性溫度報警觸發(fā)器TH 和TL 以及配置寄存器。
DS18B20內(nèi)部結(jié)構(gòu)
DS18B20工作原理:
DS18B20測溫原理圖
DS18B20的讀/寫時序和溫度測量原理與DS1820相同,但由于分辨率的不同,獲得的溫度值的位數(shù)不同,并且溫度轉(zhuǎn)換時的延遲時間從2減少秒到750 毫秒。 DS18B20的溫度測量原理如圖所示。圖中低溫度系數(shù)晶振的振蕩頻率幾乎不受溫度影響,產(chǎn)生固定頻率的脈沖信號,送至減法計數(shù)器1 。高溫度系數(shù)晶振的振蕩頻率隨溫度變化,這當(dāng)然是變化的,但產(chǎn)生的信號作為減法計數(shù)器2的脈沖輸入,計數(shù)門也隱藏在圖中。DS18B20對低溫度系數(shù)振蕩器產(chǎn)生的時鐘脈沖進行計數(shù),完成溫度測量。
計數(shù)門的開啟時間由高溫度系數(shù)振蕩器決定,每次測量前,首先將-55對應(yīng)的基數(shù)分別存入減法計數(shù)器1和溫度寄存器中。預(yù)設(shè)為基值-A,對應(yīng)于55C。
減法計數(shù)器1減去低溫度系數(shù)晶體振蕩器產(chǎn)生的脈沖信號,當(dāng)減法計數(shù)器1的設(shè)定值達到0時,溫度寄存器的值加1,減法計數(shù)器1的設(shè)定值變?yōu)?。減法計數(shù)器1,繼續(xù)對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行計數(shù),如此循環(huán),直到減法計數(shù)器2達到0,停止累加溫度寄存器值,此時溫度寄存器即為測量到的溫度。
圖中的斜率累加器用于補償和校正溫度測量過程的非線性,其輸出用于修改減法計數(shù)器的預(yù)設(shè)值,除非計數(shù)門關(guān)閉,否則重復(fù)上述過程。這就是DS18B20的溫度測量原理,直到溫度寄存器的值達到測量的溫度值。
另外,DS18B20的單線通信功能是分時完成的,因此有嚴格的時隙概念,使得讀寫時序非常重要。系統(tǒng)對DS18B20的各種操作都必須按照協(xié)議進行。操作協(xié)議為DS18B20初始化(復(fù)位脈沖發(fā)送)ROM功能命令發(fā)送存儲器操作命令發(fā)送數(shù)據(jù)處理。各種操作的時序圖與DS1820時序圖相同。
說了這么多,如果您仍然感到困惑也沒關(guān)系。因為不需要理解得那么清楚。通常,傳感器集成模塊可以直接在應(yīng)用過程中使用。具有更方便的接口和更可靠的性能。簡單來說,就是在傳感器上加了一個上拉電阻和一個指示燈。
工作電壓:3V~5.5v 溫度測量范圍:-55~+125(誤差2)、-10~+85(誤差2) 電路板尺寸:21mm*10mmDS18B20 數(shù)字溫度傳感器模塊
DS18B20 數(shù)字溫度傳感器模塊原理圖
接下來,使用Arduino驅(qū)動DS18B20模塊,并使用串口顯示DS18B20測量的溫度。硬件設(shè)備:
Arduino控制器x 1DS18B20數(shù)字溫度傳感器模塊x 1 USB數(shù)據(jù)線x 1 接線:連接電路非常簡單,只需連接模塊的電源線和地線,并將模塊的數(shù)據(jù)總線DO連接到數(shù)字端即可。連接Arduino的12針,是的,USB數(shù)據(jù)。
Arduino接線圖
步驟如下:先附上流程圖。
DS18B20程序流程圖
按照上面的流程圖使用單總線庫。使用OneWire 完成編程。
#include OneWire ds(12); //連接arduino12引腳void setup(void){ Serial.begin(9600);}void Loop(void) { byte i; byte Present=0; byte type_s; byte data[12] ; byte addr[8]; float 攝氏溫度、華氏溫度; if ( !ds.search(addr)) { Serial.println('沒有更多地址。'); Serial.println(); ds.reset_search(); Late (250 ) ; return; } Serial.print('ROM='); for( i=0; i 8; i++) { Serial.write(' '); Serial.print(addr, HEX); } if (OneWire:crc8 (addr , 7) !=addr[7]) { Serial.println('CRC is invalid!'); return; } Serial.println(); //第一個ROM 字節(jié)位于芯片開關(guān)(addr[0] ) 指示的位置{ case0x10: Serial.println(' Chip=DS18S20'); //或更舊的DS1820 type_s=1; Break; case0x28: Serial.println(' Chip=DS18B20'); type_s=0; Break; case0x22: Serial.println( ' Chip=DS1822'); type_s=0; break; default: Serial.println('該設(shè)備不是DS18x20 系列設(shè)備。'); return; } ds.reset(); ds.select(addr); ds.write (0x44 , 1); //開始轉(zhuǎn)換,最后打開寄生電源。 Late(1000); //750ms 可能就足夠了,但也可能不夠//可能在這里運行ds.depower(),但它將在重置時處理。present=ds.reset(); ds.select(addr); ds.write(0xBE); //讀取暫存器Serial.print(' Data='); Serial.print(present,HEX); Serial.print ( ' ') for ( i=0; i 9; i++) { //需要9 個字節(jié)data=ds.read(); Serial.print(data, HEX); Serial.print(' '); } Serial . print(' CRC='); Serial.print(OneWire:crc8(data, 8), HEX); Serial.println(); //將數(shù)據(jù)轉(zhuǎn)換為實際溫度unsigned int raw=(data[1] 8) | data [ 0 ]; if (type_s) { raw=raw 3; //默認為9 位分辨率if (data[7]==0x10) { //剩余計數(shù)提供完整的12 位分辨率raw=( raw0xFFF0) + 12 - data [ 6]; } } else { byte cfg=(data[4]0x60); if (cfg==0x00) raw=raw 3; //9 位分辨率,93.75 ms else if (cfg==0x20) raw=raw 2 ; //10 位分辨率,187.5 ms else if (cfg==0x40) raw=raw 1; //11 位分辨率,375 ms //默認為12 位分辨率,750 轉(zhuǎn)換時間(以毫秒為單位) }攝氏度=(float)raw/16.0; 華氏度=攝氏度* 1.8 + 32.0; Serial.print(' 溫度='); Serial.print(攝氏度); Serial.print(' 攝氏度, ') ; Serial.print(華氏度) ; Serial.println('Fahrenheit');} 程序還是很復(fù)雜,但是有一個更簡單的方法。使用DS18B20 庫DallasTemperature。
#include #include //定義連接到Arduino IO 號12 的DS18B20 數(shù)據(jù)端口#define ONE_WIRE_BUS 12 //最初連接到單總線的單總線設(shè)備OneWire oneWire(ONE_WIRE_BUS);DallasTemperaturesensors(oneWire); void setup( void) { //設(shè)置串口通信的波特率Serial.begin(9600); Serial.println('達拉斯溫度IC控制庫演示'); //初始庫sensors.begin();}void loop(void ){ Serial .print ('請求溫度.');sensors.requestTemperatures(); //發(fā)送命令獲取溫度Serial.println('DONE'); Serial.print('設(shè)備1 的溫度(索引0) is: '); Serial .println(sensors.getTempCByIndex(0)); }這不是很簡單嗎,連接上數(shù)碼管、液晶屏或者其他顯示溫度的顯示設(shè)備就可以完成儀表的創(chuàng)建了。








