Yeh,有溫度值了!
小卒過河,過了第一階段,也獲得了溫度值,下一階段的目標是透過CRC驗證碼來確認所獲取的資料是正確無誤的,此階段只有兩個步驟,第一步驟就是獲取暫存器之資料值,第二步驟是計算暫存器資料並驗證CRC碼。
第一步驟簡單,就是將資料依序讀出,再依序放入資料陣列中既可。第二步驟就有點煩,但不難,且容後再詳述。
此篇就針對暫存器讀取的部份作說明。
暫存器上架程式架構
下圖就是圖示:讀取DS18B20暫存器內的資料,並上架(Shelve)到Arduino的流程及程式,依序將9筆資料(byte)讀入,並放入暫存器陣列中,以待其他副程式使用。獲取溫度及列印暫存器資料程式架構
程式碼及其輸出
此處只列出新增的輸出程式碼的部份,完整的程式碼,會於下一篇的CRC驗證是詳列,此篇的重點是各位可以印證實際測量之值與Datasheet中的資料是否相符合。程式碼
const uint8_t g_dq_pin =7; //Arduino數位腳位7接到DS18B20
uint8_t scratchpad[9];
#define Skip_ROM 0xcc //用於1對1時,省略每次作ROM序號確認程序
#define Convert_T 0x44 //啟動溫度轉換
#define Read_Scratchpad 0xbe //讀取暫存器值,有9個字元
void setup() {
Serial.begin(9600);
Serial.println("<>");
}
void loop() {
Serial.print("DS18b20's Temperature ->");
Serial.println(getTempC());
PrintScratchpad();
delay(3000);
}
void ShelveData() {
for(int i = 0; i < 9; ++i)
{
scratchpad[i]=ReadByte();
}
}void PrintScratchpad() {
Serial.println("");
Serial.println("DS18b20's scratchpad Data ->");
Serial.print("LSB -> 0x");
Serial.print(scratchpad[0],HEX);
Serial.println("");
Serial.print("MSB -> 0x");
Serial.print(scratchpad[1],HEX);
Serial.println("");
Serial.print("TH REGISTER -> 0x");
Serial.print(scratchpad[2],HEX);
Serial.println("");
Serial.print("TL REGISTER -> 0x");
Serial.print(scratchpad[3],HEX);
Serial.println("");
Serial.print("Configuration Register -> 0x");
Serial.print(scratchpad[4],HEX);
Serial.println("");
for(int i = 5; i < 8; ++i)
{
Serial.print("RESERVED ");
Serial.print(i-4);
Serial.print(" -> 0x");
Serial.print(scratchpad[i],HEX);
Serial.println("");
}
Serial.print("CRC -> 0x");
Serial.print(scratchpad[8],HEX);
Serial.println("");
Serial.println("");
}
輸出結果
輸出解析-精密度
在Datasheet中關於解析度的資料是存放於暫存器的第四位元,由R1(bit 6)及R0(bit 5)兩個位元值來顯示,bit 7值應為"0",若為"1"就代表為測試模式,一般出廠時其位元值是設定為"0"。其他低五位(bit0~bit4)通常為1,可以不用去理它。我們讀取到暫存器中的第四個位元值(byte)為0x3F(二進位為"00111111"),R1="0",R0="1"代表著此顆DS18B20目前設置的精確度為10位元。
結語
讀取暫存器的資料算是簡單的步驟,但卻是不可或缺,同時可以提供你對於掌握手中DS18B20的特性及處理有一精確的掌握。有了暫存器資料,下一步,我們就可以來作CRC檢驗了!
沒有留言:
張貼留言