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 ( 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é.

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ỉ

Trả lời

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 *