2017年12月30日 星期六

DS18B20-讀取溫度值【準備篇】

恭禧!過了淺水區!

恭禧各位!已經過了淺水區,並撰寫了使用DS18B20最基礎的三項工具程式:重啟程序、寫位元及讀位元程式。

接下來,只要將它們作加強及掌握DS18B20的使用命令、程序、溫度值位置及溫度值轉換後,既可取得DS18B20的溫度值喲!

本篇文章,就是講述溫度值的讀取程序架構,並將所使用的三個主要工具(重啟、命令、讀取)的相應關係及其功能作一說明,並對於讀取、命令的工具程式作必要說明,這樣就完成了讀取DS18B20溫度值的熱身運動了!

讀取溫度值的程序架構

底下這圖就是讀取DS18B20的程序架構圖,請參考!
讀取程序的細部會於後面說明,此架構主要是標明其使用的三項工具的使用順序,以三個顏色區分:
1、重啟程序(綠色):Arduino將電位拉低並維持480μs,DS18B20應簽低電位值既代表重啟程序OK。

2、命令程序(藍色):命令拆解成為位元,再使用寫位元(Write bit)程序使用DS18B20

3、讀取程序(黃色):讀取DS18B20給予之位元值,並組合成一字元(Byte)

此三項程序於前面都有講述,其中,重啟程序已OK!但命令及讀取程序部份需由再作補充說明,故列舉於下!

命令工具:從寫位元(bit)到下命令

 在讀取程式架構中,會使用到的命令主要有三個:省略ROM確認(0xcc)、啟動溫度轉換(0x44)及讀取暫存器資料(0xbe)等。

似乎有點難,但其實就是將十六進位的命令值拆解成8個二進位位元值,再依序給予(Write)DS18B20既可,底下會以省略ROM確認命令(0xcc)說明之。

程式架構

"省略ROM確認"命令的使用必須是Arduino與DS18B20在一對一的狀況,等同於生活中的一對一相親,所以不用使用一對多的狀況,必須別名牌或是編號以作區別。

其命令值以十六進位表示就是0xcc,在二進位的表示為[11001100],而程式的架構就是將指令(instruction)分八次將位元值傳給DS18B20。簡單的說,就是從低位元起,讀位元值、寫位元(WriteSlot)並重覆8次的動作。


程式碼

void SendCommand(uint8_t instruction)
{
 for(uint8_t i = 0; i < 8; i++) {
  WriteSolt(bitRead(instruction, i));
 }
}

void WriteSolt(uint8_t order_bit)
{
 if(order_bit) {        //當值為1時的處理,
  pinMode(g_dq_pin, OUTPUT);      //先將pin腳改為輸出狀態
  digitalWrite(g_dq_pin, LOW);    //將電位拉低,等於通知DS18B20要do something
  delayMicroseconds(10);       //至少要等待1us,但於15us前轉為高電位
  pinMode(g_dq_pin, INPUT);     //將接收轉成INPUT狀態,轉為高電位
  delayMicroseconds(60);      //加前段的延時至少等待60us過此周期
 }
 else {           //當寫入值為'0'時,Tx拉低電位時段60~120us
  pinMode(g_dq_pin, OUTPUT);    //先轉為輸出狀態
  digitalWrite(g_dq_pin, LOW);   //將電位輸出低電位
  delayMicroseconds(65);         //靜靜的等待DS18B20來讀取資料
  pinMode(g_dq_pin, INPUT);      //釋放電位控制轉回輸入狀態
  delayMicroseconds(5);     //等待上拉電阻將電位復位為HIGH
 }
}

讀取資料工具:從讀位元(bit)到讀取字元(Byte)

從讀取溫度值的程式架構中,Arduino進了了重啟、略過ROM序號確認、啟動溫度轉換、等待轉換,再重啟、略過ROM、讀取暫存器資料後,DS18B20已準備好進行資料的交換,此時,讀取資料程序就必須上場了。

程式架構




讀取資料程序的步驟就是先準備一空白字元值(Byte=0),然後從最低位元(bit 0)開始,讀取DS18B20給予的位元值 (1/0),並將其值放入位槽中,並重覆執行到字元結束(bit 7)。

程式說明

程式中除了基礎的迴圈使用外,多了兩個位元命令[bitSet()]及[bitClear()],說明如下:

bitSet(x, n):將字元變數x的第n位元值設置為1

bitClear(x, n):將字元變數x的第n位元值設置為0


※n值-右起第一位為0、第二位為1


程式碼

uint8_t ReceiveData()
{
 uint8_t byte_in=0;
 for(uint8_t i = 0; i < 8; i++)
 {
  //此時所測到的電位,就是此位元的資料
  if(ReadSlot()) {
   //看看此時主機線的電位狀況若為高位,就是1
   bitSet(byte_in, i);     //將byte_in第i個位元值,設置為1
  }
  else {
   bitClear(byte_in, i);   //將byte_in第i個位元值,設置為0
  }
 }
 return (byte_in);
}

uint8_t ReadSlot() {
 delayMicroseconds(1);
 pinMode(g_dq_pin, OUTPUT);       //轉為輸出,可達到高電位
 digitalWrite(g_dq_pin, LOW);   //將電位拉低告訴DS18B20,主機已準備好了
 delayMicroseconds(2);
 pinMode(g_dq_pin, INPUT);    //轉為輸入狀態,同時釋放線路
 delayMicroseconds(10);     //加前面的延時,約於12~13us時取樣
 uint8_t fp=digitalRead(g_dq_pin);
 delayMicroseconds(55);    //加上延時過渡此段作業時間60us
 return fp;
}


 萬事俱備,讀取溫度去!

此篇是熱身準備,將前面的讀、寫位元的基礎工具進化到讀取資料及命令的程序

好了!工具齊全了,下一步驟就是依讀取溫度的步驟組合工具,讀取得溫度值去!

沒有留言:

張貼留言