Interfacing DS18B20 Temperature Sensor with STM32
Giao diện cảm biến nhiệt độ DS18B20 với STM32
Tổng quát
Trong bài này, chúng ta sẽ tìm hiểu Giao diện của Cảm biến nhiệt độ DS18B20 với Vi điều khiển STM32. Thư viện Arduino Dallas & Thư viện OneWire không được hỗ trợ bởi DS18B20. Đây là lý do tại sao chúng ta phải viết mã mà không sử dụng thư viện. Mã DS18B20 cho STM32F103C hơi dài và phức tạp vì không có sự tham gia của thư viện và tất cả các chế độ địa chỉ được xác định trong mã.
DS18B20 là cảm biến chống thấm một dây được sử dụng để đo nhiệt độ của chất lỏng trong khoảng -55 đến 125 ° C. Nguồn để đọc, ghi và thực hiện chuyển đổi nhiệt độ có thể được lấy từ chính đường dữ liệu mà không cần nguồn điện bên ngoài. Vì mỗi DS18B20 chứa một số sê-ri silicon duy nhất, nhiều DS18B20 có thể tồn tại trên cùng một bus 1 dây.
Cảm biến nhiệt độ kỹ thuật số không thấm nước DS18B20
Đây là phiên bản có dây và chống thấm nước của cảm biến DS18B20. Tiện dụng khi bạn cần đo thứ gì đó ở xa, hoặc trong điều kiện ẩm ướt. Cảm biến có thể đo nhiệt độ trong khoảng -55 đến 125 ° C (-67 ° F đến + 257 ° F). Cáp được bọc bằng PVC.
Bởi vì nó là kỹ thuật số, không có sự suy giảm tín hiệu ngay cả trong khoảng cách xa. Các cảm biến nhiệt độ kỹ thuật số 1 dây này khá chính xác, tức là ± 0,5 ° C trong nhiều phạm vi. Nó có thể cung cấp độ chính xác lên đến 12 bit từ bộ chuyển đổi kỹ thuật số sang tương tự trên bo mạch. Chúng hoạt động hiệu quả với bất kỳ bộ vi điều khiển nào sử dụng một chân kỹ thuật số duy nhất.
Nhược điểm duy nhất là chúng sử dụng giao thức Dallas 1-Wire, giao thức này hơi phức tạp và yêu cầu một loạt mã để phân tích cú pháp giao tiếp. Chúng tôi đưa vào một điện trở 4,7k, được yêu cầu như một sự kéo lên từ DATA đến dòng VCC khi sử dụng cảm biến.
Để tìm hiểu thêm về cảm biến này, bạn có thể xem qua Bảng dữ liệu cảm biến DS18B20.
Interfacing DS18B20 Temperature Sensor with STM32
Cảm biến được cấp nguồn bởi chân 3.3V của STM32 & GND được kết nối với GND. Tương tự, Pin kỹ thuật số được kết nối với PA8 của Bluepill. Chân kỹ thuật số được kéo qua Điện trở 4,7K.
DS18B20 STM32 Code
Tải mã sau lên Bảng STM32F103C để đọc nhiệt độ mà DS18B20 cảm nhận được. Bạn có thể sử dụng bất kỳ phương pháp nào để tải mã lên. Tôi đã sử dụng phương pháp Nối tiếp và tải lên mã bằng Mô-đun chuyển đổi 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;
}
Sau khi mã được tải lên, hãy mở Serial Monitor. Màn hình nối tiếp sẽ bắt đầu hiển thị Nhiệt độ phòng ngay lập tức.