Trong bài này chúng ta sẽ học cách lạp trình stm32 đọc nhiệt độ với cảm biến DS18b20, đây là một loại cảm biến nhiệt độ rất thông dụng. Độ chính xác khá cao và dải đo rộng. Chuyên dùng trong các sản phẩm đo đạc môi trường.
Bài này nằm trong Serie Học STM32 từ A tới Z
Tổng quan về cảm biến nhiệt độ DS18B20
Cảm biến nhiệt độ DS18B20 dây mềm, là phiên bản chống nước, chống ẩm của Cảm biến nhiệt độ DS18B20. Cảm biến nhiệt độ DS18B20 là cảm biến ( loại digital ) đo nhiệt độ mới của hãng MAXIM với độ phân giải cao ( 12bit ). IC sử dụng giao tiếp 1 dây rất gọn gàng, dễ lập trình. IC còn có chức năng cảnh báo nhiệt độ khi vượt ngưỡng và đặc biệt hơn là có thể cấp nguồn từ chân data ( parasite power ).
Cảm biến nhiệt độ này có thể hoạt động ở 125 độ C nhưng cáp bọc PVC => nên giữ nó dưới 100 độ C. Đây là cảm biến kỹ thuật số, nên không bị suy hao tín hiệu đường dây dài
Thông số của Cảm biến nhiệt độ DS18B20 dây mềm
- Nguồn: 3 – 5.5V
- Dải đo nhiệt độ: -55 đến 125 độ C ( -67 đến 257 độ F)
- Sai số: +- 0.5 độ C khi đo ở dải -10 – 85 độ C
- Độ phân giải: người dùng có thể chọn từ 9 – 12 bits
- Chuẩn giao tiếp: 1-Wire ( 1 dây ).
- Có cảnh báo nhiệt khi vượt ngưỡng cho phép và cấp nguồn từ chân data.
- Thời gian chuyển đổi nhiệt độ tối đa : 750ms ( khi chọn độ phân giải 12bit ).
- Mỗi IC có một mã riêng (lưu trên EEPROM của IC) nên có thể giao tiếp nhiều DS18B20 trên cùng 1 dây
- Ống thép không gỉ (chống ẩm , nước) đường kính 6mm, dài 50mm
- Đường kính đầu dò: 6mm
- Chiều dài dây: 1m
Hướng dẫn điều khiển DS18B20
Download datasheet ds18b20: https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
Chuẩn giao tiếp 1 wire
Tương tự như DHT11, DS18b20 cũng sử dụng chuẩn giao tiếp 1 wire (one wire), chỉ sử dụng một đường data duy nhất. Sử dụng thời gian xung 0 hoặc 1 để định nghĩa các trạng thái. Dưới đây là Timing khởi tạo DS18b20
Tiếp tới là Timing đọc, ghi. Và định nghĩa bit 0, 1 trong 1 wire.
Bản đồ bộ nhớ của DS18B20
Ds18b20 có 8byte bộ nhớ SRAM Scrachpad lưu trữ các dữ liêu nhiệt độ, thanh ghi, và các thiết lập, cụ thể:
Byte 0 và 1: lưu giá trị nhiệt độ đo được
Byte 2, 3 lưu giá trị nhiệt độ TH, TL hoặc giá trị do user ghi vào
Byte 4: lưu các thiết lập
Byte 8: CRC byte kiểm tra lỗi
EEPROM lưu dữ liệu TH TL hoặc dữ liệu của User và 1 thanh ghi thiết lập (configuration).
Thanh ghi configuration có 3 bit R0, R1, R2 điều chỉnh độ phân giải (độ mịn) của nhiệt độ mà DS18b20 đọc được
Chuyển đổi dữ liệu thành giá trị nhiệt độ
DS18b20 có dải đo từ -55 độ tới 125 độ. Tương ứng với bảng nhiệt độ sau, bit S (signal) sẽ cho người dùng biết đó là nhiệt độ âm hay dương.
Lệnh điều khiển DS18B20
Lệnh trong DS18b20 có rất nhiều, chia thành 2 loại chính đó là Temperature command (lệnh đọc nhiệt độ) và Memory command lệnh điều khiển bộ nhớ. Dưới đây là bảng lệnh sử dụng trong ds18b20
Quy trình để đọc nhiệt độ sẽ được triển khai theo flow chart (lưu đồ thuật toán sau)
Để đọc ghi dữ liệu vào ROM, chúng ta có flow chart sau:
Lập trình STM32 với DS18B20
Cấu hình CubeMX
Thiết lập SYS – Debug Serial Wire. Chọn một chân GPIO PB15 là OUPUT, đổi tên thành DS18B20.
Trong tab RCC – chọn Crystal sau đó qua Clock set 72mhz
Trong tab Timer thiết lập như hình để có thể sử dụng delay_us.
Lập trình DS18B20 với KeilC
Download thư viện DS18B20 về qua hướng dẫn ở bài viết: Tài liệu lập trình DS18b20
Thêm đường dẫn thư viện cho Keil C và add gile ds18b20 vào project. Mình đã nói khá nhiều rồi nên không nhắc lại nữa.
Include thư viện vào main.c. Sau đó khởi tạo một biến Struct DS18b20 mang tên DS1.
Trong main chúng ta khởi tạo DS18b20 với các giá trị truyền vào là Timer và GPIO để đọc/ghi dữ liệu vào
Trong while đọc kết quả sử dụng hàm ReadTemp sau đó delay 1 khoảng thời gian giữa các lần đọc
Kết quả
Vào Debug, Add giá trị Temp vào watch t. Sau đó chạy chương trình. Đây là kết quả thu được
Kết
Lập trình STM32 với DS18b20 cũng tương tự với các cảm biến 1 wire khác như DHT11, DHT22,… Chỉ khác đó là DS8b20 có ROM để lưu trữ các giá trị cài đặt và nhiệt độ. Đây là một loại cảm biến có thể sử dụng tốt để đo đạc môi trường, giá thành cũng tương đối hợp lý.
Nếu bạn thấy bài viết này có ích hãy để lại bình luận và đừng quên ra nhập Hội Anh Em Nghiện Lập trình nhé.
Hình như thư viện Ds18b20 không có trên github anh kiểm tra lại xem sao ạ.
a up lại rồi đó
(!(HAL_GPIO_ReadPin (DS18B20_PORT, DS18B20_PIN))) anh ơi cho em hỏi cái dấu phủ định trc hàm HAL_GPIO_ReadPin nghĩa là sao vậy ? em không hiểu lắm
Nếu giá trị đọc được khác 0 đó em
sao em add thư viện vào inc và scr khi em mở keilc lên nó báo lỗi cái file ds18b20.c em add vào vậy ạ
lúc biên dịch thì bị báo lỗi này
“DS18B20\DS18B20.axf: Error: L6218E: Undefined symbol DS18B20_Init (referred from main.o).”
Ad hướng dẫn giúp mình với
Bạn add thư viện vào project chưa?
bị lỗi ngay dòng lệnh này
“DS18B20_Init(&DS1 ,&htim4 ,DS18B20_GPIO_Port,DS18B20_Pin);”
Lỗi gì bạn?
Anh ơi em vào lại không tìm thấy thư viện trong mục STM32_Device_Lib đâu ạ, nêu được anh up lại giúp em với, em cảm ơn ạ.
Ở trang github của anh có hết đó
bị lỗi ngay dòng lệnh này “DS18B20_Init(&DS1 ,&htim4 ,DS18B20_GPIO_Port,DS18B20_Pin);”
lỗi “use of undeclared identifier” của 2 DS18B20_GPIO_Port và DS18B20_Pin. Xử lý ntn vậy anh?
Đổi tên GPIO 5 thành DS18B20 nhé
a ơi e thử đọc nhiệt độ từ 18b20 như bài này như khi muốn hiển thị nó lên lcd 4 bit như bài trước của a thì lại k lên j cả a nhỉ