這可能是最簡單的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就開始顯示被測環境的的溫度數值。
?
評論
查看更多