Giới thiệu về cảm biến DS18B20 là cảm biến nhiệt độ sử dụng chuẩn giao tiếp One Wire để truyền nhận dữ liệu. Cảm biến cho nhiệt độ có độ chính xác tương đối cao và được ứng dụng nhiều trong thực tế như đo nhiệt độ môi trường, đo nhiệt độ đáy biển, nhiệt độ nước ...

one wire

Đặc điểm của DS18B20 :

Dải đo nhiệt độ  trong khoảng -55 -> +125 oC.

- Độ chính xác trong dải đo ±0.5°C.

- Điện áp hoạt động 3-5.5VDC.

- Giao tiếp One wire

- Cấu hình mã hóa nhiệu độ từ 9 – 12 bit.

- Thời gian chuyển đổi nhiệt độ tối đa là 750ms cho mã hóa 12 bit.

Các tập lệnh của DS18B20 :

 WRITE SCRATCHPAD (4Eh)  : Lệnh này cho phép ghi 2 byte dữ liệu vào bộ nhớ nháp của DS1820. Byte đầu tiên được ghi vào thanh ghi TH , còn byte thứ hai được ghi vào thanh ghi TL .

READ SCRATCHPAD (BEh) : Lệnh này cho phép master đọc nội dung bộ nhớ nháp. Quá trình đọc bắt đầu đọc byte 0 và tiếp tục cho đến byte rhứ 9 (byte 8 – CRC). Thiết bị chủ có thể xuất ra một xung reset để làm dừng quá trình đọc bất kỳ lúc nào nếu như chỉ có một phần của dữ liệu trên bộ nhớ nháp cần được đọc.

COPYSCRATCHPAD (48h)  : Lệnh này copy nội dung của hai thanh ghi TH và TL  vào bộ nhớ EEPROM. Nếu cảm biến được sử dụng trong chế độ cấp nguồn bắt đầu việc đo.

CONVERT T (44h) : Lệnh này khởi động một quá trình đo và chuyển đổi giá trị nhiệt độ thành số (nhị phân). Sau khi chuyển đổi giá trị kết quả đo nhiệt độ được lưu trữ trên thanh ghi nhiệt độ 2 byte trong bộ nhớ nháp Thời gian chuyển đổi lớn nhất 750 ms.

READ POWER SUPPLY (B4h) : Một lệnh đọc tiếp sau lệnh này sẽ cho biết DS1820 đang sử dụng chế độ cấp nguồn như thế nào, giá trị đọc được bằng 0 nếu cấp nguồn bằng chính đường dẫn dữ liệu và bằng 1 nếu cấp nguồn qua một đường dẫn riêng.

READ ROM (33h) : Cho phép đọc ra 8 byte  trên ROM, bao gồm: 8 bit family code 0x28, 48 bit serial number, 8 bit kiểm tra CRC. Lệnh này chỉ dùng khi trên bus có 1 cảm biến DS1820, nếu không sẽ xảy ra xung đột trên bus do tất cả các thiết bị tớ cùng đáp ứng.

SKIP ROM (CCh) : Lệnh này cho phép thiết bị điều khiển truy nhập thẳng đến các lệnh bộ nhớ của DS1820 mà không cần gửi chuỗi mã 64 bit ROM. Như vậy sẽ tiết kiệm được thời gian chờ đợi nhưng chỉ mang hiệu quả khi trên bú chỉ có một cảm biến.

Ghi chú : Nếu cấu hình cho DS18B20 theo 9,10,11,12 bit thì ta có độ chính xác tương ứng là : 0.5°C , 0.25°C ,0.125°C, 0.0625°C.Theo mặc định của nhà sản xuất nếu chúng ta không cấu hình chế độ chuyển đổi thì nó sẽ tự cấu hình là 12 bit.

Giới thiệu chuẩn giao tiếp One wire là một chuẩn giao tiếp được thiết kế bởi Dallas Semiconductor, one wire dùng một dây để truyền nhận dữ liệu nên có tốc độ thấp . Chủ yếu sử dụng cho việc thu thập, truyền nhận dữ liệu , nhiệt độ không yêu cầu tốc độ cao.

one-wire

Nguyên lý truyền nhận :

 Các tín hiệu sử dụng Reset ,  write 0 ,  write 1 , Read .

Reset : Chuẩn bị giao tiếp . Master kéo xuống 0 một khoảng T rồi nhả lên mức 1 sau đó cấu hình Master là chân In delay T1 (us) rồi đọc giá trị slave trả về . Nếu =0 thì cho phép giao tiếp . =1 đường truyền lỗi hoặc slave đang bận .

Write 1 : truyền đi bit 1 : Master kéo xuống 0 một khoảng T2(us) rồi về mức 1 khoảng thời gian T3.

Write 0 : truyền đi bit 0 : Master kéo xuống 0 khoảng thời gian T4 rồi trả về 1 khoảng thời gian T5

Read : Đọc một Bit : Master kéo xuống 0 khoảng thời gian T6 rồi trả về 1 . delay khoảng thời gian T7 rồi đọc giá trị slave gửi về rồi delay thời gian T8

Giao tiếp DS18B20 với vi điều khiển PIC 16F877A :

Trong trường hợp chỉ sử dụng cảm biến thì các lệnh chủ yếu sẽ là Reset đường truyền, lệnh đọc ID của thiết bị (0x28h), lệnh skip ROM, lệnh Convert temperature, lện đọc bộ nhớ để lấy ra dữ liệu nhiệt độ.

one_wire_reset();
write_byte(0x33, 0); // Read ID command
id = read_byte();
one_wire_reset();
write_byte(0xCC, 0); // Skip Rom command
write_byte(0x44, 1); // Temperature Convert command
delay_ms(750); // Max. time for conversion is 750mS
one_wire_reset();
write_byte(0xCC, 0); // Skip Rom command
write_byte(0xBE, 0); // Read scratch pad command
// lay du lieu nhiet do
data_temp[0] = read_byte();
data_temp[1] = read_byte();
one_wire_reset();
nhiet = (int32) make16(data_temp[1],data_temp[0]);

Các bạn có thể vào Proteus vẽ mạch như hình dưới hoặc có thể Download bài tập ở link cuối bài viết.

Trong bài tập này mình đọc dữ liệu từ DS18B20 sau đó hiển thị kết quả ra LCD các bạn có thể xem bài Hiển thị LCD, mình dùng 1 switch để giả lập khi cảm biến bị lỗi hay đường truyền one wire bị lỗi.

Download bài học Giao tiếp one wire cảm biến nhiệt độ DS18B20  học lập trình vi điều khiển PIC- bài 23

Xem video mô phỏng

Nếu bạn thấy hay hãy đăng ký , chia sẻ giúp tôi nhé chúng tôi sẽ thường xuyên cập nhật kiến thức mới về vi điều khiển PIC tại đây