Arduino入門筆記(6):溫度傳感器及感溫杯實驗


轉載請注明:@小五義 http://www.cnblogs.com/xiaowuyi

歡迎加入討論群 64770604

一、本次實驗所需器材

1、Arduino板 :https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-15820725129.16.AtgoEm&id=545093340395

2、1602液晶板:http://www.cnblogs.com/xiaowuyi/p/3390024.html(或者http://wikicode.net/?p=232)已經介紹過。

3、DS18b20數字溫度傳感器:多數入門學習時會使用LM35溫度傳感器(該傳感器為模擬信號,需轉換),由於本人在最初購買時沒有注意,直接買了DS18b20,所以就使用了這個傳感器。

(1)實物及管腳排列圖

B5015868341        0c1be3f6229602b8f2d385da

面對平面,左邊為接地,中間DQ為數字信號輸入/輸出端,VDD為外接供電電源輸入端,電源供電 3.0~5.5V (在寄生電源接線方式時接地)。

 

(2)DS18B20的硬件接口非常簡單。供電方式為計生電源供電或外部供電。寄生電源供電(連接方法如下圖)的原理是在數據線為高電平的時候“竊取”數據線的電源,電荷被存儲在寄生供電電容上,用於在數據線為低的時候為設備提供電源。需要注意的是,DS18B20在進行溫度轉換或者將高速緩存里面的數據復制到EEPROM中時,所需的電流會達到1.5mA,超出了電容所能提供的電流,此時可采用一個MOSFET三極管來供電。

114819iy6ou6ejcp6c6jie

當DS18B20采用外部供電時,只需將其數據線,與單片機的一位雙向端口相連就可以實現數據的傳遞。

注意:當溫度高於100℃ 時,不能使用寄生電源,因為此時器件中較大的漏電流會使總線不能可靠檢測高低電平,從而導致數據傳輸誤碼率的增大。

更加詳細的DS18B20介紹,可查閱技術手冊,這里不在詳細記錄。

4、LED:3個

5、電阻:1KΩ(1個) 4.7KΩ(1個)

6、杜邦線:若干

7、面包板:一個

 

 

二、溫度傳感器實驗

1、硬件連接方法

     上節驅動液晶是使用的手工編寫代碼,這次我們直接使用arduino自帶的LiquidCrystal庫來進行驅動,此庫文件允許arduino控制板控制基於Hitachi HD44780或與之相兼容芯片大部分的液晶,可以工作於4bit或者8bit狀態。下圖為我們所使用的arduino的LiquidCrystal庫文件位置,只有這里顯示的庫文件,arduino才可以調用。當然也可以自己導入庫文件。另外,這里需要使用OneWire庫和DallasTemperature庫(讀取相應地址傳感器),這兩個庫需要下載后,自己導入。

2

連接圖為:

18b20

2、代碼

#include <LiquidCrystal.h>
#include <DallasTemperature.h>
#include <OneWire.h>

  #define ONE_WIRE_BUS 8
 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//設置接口
  OneWire oneWire(ONE_WIRE_BUS);
 
  DallasTemperature sensors(&oneWire);
   
  void setup(void)
  {
    lcd.begin(16, 2);  //初始化LCD
    
    delay(1000); //延時1000ms
    sensors.begin();
  }
   
  void loop(void)
  {
    sensors.requestTemperatures(); // Send the command to get temperatures
    lcd.clear(); //清屏
    lcd.setCursor(0,0);
    lcd.print("Local Temperature");
    lcd.setCursor(0, 1) ; //設置光標位置為第二行第一個位置
    lcd.print(" is ");
    lcd.setCursor(5, 1) ;
    lcd.print( sensors.getTempCByIndex(0)); //獲取溫度
  //  delay(1000);
    lcd.print((char)223); //顯示o符號
    lcd.print("C"); //顯示字母C
    delay(1000);
  }

3、實驗效果

從實驗效果來看,溫度顯示正常。

三、簡單感溫杯實驗

       感溫杯可以直觀的知道杯內水溫的高低,當水溫超過一定溫度時,會有相應的燈亮起以提示水溫。結合上面的實驗,只要在上面的電路中加入幾個LED燈用來顯示水溫即可。

1、設計思路

      由於沒有多種顏色的LED燈進行實驗,因此本實驗使用三個LED燈,用亮燈的個數來表示水溫。當水溫高於41度時,三個燈同時亮起,表示溫度過高;當水溫界於31度與40度之間,兩個燈亮起,表示水溫剛好;當水溫低於31底時,一個燈亮起,表示水溫過低。

2、硬件連接圖

tcup_bb

3、代碼

#include <LiquidCrystal.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 8
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//設置接口
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
   
void setup(void)
  {
    pinMode(6,OUTPUT);
    pinMode(7,OUTPUT);
    pinMode(9,OUTPUT);
    lcd.begin(16, 2);  //初始化LCD
    delay(1000); //延時1000ms
    sensors.begin();
  }
   
  void loop(void)
  {
    sensors.requestTemperatures();
    if (sensors.getTempCByIndex(0)<=31.00)
    {
     digitalWrite(6,HIGH);
     digitalWrite(7,LOW);
     digitalWrite(9,LOW);
    }
    else if (sensors.getTempCByIndex(0)>31.00 && sensors.getTempCByIndex(0)<=41.00)
    {
     digitalWrite(6,HIGH);
     digitalWrite(7,HIGH);
     digitalWrite(9,LOW);
    }
    else
    {
     digitalWrite(6,HIGH);
     digitalWrite(7,HIGH);
     digitalWrite(9,HIGH);        
    }
    
    lcd.clear(); //清屏
    lcd.setCursor(0,0);
    lcd.print("Local Temperature");
    lcd.setCursor(0, 1) ; //設置光標位置為第二行第一個位置
    lcd.print(" is ");
    lcd.setCursor(5, 1) ;
    lcd.print( sensors.getTempCByIndex(0)); //顯示溫度小數點后一位
  //  delay(1000);
    lcd.print((char)223); //顯示o符號
    lcd.print("C"); //顯示字母C
    delay(2000);
    
  }

4、實驗效果

從實驗效果來看,當把傳感器放入水杯后,溫度上升,從開始亮一個燈,到亮三個燈。當傳感器從水杯中取出后,溫度開始下降,從亮三個燈到亮一個燈,由於本人視頻錄制水平有限,所以在錄制過程中效果體現的不是很明顯。

從效果看,還存在一個問題,就是溫度上升和下降的速度比較慢,如何能上其瞬間測量出實際溫度,還沒想清楚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM