
這可能是最簡單的STM32項目了,整個BOM只有DS18B20溫度傳感器、STM32藍丸板和一個最平常的4.7k電阻器,外加一款面包板和幾根杜邦線。也許有人說這簡直就是浪費STM32資源,我說這是入門磚,了解了基本原理后面就是繽紛世界。
DS18B20智能型防水溫度傳感器
DS18B20是一款智能型防水溫度傳感器,用于測量-55 to 125°C之間液體溫度。由于每個DS18B20包含一個獨立IP序列號,多個DS18B20可共用同一條1-Wire總線。
DS18B20可以分別在93.75ms和750ms內完成9位和12位的數字量,信息讀出或寫入僅需要一根口線(單線接口)讀寫,溫度變換功率來源于數據總線,總線本身也可以向所掛接的DS18B20供電,而無需額外電源。
DS18B20傳感器帶有電纜和防水功能,可用來方便的測量潮濕環境,即使遠距離測量也不會導致信號衰減,測量精度可達±0.5°C。DS18B20集成有12 bits ADC,可通過一個簡單的數字引腳與任何MCU接口。

DS18B20傳感器的不足之處是采用的Dallas 1-Wire協議有些復雜,需要較多代碼才能通信。使用中,還要采用一個4.7k電阻器從VCC對數據進行上拉。
DS18B20與STM32F103C接口
DS18B20與STM32F103C藍丸板的接口電路很簡單,傳感器由STM32藍丸的3.3V引腳供電,GND引腳與藍丸GND連接。數字引腳經過4.7K電阻器上拉后,連接于藍丸板的PA8引腳。

DS18B20數字溫度計提供9-12位(可編程設備溫度讀數)。由于DS18B20是單線通信,與STM32F103C MCU連接只有一條線,讀寫以及溫度轉換所需能量也可以從數據線本身獲得。

DS18B20 -STM32代碼
讓STM32藍丸板讀取DS18B20感測的溫度信息,可以各種方法上傳如下代碼,例如使用USB-TTL轉換器模塊以串口上傳。
int DSPIN = PA8;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
}
void loop()
{
// put your main code here, to run repeatedly:
double temp = TempRead();
temp = temp * 0.0625; // conversion accuracy is 0.0625 / LSB
Serial.print("Temperature: ");
Serial.print(temp);
Serial.println(" °C");
Serial.println("");
delay(500);
}
boolean DS18B20_Init()
{
pinMode(DSPIN, OUTPUT);
digitalWrite(DSPIN, HIGH);
delayMicroseconds(5);
digitalWrite(DSPIN, LOW);
delayMicroseconds(750);//480-960
digitalWrite(DSPIN, HIGH);
pinMode(DSPIN, INPUT);
int t = 0;
while (digitalRead(DSPIN))
{
t++;
if (t > 60) return false;
delayMicroseconds(1);
}
t = 480 - t;
pinMode(DSPIN, OUTPUT);
delayMicroseconds(t);
digitalWrite(DSPIN, HIGH);
return true;
}
void DS18B20_Write(byte data)
{
pinMode(DSPIN, OUTPUT);
for (int i = 0; i < 8; i++)
{
digitalWrite(DSPIN, LOW);
delayMicroseconds(10);
if (data & 1) digitalWrite(DSPIN, HIGH);
else digitalWrite(DSPIN, LOW);
data >>= 1;
delayMicroseconds(50);
digitalWrite(DSPIN, HIGH);
}
}
byte DS18B20_Read()
{
pinMode(DSPIN, OUTPUT);
digitalWrite(DSPIN, HIGH);
delayMicroseconds(2);
byte data = 0;
for (int i = 0; i < 8; i++)
{
digitalWrite(DSPIN, LOW);
delayMicroseconds(1);
digitalWrite(DSPIN, HIGH);
pinMode(DSPIN, INPUT);
delayMicroseconds(5);
data >>= 1;
if (digitalRead(DSPIN)) data |= 0x80;
delayMicroseconds(55);
pinMode(DSPIN, OUTPUT);
digitalWrite(DSPIN, HIGH);
}
return data;
}
int TempRead()
{
if (!DS18B20_Init()) return 0;
DS18B20_Write (0xCC); // Send skip ROM command
DS18B20_Write (0x44); // Send reading start conversion command
if (!DS18B20_Init()) return 0;
DS18B20_Write (0xCC); // Send skip ROM command
DS18B20_Write (0xBE); // Read the register, a total of nine bytes, the first two bytes are the conversion value
int temp = DS18B20_Read (); // Low byte
temp |= DS18B20_Read () << 8; // High byte
return temp;
}

上述代碼上傳后,Serial Monitor就開始顯示被測環境的的溫度數值。
