Lập trình STM32 đọc nhiệt độ với DS18b20 giao tiếp Onewire

stm32 ds18b20

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 nhiệt độ loại digital 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ính chân Data (parasite power).

Cảm biến 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 khi kéo dây xa thì giá trị đo không bị sai lệch do suy hao như các cảm biến analog.

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 bit
  • 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ã ROM 64 bit riêng (được khắc sẵn khi sản xuất), 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

cam bien nhiet do ds18b20

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 giao tiếp qua 1 dây (one wire), chỉ sử dụng một đường Data duy nhất và dùng độ rộng xung mức 0, mức 1 để định nghĩa các trạng thái. Khác với DHT11, DS18B20 dùng đúng chuẩn 1-Wire của Dallas. Dưới đây là Timing khởi tạo DS18B20:

ds18b20 timing init

Tiếp theo là Timing đọc, ghi và định nghĩa bit 0, 1 trong 1 wire.

ds18b20 read write timing

Bản đồ bộ nhớ của DS18B20

DS18B20 có 9 byte bộ nhớ SRAM gọi là Scratchpad, lưu trữ 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 thấp và byte cao)

Byte 2, 3: lưu ngưỡng cảnh báo nhiệt độ TH, TL hoặc giá trị do người dùng ghi vào

Byte 4: thanh ghi cấu hình (Configuration)

Byte 5, 6, 7: dự trữ (Reserved)

Byte 8: byte CRC kiểm tra lỗi

EEPROM lưu dữ liệu TH, TL (hoặc dữ liệu của người dùng) và thanh ghi cấu hình, để giữ lại khi mất điện.

ds18b20 memory map

Thanh ghi Configuration có 2 bit R0, R1 điều chỉnh độ phân giải (độ mịn) của nhiệt độ mà DS18B20 đọc được: 9, 10, 11 hoặc 12 bit. Độ phân giải càng cao thì thời gian chuyển đổi càng lâu (từ 93.75ms ở 9 bit tới 750ms ở 12 bit).

ds18b20 config register

Chuyển đổi dữ liệu thành giá trị nhiệt độ

DS18B20 có dải đo từ -55 độ tới 125 độ. Giá trị nhiệt độ là số 16 bit dạng bù 2, các bit S (Sign) cho biết đó là nhiệt độ âm hay dương. Ở độ phân giải 12 bit, mỗi đơn vị tương ứng 0.0625 độ C, tức là nhiệt độ = giá trị đọc được x 0.0625. Các bạn đối chiếu với bảng sau:

ds18b20 temperature data table

Lệnh điều khiển DS18B20

Lệnh trong DS18B20 có khá nhiều, chia thành 2 nhóm chính: ROM Command (lệnh chọn thiết bị theo mã ROM, ví dụ Skip ROM 0xCC khi chỉ có 1 cảm biến trên dây) và Function Command (lệnh chức năng, gồm lệnh chuyển đổi nhiệt độ như Convert T 0x44 và các lệnh bộ nhớ như Read Scratchpad 0xBE). Dưới đây là bảng lệnh sử dụng trong DS18B20:

ds18b20 command table

Quy trình để đọc nhiệt độ sẽ được triển khai theo flow chart (lưu đồ thuật toán) sau:

ds18b20 command

Để làm việc với các lệnh ROM, chúng ta có flow chart sau:

ds18b20 rom command 1

Lưu ý: Sau lệnh Convert T (0x44), DS18B20 cần tối đa 750ms (ở độ phân giải 12 bit) để đo xong. Nếu đọc Scratchpad ngay lập tức, bạn sẽ nhận về giá trị cũ, hoặc 85°C là giá trị mặc định lúc mới cấp nguồn. Thấy đúng 85°C thì gần như chắc chắn là chưa chờ đủ thời gian chuyển đổi.

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à Output, đổi tên thành DS18B20.

ds18b20 cubemx

Trong tab RCC chọn Crystal/Ceramic Resonator, sau đó qua Clock Configuration đặt 72MHz.

ds18b20 clock

Trong tab Timer thiết lập như hình để có thể sử dụng hàm delay_us.

ds18b20 timer4

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 file 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.

ds18b20 code

Trong main chúng ta khởi tạo DS18B20 với các giá trị truyền vào là Timer và GPIO dùng để đọc/ghi dữ liệu.

ds18b20 code 2

Trong while, đọc kết quả bằng hàm ReadTemp, sau đó delay 1 khoảng thời gian giữa các lần đọc.

Kết nối phần cứng: dây Data (thường màu vàng) nối PB15, dây đỏ nối 3.3V, dây đen nối GND, thêm 1 điện trở 4.7kΩ kéo từ dây Data lên 3.3V. Không có điện trở kéo lên này thì DS18B20 sẽ không phản hồi.

Kết quả

Vào Debug, Add biến Temp vào Watch 1, 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 dựa trên Timing giống như DHT11. Điểm khác là DS18B20 dùng đúng chuẩn 1-Wire, có mã ROM 64 bit riêng nên nhiều cảm biến dùng chung 1 dây được, và có EEPROM để lưu các giá trị cài đặ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 gia nhập Hội Anh Em Nghiện Lập trình nhé.

5/5 - (2 bình chọn)

14 những suy nghĩ trên “Lập trình STM32 đọc nhiệt độ với DS18b20 giao tiếp Onewire”

  1. PHUOC nó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

  2. Nhân Trần nói:

    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

  3. Trần Thành nói:

    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 ạ.

  4. Hoàng Cao nói:

    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?

  5. phong nói:

    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ỉ

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *