溫度傳感器DS18B20代碼,溫度傳感器DS18B20實驗
chanong
作為“一線器件”,DS18B20 單線數(shù)字溫度傳感器具有獨(dú)特的優(yōu)勢:
(1) 當(dāng)使用單總線接口連接微處理器時,只需一根端口線即可實現(xiàn)微處理器與DS18B20 之間的雙向通信。單總線具有經(jīng)濟(jì)性好、抗干擾性強(qiáng)、適合惡劣環(huán)境下的現(xiàn)場測溫、使用方便等優(yōu)點(diǎn),可以讓用戶輕松搭建傳感器網(wǎng)絡(luò)和測量系統(tǒng),可以為傳感器網(wǎng)絡(luò)的建設(shè)引入新的理念。
(2)測量溫度范圍寬,測量精度高DS18B20的測量范圍為-55至+125,在-10至+85范圍內(nèi)精度為0.5。
(3) 支持多點(diǎn)網(wǎng)絡(luò)功能將多個DS18B20并聯(lián)在一根線上,實現(xiàn)多點(diǎn)測溫。
(4)靈活的供電方案DS18B20可以通過內(nèi)部寄生電路從數(shù)據(jù)線獲取電源。因此,如果數(shù)據(jù)線時序滿足一定要求,則無需連接外部電源,使得系統(tǒng)配置更簡單、更可靠。
(5) 測量參數(shù)可設(shè)置DS18B20 的測量分辨率可通過程序設(shè)置為9 至12 位。
DS18B20的小尺寸、擴(kuò)展的電壓范圍、提高的經(jīng)濟(jì)性、可選的小封裝和擴(kuò)展的電壓范圍使其適合構(gòu)建您自己的經(jīng)濟(jì)型溫度測量系統(tǒng),使其成為設(shè)計人員的最愛,實屬難得。
產(chǎn)品包裝
時序圖
典型應(yīng)用電路
寄生供電方式
支持命令集
復(fù)位時序
讀寫時序
具體操作:
1. 打開IDE,進(jìn)入Project > Load Libraries > Manage Libraries查找、下載并安裝對應(yīng)的庫。否則程序創(chuàng)建后編譯時會報錯。
搜索18B20,瀏覽到18B20相關(guān)庫,然后單擊安裝。
打開剛剛安裝第三方庫的File-Examples,找到第一個例子Alarm。
驗證除了DallasTemperature.h 之外,您還需要另一個庫OneWire.h,然后按照前面的步驟查找并安裝OneWire。 ONE_WIRE_BUS 2 表示開發(fā)版本中數(shù)據(jù)端口連接到引腳2。
2、將Arduino開發(fā)版通過USB連接到電腦,選擇對應(yīng)的開發(fā)版本和端口,編譯、上傳、寫入。
3、接線時需要加電阻,沒有電阻就無法檢測到設(shè)備。
引腳定義:面向印刷面,左側(cè)為GND,右側(cè)為VCC,中間為數(shù)字輸出引腳(必須接4.7K至10K上拉電阻)。
物料清單表
Arduino Uno*1
18B20溫度傳感器1
4.7K電阻*1
接線
Arduino Uno ------ 18B20 溫度傳感器顏色
引腳2 ------ DO 白色
5V ------ VCC 紅色
GND ------ GND 黃色
Arduino接線圖
4. 連接線后,通過USB 連接計算機(jī)并打開串行監(jiān)視器以查看結(jié)果。
報警案例代碼。您可以根據(jù)您的需要更改它。
#include //引用單總線頭文件
#include //引用18b20驅(qū)動文件
//數(shù)據(jù)線連接到Arduino的2號端口
#define ONE_WIRE_BUS 2//定義引腳2為數(shù)據(jù)引腳
//設(shè)置OneWire 實例以與任何OneWire 設(shè)備通信(不僅僅是Maxim/Dallas 溫度IC)
OneWire oneWire(ONE_WIRE_BUS);
//將oneWire 引用傳遞給達(dá)拉斯溫度。
達(dá)拉斯溫度傳感器(oneWire);
//保存設(shè)備地址的數(shù)組
設(shè)備地址內(nèi)部溫度計、外部溫度計。
禁用設(shè)置(禁用)
{
//啟動串口
串行.開始(9600);
Serial.println(\'達(dá)拉斯溫度IC控制庫演示\');
//啟動庫
sensors.begin();//初始化設(shè)備
//查找總線上的設(shè)備
Serial.print(\'找到\');
Serial.print(sensors.getDeviceCount(), DEC);//DEC表示串口數(shù)據(jù)以十進(jìn)制格式打印
Serial.println(\'設(shè)備。\');
//在總線上查找設(shè)備并根據(jù)其索引對其進(jìn)行分配。
if (!sensors.getAddress(insideThermometer, 0))
Serial.println(\'未找到設(shè)備0地址\');
if (!sensors.getAddress(outsideThermometer, 1))
Serial.println(\'未找到設(shè)備1地址\');
//顯示總線上找到的地址
Serial.print(\'設(shè)備0地址:\');
printAddress(溫度計);
串行.println();
Serial.print(\'設(shè)備0 報警: \');
printAlarms(溫度計);
串行.println();
Serial.print(\'設(shè)備1地址:\');
printAddress(溫度計之外);
串行.println();
Serial.print(\'設(shè)備1報警:\');
printAlarms(外部溫度計);
串行.println();
Serial.println(\'設(shè)置報警溫度.\');
//溫度超過30時報警
sensors.setHighAlarmTemp(內(nèi)部溫度計, 30);
//溫度低于-10時發(fā)出警報
sensors.setLowAlarmTemp(內(nèi)部溫度計,-10);
//溫度超過31則發(fā)出警報
傳感器.setHighAlarmTemp(outsideThermometer, 31);
//如果溫度低于27則發(fā)送警報
傳感器.setLowAlarmTemp(outsideThermometer, 27);
Serial.print(\'新設(shè)備0報警:\');
printAlarms(溫度計);
串行.println();
Serial.print(\'新設(shè)備1報警:\');
printAlarms(外部溫度計);
串行.println();
}
//輸出設(shè)備地址的函數(shù)
void printAddress(設(shè)備地址設(shè)備地址)
{
for (uint8_t i=0; i 8; i++)
{
if (設(shè)備地址[i] 16) Serial.print(\'0\');
Serial.print(設(shè)備地址[i], HEX);
}
}
//輸出設(shè)備溫度的函數(shù)
void printTemperature(設(shè)備地址設(shè)備地址)
{
float tempC=Sensors.getTempC(deviceAddress);
Serial.print(\'臨時C: \');
串行打印(tempC);
Serial.print(\'溫度F: \');
Serial.print(達(dá)拉斯溫度:to華氏度(tempC));
}
void printAlarms(uint8_t 設(shè)備地址[])
{
焦化溫度。
temp=Sensors.getHighAlarmTemp(deviceAddress);
Serial.print(\'高位警報:\');
Serial.print(temp, DEC);
Serial.print(\'C/\');
Serial.print(達(dá)拉斯溫度:to華氏度(溫度));
Serial.print(\'F | 低警報: \');
temp=Sensors.getLowAlarmTemp(deviceAddress);
Serial.print(temp, DEC);
Serial.print(\'C/\');
Serial.print(達(dá)拉斯溫度:to華氏度(溫度));
Serial.print(\'F\');
}
//打印設(shè)備信息的主函數(shù)
void printData(設(shè)備地址設(shè)備地址)
{
Serial.print(\'設(shè)備地址:\');
printAddress(設(shè)備地址);
串口.print(\' \');
printTemperature(設(shè)備地址);
串行.println();
}
void checkAlarm(設(shè)備地址設(shè)備地址)
{
if (sensors.hasAlarm(deviceAddress))
{
Serial.print(\'ALARM: \');
printData(設(shè)備地址);
}
}
虛空循環(huán)(虛空)
{
//調(diào)用sensors.requestTemperatures()發(fā)出地球溫度
//請求總線上的所有設(shè)備
Serial.print(\'請求溫度.\');
傳感器.requestTemperatures();
Serial.println(\'完成\');
//方法1:
//分別檢查每個地址的報警情況
checkAlarm(溫度計);
checkAlarm(外部溫度計);
/*
//替代方法:
//搜索總線并迭代有警報的設(shè)備的地址。
//報警設(shè)備地址空間
設(shè)備地址報警地址;
Serial.println(\'正在搜索警報.\');
//調(diào)用alarm search()之前必須先調(diào)用重置alarm search()
傳感器.resetAlarmSearch();
//如果沒有設(shè)備有鬧鐘,則alarmSearch()返回0
while (sensors.alarmSearch(alarmAddr))
{
Serial.print(\'ALARM: \');
打印數(shù)據(jù)(alarmAddr);
}
*/
}








