恭禧!過了淺水區!
恭禧各位!已經過了淺水區,並撰寫了使用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;
}
萬事俱備,讀取溫度去!
此篇是熱身準備,將前面的讀、寫位元的基礎工具進化到讀取資料及命令的程序好了!工具齊全了,下一步驟就是依讀取溫度的步驟組合工具,讀取得溫度值去!