Nó hoạt động dựa trên nguyên lý đo lường nhiệt độ của môi trường xung quanh và chuyển đổi trực tiếp giá trị đó thành một chuỗi dữ liệu số digital word, loại bỏ hoàn toàn sự cần thiết của
Trang 1ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
BÁO CÁO GIỮA KỲ
TÌM HIỀU MODULE CẢM BIẾN NHIỆT ĐỘ DS18B20 VÀ VIẾT THƯ VIỆN ĐIỀU KHIỂN
Môn học: LẬP TRÌNH NÂNG CAO ỨNG DỤNG TRONG ĐO LƯỜNG ĐIỀU KHIỂN
Mã lớp học phần:
Giảng viên: Đỗ Trần Thắng
Sinh viên thực hiện: - Trần Minh Tuấn MSV: 22026111
- Nguyễn Anh Tuấn MSV: 22026113
Hà Nội, tháng 4, năm 2025
Trang 2A GIỚI THIỆU CHUNG VỀ MODULE CẢM BIẾN DS18B20
I TỔNG QUAN VỀ MODULE CẢM BIẾN DS18B20
1 Định nghĩa
- DS18B20 là một vi mạch cảm biến nhiệt độ kỹ thuật số chính xác cao, được thiết kế bởi Dallas Semiconductor (nay thuộc Maxim Integrated/Analog Devices) Nó hoạt động dựa trên nguyên lý đo lường nhiệt độ của môi trường xung quanh và chuyển đổi trực tiếp giá trị đó thành một chuỗi dữ liệu số (digital word), loại bỏ hoàn toàn sự cần thiết của bộ chuyển đổi Analog-to-Digital (ADC) bên ngoài và giảm thiểu ảnh hưởng của nhiễu điện từ thường gặp ở các cảm biến analog Vi mạch này được chế tạo trên một đế silicon duy nhất, tích hợp đầy đủ các khối chức năng cần thiết cho việc đo lường và giao tiếp.
- Điểm cốt lõi và tạo nên sự khác biệt của DS18B20 là việc triển khai giao thức giao tiếp nối tiếp 1-Wire® Giao thức này cho phép vi điều khiển (master) giao tiếp với một hoặc nhiều cảm biến DS18B20 (slaves) chỉ thông qua một đường tín hiệu dữ liệu (DQ) duy nhất, cùng với một đường nối đất chung (GND) Điều này giúp đơn giản hóa đáng kể việc đi dây, tiết kiệm chân GPIO trên vi điều khiển và giảm chi phí lắp đặt, đặc biệt hiệu quả trong các ứng dụng đòi hỏi triển khai mạng lưới cảm biến phân tán trên một khu vực rộng hoặc trong không gian hẹp.
- Để quản lý hiệu quả nhiều thiết bị trên cùng một bus 1-Wire, mỗi cảm biến DS18B20 được nhà sản xuất khắc sẵn một mã định danh duy nhất toàn cầu gồm 64-bit (64-bit ROM code) trong bộ nhớ chỉ đọc (ROM) của
nó Mã này bao gồm mã họ sản phẩm (Family Code, 0x28 cho DS18B20),
Trang 348-bit số serial duy nhất và 8-bit mã kiểm tra lỗi CRC Vi điều khiển sử dụng mã ROM này để định danh, gửi lệnh và nhận dữ liệu từ từng cảm biến cụ thể một cách độc lập, ngay cả khi chúng được mắc song song trên cùng một dây dẫn.
- Về khả năng đo lường, DS18B20 có thể hoạt động trong dải nhiệt độ rộng từ -55°C đến +125°C (tương đương -67°F đến +257°F) Nó cung cấp
độ chính xác khá cao, điển hình là ±0.5°C trong khoảng nhiệt độ từ -10°C đến +85°C Một tính năng quan trọng khác là khả năng cấu hình độ phân giải nhiệt độ thông qua thanh ghi cấu hình (Configuration Register) lưu trong bộ nhớ tạm (Scratchpad) Người dùng có thể chọn độ phân giải là 9,
10, 11, hoặc 12 bit, tương ứng với các bước nhảy nhiệt độ nhỏ nhất là 0.5°C, 0.25°C, 0.125°C, và 0.0625°C Việc lựa chọn độ phân giải thấp hơn
sẽ cho thời gian chuyển đổi nhiệt độ nhanh hơn, trong khi độ phân giải cao hơn (mặc định là 12 bit) cho kết quả mịn hơn nhưng cần thời gian chuyển đổi lâu hơn (lên đến 750ms).
- Ngoài ra, DS18B20 hỗ trợ chế độ cấp nguồn ký sinh (parasitic power), cho phép cảm biến lấy năng lượng hoạt động trực tiếp từ đường tín hiệu
dữ liệu DQ khi tín hiệu ở mức cao, thông qua một tụ điện nội Điều này rất hữu ích trong các ứng dụng chỉ có hai dây (DQ và GND) Tuy nhiên, chế
độ này đòi hỏi một mạch kéo lên (pull-up) đủ mạnh trên đường DQ, đặc biệt là trong quá trình chuyển đổi nhiệt độ khi dòng tiêu thụ tăng lên Cảm biến cũng tích hợp các thanh ghi cảnh báo nhiệt độ cao (TH) và thấp (TL)
có thể lập trình và lưu vào bộ nhớ EEPROM không bay hơi, cho phép thiết
bị tự phát hiện và báo hiệu khi nhiệt độ vượt ngưỡng cài đặt mà không cần
sự thăm dò liên tục từ vi điều khiển.
Trang 4Tóm lại, DS18B20 là một giải pháp cảm biến nhiệt độ số mạnh mẽ, linh hoạt
và tiết kiệm chi phí, kết hợp độ chính xác tốt, khả năng cấu hình linh hoạt và
ưu điểm độc đáo của giao thức 1-Wire, làm cho nó trở thành lựa chọn hàng đầu trong vô số ứng dụng từ công nghiệp, tiêu dùng, nông nghiệp thông minh đến các hệ thống IoT và WSN phức tạp.
Hình 1: Module cảm biến nhiệt độ DS18B20
2 Tầm quan trọng và ứng dụng của module cảm biến DS18B20
a) Công nghiệp và Tự động hóa:
- Giám sát nhiệt độ hệ thống làm mát: Đo nhiệt độ nước làm mát vào/ra khỏi
lò, hoặc nhiệt độ không khí làm mát cho các thiết bị phụ trợ xung quanh lò.
- Giám sát nhiệt độ vỏ lò hoặc lớp cách nhiệt: Đo nhiệt độ bề mặt bên ngoài của lò để đánh giá hiệu quả của lớp cách nhiệt hoặc phát hiện các điểm nóng bất thường (nếu nhiệt độ bề mặt nằm trong phạm vi < 125°C).
Trang 5- Theo dõi nhiệt độ các bộ phận phụ trợ: Đo nhiệt độ của động cơ quạt, hộp điều khiển, tủ điện nằm gần khu vực lò để đảm bảo chúng không bị quá nhiệt
do ảnh hưởng từ lò.
- Giám sát nhiệt độ ở các giai đoạn nhiệt độ thấp hơn: Trong một số quy trình
có nhiều giai đoạn, có thể có các vùng sấy sơ bộ hoặc làm nguội sau khi ra khỏi lò có nhiệt độ nằm trong phạm vi hoạt động của DS18B20.
- Đo nhiệt độ môi trường xung quanh khu vực lò: Giám sát nhiệt độ không khí tại nơi làm việc gần lò để đảm bảo an toàn lao động hoặc kiểm soát môi trường.
Hình 2: Hệ thống giám sát nhiệt độ đường ống sử dụng DS18B20
b) Nông nghiệp & Môi trường:
- Giám sát nhiệt độ đất: Đo nhiệt độ ở các độ sâu khác nhau để tối ưu hóa thời điểm gieo trồng, lịch trình tưới tiêu và quản lý canh tác chính xác.
- Kiểm soát khí hậu nhà kính: Duy trì nhiệt độ không khí ổn định và phù hợp cho từng loại cây trồng, giúp tăng năng suất và chất lượng nông sản.
Trang 6- Theo dõi nhiệt độ nước: Giám sát nhiệt độ trong ao hồ, sông suối (nghiên cứu môi trường) hoặc bể nuôi trồng thủy sản (đảm bảo điều kiện sống tối ưu).
- Thu thập dữ liệu thời tiết/khí hậu: Đo nhiệt độ không khí làm thành phần cốt lõi trong các trạm thời tiết tự động hoặc các mạng lưới cảm biến giám sát môi trường.
Hình 3: Đầu dò nhiệt độ đất DS18B20 nông nghiệp c) Giám sát Y tế và Sinh học:
- Giám sát Tủ lạnh/Tủ đông Vắc-xin & Dược phẩm: Theo dõi và ghi lại liên tục nhiệt độ bên trong tủ bảo quản, đảm bảo vắc-xin và các loại thuốc nhạy cảm với nhiệt độ luôn được giữ trong dải nhiệt độ cực kỳ nghiêm ngặt (ví dụ: 2°C - 8°C hoặc đông lạnh) để duy trì hiệu lực và an toàn
- Theo dõi Nhiệt độ Lưu trữ Mẫu Sinh học: Giám sát nhiệt độ ổn định và chính xác trong các tủ lạnh, tủ đông sâu (-20°C, -80°C nếu dùng đầu dò đặc
Trang 7biệt hoặc đo gián tiếp qua môi trường làm lạnh trong giới hạn) chứa các mẫu máu, mô, tế bào, ADN phục vụ cho nghiên cứu, chẩn đoán hoặc lưu trữ dài hạn, ngăn ngừa sự hư hỏng hoặc biến tính mẫu do thay đổi nhiệt độ.
- Kiểm soát Nhiệt độ Tủ ấm & Bể điều nhiệt (Water Bath): Duy trì chính xác
và ổn định nhiệt độ bên trong các tủ ấm dùng để nuôi cấy vi sinh, tế bào hoặc các bể điều nhiệt sử dụng trong phòng thí nghiệm, đảm bảo điều kiện tối ưu
và lặp lại được cho các thí nghiệm sinh học, hóa sinh.
- Giám sát nhiệt độ trong quá trình vận chuyển Mẫu/Dược phẩm nhạy cảm:
Sử dụng các bộ ghi dữ liệu (data logger) di động tích hợp DS18B20 để theo dõi và ghi lại lịch sử nhiệt độ trong các thùng chứa chuyên dụng khi vận chuyển vắc-xin, mẫu xét nghiệm, đảm bảo chúng không bị phơi nhiễm với nhiệt độ không phù hợp trong suốt hành trình.
Hình 4: Bộ giám sát nhiệt độ tủ lạnh bảo quản vac-xin
Trang 8II Thông số kĩ thuật
1 Thông số tổng quát
- Chức năng: Nhiệt kế kỹ thuật số 1-Wire có độ phân giải lập trình được (Programmable Resolution 1-Wire Digital Thermometer)
- Dải điện áp hoạt động (VDD): 3.0V đến 5.5V
- Dải nhiệt độ hoạt động: -55°C đến +125°C (-67°F đến +257°F)
- Độ chính xác: ±0.5°C trong khoảng từ -10°C đến +85°C
- Độ phân giải: Người dùng có thể lựa chọn từ 9 đến 12 Bits
- Thời gian chuyển đổi: Chuyển đổi nhiệt độ thành từ kỹ thuật số 12-Bit trong tối đa 750ms
- Giao thức truyền thông: Giao diện 1-Wire® độc đáo, chỉ yêu cầu một chân port cho giao tiếp
- Định danh duy nhất: Mỗi thiết bị có một mã sê-ri 64-Bit duy nhất được lưu trữ trong ROM trên chip
- Khả năng Multidrop: Đơn giản hóa các ứng dụng cảm biến nhiệt độ phân tán
- Thành phần bên ngoài: Không yêu cầu thành phần bên ngoài (ngoại trừ điện trở kéo lên cho bus 1-Wire)
- Chế độ cấp nguồn: Có thể được cấp nguồn từ đường dữ liệu ("nguồn ký sinh" - parasitepower) hoặc nguồn ngoài qua chân VDD
- Tính năng cảnh báo: Cài đặt cảnh báo nhiệt độ cao/thấp không bay hơi (NV) do người dùng định nghĩa; Lệnh Tìm kiếm Cảnh báo (Alarm Search) xác định các thiết bị có nhiệt
độ ngoài ngưỡng
- Dạng đóng gói: 8-Pin SO (150 mils), 8-Pin µSOP, và 3-Pin TO-92
Trang 92 Thông số Bộ nhớ, Thanh ghi và Chức năng
a) Sơ đồ khối và Mô tả Chân (Pin)
Hình 5: Sơ đồ khối và Mô tả Chân (Pin)
Mô tả chân (Pin Description):
Chân Vào/Ra giữ liệu (Data Input/Output).
Là chân giao diện 1 – Wire dạng cực máng hở (open-drain) Cũng cung cấp nguồn cho thiết
bị khi dùng chế độ nguồn ký sinh
Trang 10Giải thích về nguồn ký sinh:
- Định nghĩa Nguồn Ký sinh (Parasite Power):
Đây là một tính năng của hầu hết các thiết bị 1-Wire (bao gồm cả DS18B20), cho phép chúng lấy nguồn điện hoạt động trực tiếp từ đường truyền dữ liệu (data line -chân DQ)
Điều này rất lý tưởng cho các ứng dụng cảm biến nhiệt độ từ xa (như đầu dò - probe) hoặc những nơi có không gian hạn chế, khó khăn trong việc cấp một nguồnđiện cục bộ riêng biệt
- Thách thức khi dùng Nguồn Ký sinh với DS18B20/DS18S20/DS1822 thông thường:
Để các phiên bản cảm biến nhiệt độ 1-Wire thông thường (DS18B20, DS18S20, DS1822) hoạt động ở chế độ nguồn ký sinh, chân VDD của chúng bắt buộc phải được nối với chân GND (đất)
Việc nối VDD với GND này rất đơn giản nếu cảm biến được gắn trực tiếp trên mạch in (PCB)
Tuy nhiên, trong các ứng dụng mà cảm biến đặt ở xa vi điều khiển (ví dụ trong một đầu dò nhiệt độ), việc kết nối này trở nên bất tiện về mặt cơ khí:
o Cách 1 (Hình 1): Phải chạy 3 dây đến cảm biến: DQ, GND, và một dây VDD riêng chỉ để nối dây VDD này với GND tại bo mạch chính Cách này làm tăng chi phí dây dẫn, đặc biệt với khoảng cách xa
o Cách 2 (Hình 2): Phải thực hiện một mối nối cục bộ ngay tại cảm biến để nối chân VDD với chân GND Cách này khá bất tiện và khó thực hiện về mặt cơ khí
- Ưu điểm của dòng "-PAR" (DS18B20-PAR, DS18S20-PAR, DS1822-PAR):
Trang 11 Để giải quyết vấn đề trên, Dallas (nay là Analog Devices) đã tạo ra các phiên bản
"-PAR"
Các thiết bị "-PAR" này giống hệt các phiên bản thường ngoại trừ một điểm quan trọng: chân VDD đã được nối với chân GND ngay bên trong con chip (như Hình 3)
Do đó, khi sử dụng các cảm biến dòng "-PAR", bạn không cần phải thực hiện kết nối VDD với GND bên ngoài nữa
Điều này giúp đơn giản hóa tối đa việc triển khai nguồn ký sinh cho các cảm biến
từ xa, chỉ cần sử dụng 2 dây (DQ và GND) mà không cần thêm dây VDD hay mốinối phụ tại cảm biến (như Hình 4)
Lưu ý quan trọng:
Do dòng rò ở chân DQ tăng lên ở nhiệt độ cao, các thiết bị dòng "-PAR" (cũng như các thiết bị thường khi chạy ở chế độ nguồn ký sinh) có nhiệt độ hoạt động tối đa bị giới hạn ở +100°C
b) Mã ROM 64-bit:
Hình 6: Mã ROM 64-bit
Mã ROM 64-bit (64-Bit Lasered ROM Code - Tham khảo Hình 6)
Mỗi vi mạch cảm biến DS18B20 đều chứa một mã định danh 64-bit duy nhất và không thể thay đổi, được khắc bằng laser vào bộ nhớ ROM (Read-Only Memory) trong quá trình sản xuất tại nhà máy Mã này đóng vai trò như một số sê-ri điện tử vĩnh viễn cho từng con chip Đây là nền tảng cho khả năng giao tiếp và định địa chỉ trên bus 1-Wire.Cấu trúc chi tiết của Mã ROM 64-bit:
Trang 12- 8 bit có trọng số thấp nhất (LSb - Least Significant bits - Byte 0): Mã Họ Sản phẩm 1-Wire (1-Wire Family Code)
o Đây là một mã 8-bit xác định loại thiết bị trong hệ sinh thái 1-Wire rộng lớn của Maxim Integrated
o Đối với DS18B20, mã họ sản phẩm này luôn là 28h (hệ thập lục phân) Khi
vi điều khiển đọc được mã này, nó biết rằng thiết bị phản hồi là một cảm biến DS18B20 Các thiết bị 1-Wire khác sẽ có mã họ sản phẩm khác
- 48 bit tiếp theo (Byte 1 đến Byte 6): Số Sê-ri Duy nhất (Unique Serial Number)
o Đây là một số 48-bit được nhà sản xuất gán riêng cho từng con chip
DS18B20 Không có hai chip DS18B20 nào trên thế giới có cùng số sê-ri này
o Không gian địa chỉ 48-bit này cực kỳ lớn (248 địa chỉ khác nhau), đảm bảo khả năng định danh duy nhất cho một số lượng khổng lồ các thiết bị
o Chính nhờ số sê-ri duy nhất này mà vi điều khiển có thể phân biệt và chọn lựa (định địa chỉ) một cảm biến cụ thể để giao tiếp, ngay cả khi có hàng trăm hoặc hàng nghìn cảm biến được kết nối trên cùng một đường bus dữ liệu
- 8 bit có trọng số cao nhất (MSb - Most Significant bits - Byte 7): Byte Kiểm tra Lỗi Vòng CRC (Cyclic Redundancy Check)
o Byte này chứa giá trị CRC 8-bit được tính toán từ 56 bit đầu tiên của mã ROM (tức là từ Mã Họ Sản phẩm và Số Sê-ri)
o Mục đích: Đảm bảo tính toàn vẹn của dữ liệu khi mã ROM được đọc bởi vi điều khiển Trong quá trình khởi tạo hoặc tìm kiếm thiết bị (Search ROM),
vi điều khiển sẽ đọc 64 bit này Sau đó, vi điều khiển có thể tự tính toán lại giá trị CRC dựa trên 56 bit đầu tiên nhận được và so sánh kết quả với 8 bit CRC (byte thứ 7) đọc được từ cảm biến
o Nếu hai giá trị CRC khớp nhau, vi điều khiển có thể chắc chắn rằng mã ROM đã được đọc một cách chính xác, không bị lỗi do nhiễu trên đường truyền Nếu không khớp, có nghĩa là đã có lỗi xảy ra
Trang 13o (Datasheet cũng đề cập rằng phần giải thích chi tiết về thuật toán CRC đượccung cấp trong mục "CRC Generation").
Vai trò tổng thể:
Toàn bộ mã ROM 64-bit này, kết hợp với logic điều khiển chức năng ROM được tích hợp sẵn trong DS18B20, cho phép cảm biến hoạt động đúng theo chuẩn giao tiếp 1-Wire Nó là cơ chế nền tảng để thực hiện các lệnh ROM như Search ROM, Read ROM, Match ROM, Skip ROM, Alarm Search, giúp vi điều khiển quản lý và thu thập dữ liệu
từ một hoặc nhiều cảm biến một cách hiệu quả chỉ qua một đường dữ liệu duy nhất.c) Bộ nhớ (Memory)
Hình 7: Sơ đồ bộ nhớ module cảm biến DS18B20
Bộ nhớ của DS18B20 được tổ chức như trong Hình 7 của bảng dữ liệu kỹ thuật Nó bao gồm hai thành phần chính:
- Bộ nhớ đệm (Scratchpad - là Bộ nhớ truy cập ngẫu nhiên tĩnh): Đây là bộ nhớ có đặc tính tạm thời - tức là dữ liệu trong đó sẽ mất đi khi cảm biến bị ngắt nguồn Bộ nhớ đệm dùng để lưu trữ kết quả đo nhiệt độ tức thời và các bản sao tạm thời của cài đặt
- Bộ nhớ chỉ đọc, có thể xóa và ghi bằng điện (EEPROM): Đây là bộ nhớ có đặc tính không bay hơi - nghĩa là dữ liệu lưu trong đó sẽ được giữ lại ngay cả khi cảm biến mất
Trang 14nguồn Bộ nhớ không bay hơi này được dùng để lưu trữ lâu dài các cài đặt quan trọng như:
o Thanh ghi ngưỡng cảnh báo nhiệt độ cao (TH - Ngưỡng Cao)
o Thanh ghi ngưỡng cảnh báo nhiệt độ thấp (TL - Ngưỡng Thấp)
o Thanh ghi cấu hình (dùng để cài đặt độ phân giải)
Có một lưu ý quan trọng là nếu ứng dụng của bạn không cần sử dụng chức năng cảnh báo nhiệt độ của DS18B20, thì hai thanh ghi TH và TL (Byte 2 và Byte 3 trong Bộ nhớ đệm, và cả vị trí tương ứng trong Bộ nhớ không bay hơi) có thể được tận dụng như những ô bộ nhớ đa dụng 1 byte để bạn lưu trữ các thông tin tùy ý khác
Tất cả các lệnh cụ thể dùng để tương tác với bộ nhớ (đọc, ghi, sao chép ) sẽ được mô tảchi tiết hơn trong phần "Các lệnh chức năng của DS18B20" của bảng dữ liệu kỹ thuật
Byte 0 và byte 1 của bộ nhớ đệm chứa byte có trọng số thấp nhất và byte có trọng
số cao nhất của thanh ghi nhiệt độ Hai byte này chỉ có thể đọc; người dùng khôngthể ghi dữ liệu vào đây vì chúng là kết quả trực tiếp từ bộ chuyển đổi nhiệt độ của cảm biến
Byte 2 và 3 cung cấp truy cập vào thanh ghi TH và TL Byte 4 chứa dữ liệu của thanh ghi cấu hình (chi tiết về thanh ghi này được giải thích ở mục riêng)
Byte 5, 6, và 7 được dành riêng cho các mục đích sử dụng nội bộ bên trong chip
và người dùng không thể ghi đè lên chúng
Byte 8 của bộ nhớ đệm cũng là chỉ đọc và chứa mã kiểm tra lỗi vòng cho tám byteđầu tiên (byte 0 đến 7) của bộ nhớ đệm DS18B20 tự động tạo ra mã kiểm tra này (phương pháp tính được mô tả trong mục Tạo Mã kiểm tra lỗi vòng) Mục đích là
để đảm bảo tính toàn vẹn dữ liệu khi thiết bị chủ đọc dữ liệu từ bộ nhớ đệm
Dữ liệu được ghi vào các byte 2, 3, và 4 của bộ nhớ đệm bằng cách sử dụng lệnh Ghi vào Bộ nhớ đệm [4Eh]; dữ liệu phải được truyền đến DS18B20 bắt đầu bằng bit có trọng
số thấp nhất của byte 2
Trang 15Để xác minh tính toàn vẹn dữ liệu sau khi ghi, bộ nhớ đệm có thể được đọc lại (bằng cách sử dụng lệnh Đọc Bộ nhớ đệm [BEh]).
Khi đọc bộ nhớ đệm (dùng lệnh Đọc Bộ nhớ đệm [BEh]), dữ liệu được truyền qua bus 1-Wire bắt đầu từ bit có trọng số thấp nhất của byte 0
Để chuyển dữ liệu TH, TL và cấu hình từ bộ nhớ đệm sang Bộ nhớ không bay hơi
(EEPROM) nhằm lưu trữ lâu dài, thiết bị chủ phải gửi lệnh Sao chép Bộ nhớ đệm [48h]
Dữ liệu trong các thanh ghi của Bộ nhớ không bay hơi được giữ lại khi thiết bị bị ngắt nguồn; khi cấp nguồn trở lại, dữ liệu từ Bộ nhớ không bay hơi này sẽ được tự động nạp lại vào các vị trí tương ứng trong bộ nhớ đệm
Dữ liệu cũng có thể được nạp lại từ Bộ nhớ không bay hơi vào bộ nhớ đệm bất cứ lúc nào bằng cách sử dụng lệnh Gọi lại từ EEPROM [B8h]
Thiết bị chủ có thể gửi các khe thời gian đọc sau lệnh Gọi lại từ EEPROM [B8h] và DS18B20 sẽ cho biết trạng thái của việc nạp lại bằng cách truyền 0 khi đang thực hiện
Byte 3: TL Register (Thanh ghi Ngưỡng cảnh báo Thấp) hoặc User Byte 2 Đọc/Ghi Dữliệu được nạp lại từ EEPROM khi khởi động hoặc khi có lệnh Recall E2
Trang 16Byte 4: Configuration Register (Thanh ghi Cấu hình) Đọc/Ghi Dữ liệu được nạp lại từ EEPROM khi khởi động hoặc khi có lệnh Recall E2 (Chi tiết ở mục e).
Byte 5: Reserved (Dự trữ) Chỉ đọc Giá trị đọc là FFh
Byte 6: Reserved (Dự trữ) Chỉ đọc
Byte 7: Reserved (Dự trữ) Chỉ đọc Giá trị đọc là 10h
Byte 8: CRC (Mã kiểm tra lỗi cho Byte 0-7) Chỉ đọc DS18B20 tự động tính toán CRC này
Hình 8: Cấu trúc thanh ghi nhiệt độ module cảm biến nhiệt độ DS18B20
Chức năng cốt lõi, quan trọng nhất của DS18B20 là hoạt động như một cảm biến nhiệt
độ chuyển đổi trực tiếp sang kỹ thuật số Nghĩa là, bản thân con chip đã tích hợp sẵn
cả bộ phận cảm nhận nhiệt độ lẫn bộ chuyển đổi tương tự-sang-số, tạo ra kết quả cuối cùng là một giá trị số biểu diễn nhiệt độ Điều này loại bỏ sự cần thiết của mạch chuyển đổi tương tự/số bên ngoài và giúp tín hiệu ít bị nhiễu hơn so với cảm biến tương tự
Độ phân giải của cảm biến nhiệt độ này có thể được người dùng cài đặt (cấu hình)
thành 9, 10, 11, hoặc 12 bit, tương ứng với các bước tăng nhiệt độ là 0.5°C, 0.25°C,
Trang 170.125°C, và 0.0625°C Mặc định khi cảm biến mới được cấp nguồn, nó sẽ hoạt động
ở độ phân giải 12-bit.
Khi mới được cấp nguồn, DS18B20 sẽ tự động vào trạng thái nghỉ để tiết kiệm năng
lượng Để yêu cầu DS18B20 bắt đầu đo nhiệt độ và thực hiện chuyển đổi tương tự/số,
thiết bị chủ (ví dụ: vi điều khiển) bắt buộc phải gửi lệnh Bắt đầu Chuyển đổi Nhiệt
độ [44h].
Ngay sau khi quá trình chuyển đổi nhiệt độ hoàn tất (thời gian chuyển đổi phụ thuộc vào
độ phân giải đã cài đặt), kết quả đo (dữ liệu nhiệt) sẽ được lưu vào thanh ghi nhiệt độ
kích thước 2-byte bên trong bộ nhớ đệm, và sau đó DS18B20 sẽ tự động quay trở lại
trạng thái nghỉ
Nếu DS18B20 được cấp nguồn bởi nguồn ngoài: Sau khi gửi lệnh Bắt đầu
Chuyển đổi Nhiệt độ [44h], thiết bị chủ có thể liên tục gửi các "khe thời gian
đọc" DS18B20 sẽ phản hồi bằng cách gửi về giá trị 0 nếu nó vẫn đang bận thực
hiện chuyển đổi Nó sẽ gửi về giá trị 1 ngay khi đã chuyển đổi xong và dữ liệu đã
sẵn sàng trong bộ nhớ đệm Kỹ thuật này giúp thiết bị chủ biết chính xác thời điểm dữ liệu sẵn sàng mà không cần phải chờ đợi đủ thời gian chuyển đổi tối đa
Nếu DS18B20 được cấp nguồn ký sinh: Kỹ thuật thông báo trạng thái bằng "khe
thời gian đọc" như trên không thể dùng được Lý do là vì trong chế độ này, để cung cấp đủ năng lượng cho quá trình chuyển đổi, đường bus 1-Wire bắt buộc
phải được kéo lên mức cao liên tục bằng một mạch kéo lên mạnh trong suốt thời
gian chuyển đổi Khi dùng nguồn ký sinh, thiết bị chủ phải đợi một khoảng thời gian cố định (dựa trên độ phân giải đã cài đặt) trước khi đọc kết quả
Dữ liệu nhiệt độ đầu ra của DS18B20 đã được hiệu chuẩn theo độ Celsius (°C) Nếu
ứng dụng cần hiển thị nhiệt độ theo độ Fahrenheit (°F), người lập trình cần phải tự thực hiện việc chuyển đổi (ví dụ: dùng công thức F = C * 1.8 + 32) hoặc sử dụng một bảng tra cứu
Trang 18Dữ liệu nhiệt độ được lưu trữ dưới dạng một số bù hai 16-bit có dấu mở rộng trong
thanh ghi nhiệt độ (tham khảo Hình 2 trong bảng dữ liệu kỹ thuật) Các bit dấu (ký hiệu
là S) cho biết nhiệt độ là dương hay âm:
Với số dương: S = 0
Với số âm: S = 1
Ảnh hưởng của độ phân giải đến dữ liệu trong thanh ghi nhiệt độ:
Nếu DS18B20 được cấu hình cho độ phân giải 12-bit, tất cả các bit trong thanh
ghi nhiệt độ đều chứa dữ liệu hợp lệ
Với độ phân giải 11-bit, bit 0 (bit có trọng số thấp nhất) không xác định.
Với độ phân giải 10-bit, bit 1 và bit 0 không xác định.
Với độ phân giải 9-bit, bit 2, bit 1 và bit 0 không xác định.
Hình 9: Ví dụ về dữ liệu đầu ra kỹ thuật số và chỉ số nhiệt độ tương ứng cho các chuyển
đổi ở độ phân giải 12-bit
Trang 19e) Thanh ghi Cấu hình (Configuration Register - Byte 4, Hình 8, Bảng 2)
Hình 10: Thanh ghi cấu hình module cảm biến nhiệt độ DS18B20
Byte thứ 4 (tính từ byte 0) trong bộ nhớ đệm 9 byte chính là Thanh ghi Cấu hình Bảng
dữ liệu kỹ thuật có Hình 8 minh họa chi tiết cách các bit trong byte này được sắp xếp và
ý nghĩa của chúng
Chức năng chính của thanh ghi này là cho phép người dùng cài đặt độ phân giải cho quá trình chuyển đổi nhiệt độ của DS18B20 Việc cài đặt này được thực hiện thông qua hai bit cụ thể trong thanh ghi là bit R0 (nằm ở vị trí bit 5) và bit R1 (nằm ở vị trí bit 6) Mối quan hệ giữa giá trị của các bit R0, R1 và độ phân giải tương ứng (9, 10, 11, hoặc 12 bit)được trình bày chi tiết trong Bảng 2 của bảng dữ liệu kỹ thuật
Khi cảm biến DS18B20 mới được cấp nguồn (khởi động), giá trị mặc định của hai bit này được nạp từ bộ nhớ không bay hơi vào là R0 = 1 và R1 = 1 Tổ hợp bit này tương ứng với việc chọn độ phân giải cao nhất là 12-bit làm cài đặt mặc định ban đầu
Có một lưu ý quan trọng về sự đánh đổi trực tiếp giữa độ phân giải và thời gian chuyển đổi Nghĩa là, nếu bạn chọn độ phân giải cao hơn (ví dụ 12-bit) để có kết quả đo mịn và chính xác hơn, thì cảm biến sẽ cần nhiều thời gian hơn để hoàn thành một lần chuyển đổi (lên đến 750 mili giây cho 12-bit) Ngược lại, nếu chọn độ phân giải thấp hơn (ví dụ 9-bit), thời gian chuyển đổi sẽ nhanh hơn (chỉ 93.75 mili giây cho 9-bit), nhưng kết quả
đo sẽ kém chính xác hơn Người dùng cần cân nhắc sự đánh đổi này để chọn độ phân giải phù hợp
Bên cạnh hai bit R1 và R0, các bit còn lại trong Thanh ghi Cấu hình (Byte 4) được dành riêng cho nhà sản xuất sử dụng nội bộ Cụ thể là Bit 7 (bit cao nhất) và Bit 0 đến Bit 4 (5bit thấp nhất) Người dùng không thể ghi đè lên các bit này Chúng đọc ra các giá trị cố
Trang 20định (theo Hình 8, bit 7 đọc là 0, và các bit 4-0 đọc là 1) và không có chức năng cấu hình nào cho người dùng.
Thanh ghi này nằm ở Byte 4 của Scratchpad
Cấu trúc:
Bit 7: Reserved (Luôn đọc là 0)
Bit 6, 5 (R1, R0): Cài đặt độ phân giải nhiệt độ (Xem Bảng 2)
Bit 4-0: Reserved (Luôn đọc là 1)
Bảng 2 (Thermometer Resolution Configuration):
Hình 11: Cấu hình độ phân giải DS18B20
f Hoạt động - Báo hiệu Cảnh báo (Operation—Alarm Signaling)
Hình 12:
Sau khi đo nhiệt độ (kết quả lưu trong thanh ghi nhiệt độ 16-bit), cảm biến sẽ so sánh giátrị này với ngưỡng cảnh báo cao (lưu ở Byte 2, gọi tắt là ngưỡng trên) và ngưỡng cảnh báo thấp (lưu ở Byte 3, gọi tắt là ngưỡng dưới) đã được người dùng định nghĩa Do các thanh ghi lưu ngưỡng trên và ngưỡng dưới chỉ rộng 8 bit, nên việc so sánh chỉ sử dụng 8
Trang 21bit có trọng số cao hơn trong phần biểu diễn độ lớn của thanh ghi nhiệt độ (cụ thể là từ bit 4 đến bit 11).
Một tình trạng cảnh báo được xác định là tồn tại nếu nhiệt độ đo được nằm ngoài phạm
vi an toàn do người dùng định nghĩa bởi ngưỡng dưới và ngưỡng trên Cụ thể, nếu:Nhiệt độ đo được thấp hơn hoặc bằng Giá trị ngưỡng dưới
HOẶC Nhiệt độ đo được cao hơn hoặc bằng Giá trị ngưỡng trên
Khi một trong hai điều kiện trên xảy ra, một cờ báo động nội bộ bên trong DS18B20 sẽ
tự động được đặt lên (bật)
Trạng thái của cờ báo động này được cập nhật sau mỗi lần đo nhiệt độ hoàn tất Do đó, nếu nhiệt độ sau đó quay trở lại phạm vi bình thường (tức là nằm giữa ngưỡng dưới và ngưỡng trên), thì cờ báo động sẽ tự động bị xóa (tắt) sau lần chuyển đổi nhiệt độ tiếp theo đó Cờ này luôn phản ánh trạng thái cảnh báo dựa trên kết quả đo gần nhất
Để kiểm tra xem có cảm biến nào trên đường truyền đang ở trong tình trạng cảnh báo hay không, thiết bị chủ (ví dụ: vi điều khiển) sẽ gửi một lệnh đặc biệt là Lệnh Tìm kiếm Cảnh báo (có mã lệnh riêng)
Khi Lệnh Tìm kiếm Cảnh báo được gửi đi trên đường truyền một dây, chỉ những cảm biến DS18B20 nào đang có cờ báo động được đặt lên (đang bật) mới phản hồi lại lệnh này Các cảm biến khác có nhiệt độ bình thường sẽ im lặng Bằng cách thực hiện quy trình Tìm kiếm Cảnh báo, thiết bị chủ có thể xác định được chính xác mã nhận dạng 64-bit của những cảm biến nào đang gặp tình trạng nhiệt độ ngoài ngưỡng
Có một lưu ý quan trọng: nếu thiết bị chủ phát hiện một tình trạng cảnh báo và đồng thờicác cài đặt ngưỡng trên hoặc ngưỡng dưới có thể đã bị thay đổi trước đó, thì nên thực hiện thêm một lần chuyển đổi nhiệt độ nữa để xác thực lại tình trạng cảnh báo Điều này đảm bảo rằng cờ báo động phản ánh đúng kết quả so sánh với các giá trị ngưỡng nhiệt
độ mới nhất đã được cập nhật trong cảm biến.g Cấp nguồn cho DS18B20 (Powering theDS18B20)
Trang 22Nguồn ngoài (External Supply - Hình 5): Kết nối nguồn ngoài (3.0V-5.5V) vào chân VDD Ưu điểm là không cần mạch kéo lên mạnh (strong pullup) trong lúc chuyển đổi vàbus 1-Wire vẫn rảnh cho các giao tiếp khác.
Nguồn ký sinh (Parasite Power - Hình 4): Kết nối chân VDD với GND Nguồn được lấy
từ đường dữ liệu DQ thông qua điện trở kéo lên khi bus ở mức cao, và được tích trữ trong tụ nội CPP để dùng khi bus thấp
Yêu cầu: Khi thực hiện chuyển đổi nhiệt độ (lệnh Convert T [44h]) hoặc sao chép dữ liệu vào EEPROM (lệnh Copy Scratchpad [48h]), dòng hoạt động có thể lên tới 1.5mA
Để đảm bảo đủ nguồn, master phải kích hoạt một mạch kéo lên mạnh (ví dụ dùng
MOSFET) trên đường bus 1-Wire trong suốt thời gian chuyển đổi (tCONV) hoặc ghi EEPROM (tWR = 10ms) Mạch kéo lên mạnh phải được kích hoạt trong vòng 10µs (tối đa) sau khi lệnh được gửi Không có hoạt động nào khác được diễn ra trên bus trong thờigian này
Khuyến cáo: Không nên dùng nguồn ký sinh ở nhiệt độ trên +100°C do dòng rò tăng cao
có thể ảnh hưởng giao tiếp
Kiểm tra chế độ nguồn: Master gửi lệnh Skip ROM [CCh] → Read Power Supply [B4h]
→ thực hiện "read time slot" Nếu bus bị kéo xuống thấp, có thiết bị dùng nguồn ký sinh Nếu bus giữ mức cao, tất cả đều dùng nguồn ngoài
h Tạo CRC (CRC Generation)
CRC được cung cấp trong byte cuối cùng của mã ROM 64-bit và byte thứ 9 của
Scratchpad để đảm bảo tính toàn vẹn dữ liệu
ROM CRC được tính từ 56 bit đầu của mã ROM
Scratchpad CRC được tính từ 8 byte đầu (byte 0-7) của Scratchpad
Đa thức sinh CRC tương đương là: CRC=X8+X5+X4+1
Trang 23Bus master cần tự tính toán lại CRC từ dữ liệu nhận được và so sánh với CRC đọc từ DS18B20 để xác nhận dữ liệu không bị lỗi (Tham khảo Hình 9 CRC Generator và AppNote 27).
i Lệnh ROM (ROM Commands - Tham khảo Hình 11)
Các lệnh này hoạt động dựa trên mã ROM 64-bit duy nhất của thiết bị
Search ROM [F0h]: Xác định mã ROM của tất cả các thiết bị slave trên bus thông qua quá trình loại trừ Master phải quay lại bước Khởi tạo sau mỗi chu kỳ Search ROM.Read ROM [33h]: Đọc mã ROM 64-bit của slave Chỉ dùng được khi có duy nhất một slave trên bus
Match ROM [55h]: Gửi lệnh này theo sau bởi mã ROM 64-bit để chọn và giao tiếp với một slave cụ thể trên bus (single-drop hoặc multidrop) Chỉ slave có mã ROM khớp mới phản hồi lệnh chức năng tiếp theo
Skip ROM [CCh]: Gửi lệnh này để nói chuyện với tất cả các slave trên bus cùng lúc mà không cần gửi mã ROM Ví dụ: dùng để ra lệnh tất cả DS18B20 thực hiện chuyển đổi nhiệt độ đồng thời (Skip ROM + Convert T) Lưu ý: Không thể dùng Read Scratchpad sau Skip ROM nếu có nhiều hơn một slave
Alarm Search [ECh]: Hoạt động tương tự Search ROM nhưng chỉ những slave có cờ báođộng (alarm flag) được đặt mới phản hồi Master phải quay lại bước Khởi tạo sau mỗi chu kỳ Alarm Search
j Lệnh Chức năng DS18B20 (DS18B20 Function Commands - Bảng 3, Hình 12)
Sau khi đã chọn thiết bị bằng lệnh ROM (Match ROM hoặc Skip ROM nếu chỉ có 1 thiết bị), master có thể gửi các lệnh chức năng này
Convert T [44h]: Khởi tạo một lần chuyển đổi nhiệt độ Yêu cầu kéo lên mạnh nếu dùng nguồn ký sinh Có thể đọc trạng thái nếu dùng nguồn ngoài
Trang 24Write Scratchpad [4Eh]: Cho phép master ghi 3 byte dữ liệu vào Scratchpad (byte 2:
TH, byte 3: TL, byte 4: Config) Dữ liệu phải được truyền LSB trước Phải ghi đủ 3 bytetrước khi master gửi tín hiệu Reset
Read Scratchpad [BEh]: Cho phép master đọc nội dung của Scratchpad (9 byte, từ byte
0 đến byte 8 - CRC) Dữ liệu truyền ra LSB trước Master có thể gửi Reset để dừng đọc bất cứ lúc nào
Copy Scratchpad [48h]: Sao chép nội dung của TH, TL, và Config registers (byte 2, 3, 4) từ Scratchpad vào EEPROM Yêu cầu kéo lên mạnh (ít nhất 10ms) nếu dùng nguồn
ký sinh
Recall E2 [B8h]: Nạp lại giá trị TH, TL và Config từ EEPROM vào các byte 2, 3, 4 tương ứng trong Scratchpad Hoạt động này tự động xảy ra khi cấp nguồn Master có thểđọc trạng thái (0 = đang nạp, 1 = đã xong)
Read Power Supply [B4h]: Master gửi lệnh này và thực hiện read time slot để xác định xem có thiết bị nào đang dùng nguồn ký sinh không (kéo bus xuống thấp = ký sinh, giữ bus cao = nguồn ngoài)
B THƯ VIỆN MODULE CẢM BIẾN DS18B20
I TỔNG QUAN VÈ CHƯƠNG TRÌNH THƯ VIỆN
1 Bối cảnh và mục đích phát triển thư viện module cảm biến DS18B20
Bối cảnh:
- DS18B20 là cảm biến nhiệt độ kỹ thuật số phổ biến, sử dụng giao thức OneWire với một dây dữ liệu duy nhất, hỗ trợ khả năng chống nước (ở một số phiên bản) Cảm biến này được sử dụng rộng rãi trong các ứng dụng như giám sát môi trường, điều hòa không khí, tự động hóa nhà thông minh, thiết bị y tế, và ghi dữ liệu công nghiệp Khả năng hoạtđộng trên bus OneWire cho phép kết nối nhiều cảm biến trên cùng một chân GPIO, giúptiết kiệm tài nguyên phần cứng Việc làm chủ cảm biến DS18B20 là cần thiết để tận
Trang 25dụng tối đa khả năng của nó trong các hệ thống nhúng, đặc biệt trên nền tảng
MicroPython với ESP32
Mục đích phát triển thư viện:
Xây dựng một thư viện MicroPython cho DS18B20 (và DS18S20) không chỉ nhằm mục đích sử dụng cảm biến mà còn để rèn luyện các kỹ năng kỹ thuật quan trọng:
o Hiểu và triển khai giao thức OneWire: Quản lý định thời (timing) đặc thù, quét địa chỉ ROM 64-bit duy nhất của từng cảm biến, và tương tác với bộ nhớ Scratchpad
o Xử lý dữ liệu cảm biến: Yêu cầu chuyển đổi nhiệt độ, đọc dữ liệu thô, kiểmtra tính toàn vẹn bằng CRC, và chuyển đổi sang đơn vị °C dựa trên độ phângiải
o Thiết kế phần mềm: Phát triển API có cấu trúc, dễ sử dụng, hỗ trợ nhiều cảm biến, trừu tượng hóa giao thức OneWire, và đảm bảo mã dễ bảo trì – nền tảng của kỹ thuật phần mềm nhúng
Lợi ích của việc xây dựng thư viện riêng:
o Tối ưu hóa thời gian chờ: Điều chỉnh thời gian chờ chuyển đổi (94–750ms tùy độ phân giải) cho phù hợp với ứng dụng
o API linh hoạt: Cung cấp các phương thức đơn giản để quét, đọc nhiệt độ, cài đặt độ phân giải, và cấu hình ngưỡng báo động
o Xử lý lỗi mạnh mẽ: Bắt và xử lý lỗi như giao tiếp OneWire thất bại, CRC không khớp, hoặc cảm biến không phản hồi
o Chức năng nâng cao: Hỗ trợ cài đặt độ phân giải (9–12 bit), cấu hình
ngưỡng báo động (cao/thấp), và kiểm tra chế độ nguồn (parasite hoặc external)
Trang 26o Mục đích học tập: Hiểu sâu về giao thức OneWire, hoạt động của
DS18B20, và cách phát triển thư viện nhúng
2 Thiết kế và kiến trúc thư viện
a) Tổng quan
- Ngôn ngữ lập trình: MicroPython, được tối ưu cho các hệ thống nhúng như ESP32
- Lớp chính: DS18X20, cung cấp giao diện để quản lý cảm biến DS18B20 và DS18S20
Trang 27o Cấu hình nâng cao: Cài đặt độ phân giải, ngưỡng báo động cao/thấp, và lưuvào EEPROM.
o Kiểm tra chế độ nguồn: Xác định cảm biến dùng nguồn parasite hay
external
b) Các thuật toán được sử dụng
Dưới đây là phân tích các thuật toán chính được triển khai trong mã, ánh xạ trực tiếp tới các phương thức trong thư viện DS18X20
1 Giao tiếp OneWire và định địa chỉ
- Reset và Presence Pulse:
o Mô tả: Đặt lại bus OneWire để khởi động giao tiếp và kiểm tra sự hiện diệncủa cảm biến
o Triển khai: Phương thức reset(True) trong onewire.OneWire:
Gửi xung reset (kéo chân GPIO xuống thấp trong 480µs, thả lên cao)
Chờ 60µs để cảm biến phản hồi presence pulse (kéo bus xuống thấp nếu có thiết bị)
Trả về True nếu có thiết bị, ném lỗi nếu không (khi required=True)
o Áp dụng: Trong các phương thức như convert_temp, read_scratchpad, check_power_mode, v.v., để bắt đầu giao tiếp
- Quét ROM (ROM Scan):
o Mô tả: Phát hiện tất cả cảm biến trên bus và lấy địa chỉ ROM 64-bit duy nhất
o Triển khai: Phương thức scan() trong DS18X20:
Gọi self.ow.scan() (từ onewire.OneWire), sử dụng lệnh CMD_SEARCHROM (0xF0) để tìm ROM
Trang 28 Lọc các ROM có byte đầu tiên là 0x28 (DS18B20) hoặc 0x10 (DS18S20).
Lưu danh sách ROM vào self.roms và khởi tạo độ phân giải 12-bit trong self.resolutions
o Chi tiết thuật toán:
Sử dụng thuật toán tìm kiếm nhị phân (binary search) trong onewire._search_rom để xử lý xung đột khi có nhiều thiết bị
Mỗi ROM là bytearray 8 byte, được lưu để sử dụng trong các phươngthức khác
- Chọn thiết bị (Device Selection):
o Mô tả: Ra lệnh cho tất cả thiết bị hoặc một cảm biến cụ thể
o Triển khai:
SKIP ROM: Trong convert_temp, gửi CMD_SKIPROM (0xCC) bằng writebyte để ra lệnh cho tất cả cảm biến trên bus (dùng khi yêu cầu chuyển đổi nhiệt độ)
MATCH ROM: Trong read_scratchpad, check_power_mode, v.v., gọi self.ow.select_rom(rom) để chọn cảm biến cụ thể:
Gửi CMD_MATCHROM (0x55) theo sau là ROM 8 byte
Đảm bảo chỉ cảm biến có ROM khớp mới phản hồi
o Liên kết với onewire: Dựa vào writebyte và select_rom
2 Đọc dữ liệu thô từ Scratchpad
- Gửi lệnh đọc:
o Mô tả: Yêu cầu cảm biến gửi 9 byte Scratchpad (nhiệt độ, báo động, cấu hình, CRC)
Trang 29o Triển khai: Trong read_scratchpad:
Sau khi reset và chọn cảm biến, gửi CMD_READ_SCRATCHPAD (0xBE) bằng writebyte
Đọc 9 byte vào self.buffer bằng self.ow.readinto(self.buffer)
- Nhận dữ liệu:
o Mô tả: Lưu dữ liệu Scratchpad vào bộ đệm
o Triển khai: self.ow.readinto(self.buffer) đọc 9 byte liên tiếp, tận dụng phương thức readbyte của onewire (đọc từng bit và ghép thành byte)
- Kiểm tra CRC:
o Mô tả: Đảm bảo tính toàn vẹn dữ liệu bằng CRC-8-Maxim
o Triển khai: Trong read_scratchpad:
Gọi self.ow.crc8(self.buffer) để tính CRC của 8 byte đầu và so sánh với byte thứ 9 (CRC8)
Nếu CRC khác 0, ném OSError("Lỗi CRC khi đọc scratchpad")
o Chi tiết thuật toán:
Thuật toán CRC-8-Maxim sử dụng bảng tra cứu (crctab1, crctab2) trong onewire.crc8 để tối ưu tính toán
Đảm bảo dữ liệu không bị hỏng trong quá trình truyền
3 Tái tạo và chuyển đổi dữ liệu nhiệt độ thô
- Ghép byte (Byte Combination):
o Mô tả: Tái tạo giá trị nhiệt độ 16-bit từ 2 byte Scratchpad
o Triển khai: Trong _read_temp_raw:
Lấy temp_lsb (byte 0) và temp_msb (byte 1) từ Scratchpad
Trang 30 Ghép thành số nguyên 16-bit: raw_temp = (temp_msb << 8) | temp_lsb.
- Chuyển đổi số bù 2 (Two's Complement Conversion):
o Mô tả: Xử lý nhiệt độ âm (nếu có)
o Triển khai: Trong read_temp:
Kiểm tra bit dấu (raw_temp & 0x8000)
Nếu là 1 (âm), tính giá trị âm: raw_temp = -((~raw_temp & 0xFFFF) + 1) (phép bù hai)
- Scale sang độ C (Scaling to Celsius):
o Mô tả: Chuyển giá trị thô sang °C dựa trên độ phân giải
o Triển khai: Trong read_temp:
Lấy độ phân giải từ self.resolutions[tuple(rom)], mặc định 12-bit
Tính nhiệt độ: (raw_temp >> (12 - resolution)) * (0.0625 * (2 ** (12
- Mặc định: Nếu độ phân giải không hợp lệ, dùng raw_temp * 0.0625 (12-bit)
4 Quản lý thời gian chờ
- Chờ chuyển đổi (Conversion Delay):
Trang 31o Mô tả: Đảm bảo đủ thời gian để cảm biến hoàn tất chuyển đổi nhiệt độ trước khi đọc Scratchpad.
o Triển khai: Trong mã ví dụ (if name == " main ":):
Sau ds_sensor.convert_temp(), tính max_delay:
Chờ bằng time.sleep_ms(max_delay) (94ms cho 9-bit, 188ms cho 10-bit, 375ms cho 11-bit, 750ms cho 12-bit)
5 Cấu hình độ phân giải và ngưỡng báo động
- Cài đặt độ phân giải:
o Mô tả: Cấu hình độ phân giải (9–12 bit) và lưu vào Scratchpad/EEPROM
o Triển khai: Trong set_resolution:
Kiểm tra bits hợp lệ (9, 10, 11, 12)
Lấy mã cấu hình từ RESOLUTION_CONFIG (ví dụ: 0x1F cho bit)
9- Đọc Scratchpad để giữ th (báo động cao) và tl (báo động thấp)
Ghi lại Scratchpad với cấu hình mới bằng _write_scratchpad
Nếu copy_eeprom=True, gọi _copy_scratchpad để lưu vào EEPROM
Trang 32- Cài đặt ngưỡng báo động:
o Mô tả: Cài đặt nhiệt độ báo động cao/thấp và lưu vào
Scratchpad/EEPROM
o Triển khai: Trong set_high_alarm và set_low_alarm:
Chuyển temp_c sang byte: int(temp_c / 0.5) (0.5°C/LSB)
Đọc Scratchpad để giữ các giá trị còn lại (tl, config hoặc th, config)
Ghi lại Scratchpad với ngưỡng mới
Nếu copy_eeprom=True, lưu vào EEPROM
- Lấy ngưỡng báo động:
o Mô tả: Đọc ngưỡng báo động từ Scratchpad và chuyển sang °C
o Triển khai: Trong get_high_alarm và get_low_alarm:
Đọc Scratchpad, lấy th_byte hoặc tl_byte
Xử lý dấu: Nếu bit cao nhất là 1, tính giá trị âm (byte - 256)
Nhân với 0.5 để đổi sang °C
6 Kiểm tra chế độ nguồn
- Mô tả: Xác định cảm biến dùng nguồn parasite (nguồn từ chân dữ liệu) hay external (nguồn riêng)
- Triển khai: Trong check_power_mode:
o Reset bus, chọn cảm biến, gửi CMD_READ_POWER_SUPPLY (0xB4)
o Đọc bit bằng self.ow.readbit(): 0 (parasite), 1 (external)
- Chi tiết:
o Dựa vào giao thức OneWire: Sau lệnh 0xB4, cảm biến kéo bus xuống thấp (0) nếu dùng parasite power