「雕爺學編程」Arduino動手做(39)——DS18B20溫度傳感器2

37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑑於本人手頭積累了一些傳感器和執行器模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流爲目的,這裏準備逐一動手試試多做實驗,不管成功與否,都會記錄下來——小小的進步或是搞不掂的問題,希望能夠拋磚引玉。

【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗三十九:DS18B20單總線數字溫度傳感器模塊

18B20元件官方鏈接如下:
https://www.maximintegrated.com/cn/products/sensors/DS18B20.html
相關技術參考資料:
https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
https://www.jin-hua.com.tw/upload/product/2110000001544_DATA.pdf

18B20數字溫度傳感器模塊實驗所需硬件清單

Arduino Uno開發板 X1
0.96寸OLED顯示屏X1
杜邦線 若干(備了9條)
高電平觸發有源蜂鳴器模塊X1
IIC/I2C 1602 LCD液晶屏模塊X1
18B20數字溫度傳感器模塊X2
LED發光二極管(綠、藍色)X2
高電平觸發單路5V繼電器模塊X1
Proto Shield 原型擴展板(帶mini麪包板)X1

傳感器模塊實驗所需軟件平臺
代碼編程 Arduino IDE (版本1.8.19)
仿真編程 Linkboy (版本V4.6.3)
圖形編程 Mind+ (版本 V1.7.0 RC2.0)
以及編玩邊學(線上平臺https://ide.codepku.com/?type=Arduino)

實驗接線示意圖

搜索安裝“DallasTemperature”和“OneWire”庫
1、打開Arduino——工具——管理庫——搜索DallasTemperature——安裝

2、打開Arduino——工具——管理庫——搜索OneWire——安裝

實驗說明
 
18B20 雖然具有測溫系統簡單、測溫精度高、連接方便、佔用口線少等優點,但在實際應用中也應注意以下幾方面的問題:
1、18B20和普通的三極管看起來差不多,所以注意不要把它當成一般的Pass三極管,以免損壞。爲了防止損壞 18B20,請確保電源線和地線沒有接反。
 
2、較小的硬件開銷需要相對複雜的軟件進行補償,由於18B20與微處理器間採用串口資料傳送,因此,在對18B20 進行讀寫編程時,必須嚴格的保證讀寫時序,否則將無法讀取測溫結果。在使用 PL/M、C 等語言進行系統程序設計時,對 18B20 操作部分最好採用組合語言實現。
 
3、在 18B20 的有關資料中均未提及單匯流排上所掛 18B20 數量問題,容易使人誤認爲可以掛任意多個18B20,在實際應用中並非如此。當單匯流排上所掛18B20 超過 8個時,就需要解決微處理器的匯流排驅動問題,這一點在進行多點測溫系統設計時要加以注意。
 
4、連接 18B20 的匯流排電纜是有長度限制的。試驗中,當採用普通信號電纜傳輸長度超過 50m 時,讀取的測溫資料將發生錯誤。當將匯流排電纜改爲雙絞線帶遮罩電纜時,正常通訊距離可達 150m,當採用每米絞合次數更多的雙絞線帶遮罩電纜時,正常通訊距離進一步加長。這種情況主要是由匯流排分佈電容使信號波形產生畸變造成的。因此,在用18B20 進行長距離測溫系統設計時要充分考慮匯流排分佈電容和阻抗匹配問題。
 
5、18B20 測溫程式設計中,向18B20 發出溫度轉換命令後,程序總要等待 18B20 的返回信號,一旦某個18B20 接觸不好或斷線,當程序讀該18B20時,將沒有返回信號,程序進入閉環。這一點在進行18B20 硬件連接和軟件設計時也要給予一定的重視。測溫電纜線建議採用遮罩 4 芯雙絞線,其中一對線接地線與信號線,另一組接 VCC 和地線,遮罩層在源端單點接地。
 

程序一:單線數字溫度18B20 + Arduino
Arduino參考開源代碼

/*
  【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
  程序一:單線數字溫度18B20 + Arduino
*/

#include <OneWire.h>  // 調用OneWire庫
#include <DallasTemperature.h>  // 調用DallasTemperature庫
#define ONE_WIRE_BUS 2  // 定義18B20數據口連接arduino的 2 腳
OneWire oneWire(ONE_WIRE_BUS);  // 初始連接在單總線上的單總線設備
DallasTemperature sensors(&oneWire);

void setup(void) {
  Serial.begin(9600);  // 設置串口通信波特率
  Serial.println("18B20溫度 IC 控制庫演示"); // 溫度IC控制庫演示
  sensors.begin(); // 初始化總線
}

void loop(void) {
  Serial.print(" 讀取溫度...");  // 發起溫度轉換
  sensors.requestTemperatures();  // 向總線上所有設備發送溫度轉換請求
  Serial.println("完成");   // 溫度轉換完成
  Serial.print("溫度爲: ");  // 串口打印實時溫度值
  // 同一總線上可以有多個 DS18B20。
  // 0指的是線上的第一個IC
  Serial.print(sensors.getTempCByIndex(0));
  delay(500);  // 延時500毫秒
}

  

實驗串口返回情況(手摸傳感器升溫3度)

Arduino實驗場景圖

程序二:串口顯示溫度
實驗開源仿真編程(Linkboy V4.63)

實驗串口返回情況

 

Arduino實驗場景圖

程序三:帶工作指示燈的溫度檢測器
(1)實驗開源圖形編程(Mind+、編玩邊學)

(2)實驗串口返回情況

程序四:TM1637數碼管顯示溫度
(1)實驗開源仿真編程(Linkboy V4.63)

Arduino實驗場景圖

程序五:溫度控制紅綠藍三色燈
(1)Arduino參考開源代碼

/*
  【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
  程序五:溫度控制紅綠藍三色燈
*/

#include <OneWire.h>  // 調用OneWire庫
#include <DallasTemperature.h>  // 調用DallasTemperature庫

int redLedPin = 2;//紅色LED
int greenLedPin = 3;//綠色LED
int blueLedPin = 4;//藍色LED

int temp_sensor = 5;//溫度傳感器

float temperature = 0;
//低於下限的溫度值都會觸發藍色LED燈亮起。
//高於上限的變量都會觸發紅色LED燈亮起。
//介於兩者之間的變量都將打開綠色LED燈。
int lowerLimit = 25;//溫度下限闕值
int higherLimit = 27;//溫度上限闕值
//創建一個OneWire對象
OneWire oneWirePin(temp_sensor);
DallasTemperature sensors(&oneWirePin);

void setup(void) {
  //激活Arduino串行接口
  Serial.begin(9600);
  //設置LED作爲輸出
  pinMode(redLedPin, OUTPUT);
  pinMode(greenLedPin, OUTPUT);
  pinMode(blueLedPin, OUTPUT);
  sensors.begin();//溫度傳感器初始化
}

void loop() {
  Serial.print("Requesting Temperatures from sensors: ");
  sensors.requestTemperatures();
  Serial.println("DONE");
  temperature = sensors.getTempCByIndex(0);

  digitalWrite(redLedPin, LOW);
  digitalWrite(greenLedPin, LOW);
  digitalWrite(blueLedPin, LOW);

  Serial.print("Temperature is ");
  Serial.print(temperature);

  //設置LED作爲輸出
  if (temperature <= lowerLimit) {
    Serial.println(", blue LED is Activated");
    digitalWrite(blueLedPin, HIGH);
  }
  else if (temperature > lowerLimit && temperature < higherLimit) {
    Serial.println(", Green LED is Activated");
    digitalWrite(greenLedPin, HIGH);
  }
  else if (temperature >= higherLimit) {
    Serial.println(", Red LED is Activated");
    digitalWrite(redLedPin, HIGH);
  }
  delay(2000);
}

  

實驗串口返回情況

 

(2)實驗場景圖
溫度下限爲25度,上限爲27度
低於下限的溫度值都會觸發藍色LED燈亮起

 

高於上限的變量都會觸發紅色LED燈亮起

 

介於兩者之間的變量都將打開綠色LED燈

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章