- Thành phần bắt buộc: -
- Cảm biến nhiệt độ DS18B20:
- Sơ đồ mạch:-
- Các bước hoặc dòng mã: -
- Giải thích mã:
- Nhận dữ liệu từ cảm biến nhiệt độ DS18B20:
Nói chung, cảm biến nhiệt độ LM35 được sử dụng với bộ vi điều khiển để đo nhiệt độ vì nó rẻ và dễ mua. Nhưng LM35 cho các giá trị tương tự và chúng ta cần chuyển đổi chúng thành kỹ thuật số bằng ADC (Analog to Digital Converter). Nhưng ngày nay chúng tôi đang sử dụng cảm biến nhiệt độ DS18B20 mà chúng tôi không cần chuyển đổi ADC để có được nhiệt độ. Ở đây chúng ta sẽ sử dụng Vi điều khiển PIC với DS18B20 để đo Nhiệt độ.
Vì vậy, ở đây chúng tôi đang xây dựng một Nhiệt kế với thông số kỹ thuật sau sử dụng bộ vi điều khiển PIC16F877A từ vi mạch.
- Nó sẽ hiển thị đầy đủ phạm vi nhiệt độ từ -55 độ đến +125 độ.
- Nó sẽ chỉ hiển thị nhiệt độ nếu nhiệt độ thay đổi + / -.2 độ.
Thành phần bắt buộc: -
- Pic16F877A - gói PDIP40
- Bảng bánh mì
- Pickit-3
- Bộ chuyển đổi 5V
- LCD JHD162A
- Cảm biến nhiệt độ DS18b20
- Dây kết nối thiết bị ngoại vi.
- Điện trở 4,7k - 2 chiếc
- Hủ 10k
- Tinh thể 20mHz
- 2 chiếc tụ gốm 33pF
Cảm biến nhiệt độ DS18B20:
DS18B20 là một cảm biến tuyệt vời để cảm nhận nhiệt độ một cách chính xác. Cảm biến này cung cấp độ phân giải 9bit đến 12bit khi cảm nhận nhiệt độ. Cảm biến này chỉ giao tiếp với một dây và không cần bất kỳ bộ ADC nào để thu được nhiệt độ tương tự và chuyển đổi chúng dưới dạng kỹ thuật số.
Đặc điểm kỹ thuật của cảm biến là: -
- Đo Nhiệt độ từ -55 ° C đến + 125 ° C (-67 ° F đến + 257 ° F)
- ± 0,5 ° C Độ chính xác từ -10 ° C đến + 85 ° C
- Độ phân giải có thể lập trình từ 9 bit đến 12 bit
- Không cần thành phần bên ngoài
- Cảm biến sử dụng Giao diện 1-Wire®
Nếu chúng ta nhìn vào hình ảnh sơ đồ ở trên từ biểu dữ liệu, chúng ta có thể thấy rằng cảm biến trông giống hệt như gói BC547 hoặc BC557, TO-92. Chân đầu tiên là Ground, chân thứ hai là DQ hoặc dữ liệu và chân thứ ba là VCC.
Dưới đây là thông số kỹ thuật điện từ Datasheet sẽ cần thiết cho thiết kế của chúng tôi. Điện áp cung cấp định mức cho cảm biến là + 3.0V đến + 5.5V. Nó cũng cần kéo lên điện áp cung cấp giống như điện áp cung cấp đã nêu ở trên.
Ngoài ra, có một biên độ chính xác là + -0,5 độ C cho phạm vi -10 Độ C đến +85 độ C và độ chính xác thay đổi cho biên độ toàn dải, là + -2 Độ cho -55 Độ đến + Phạm vi 125 độ.
Nếu chúng ta xem lại biểu dữ liệu, chúng ta sẽ thấy thông số kỹ thuật kết nối của cảm biến. Chúng ta có thể kết nối cảm biến ở chế độ nguồn ký sinh khi cần hai dây, DATA và GND, hoặc chúng ta có thể kết nối cảm biến bằng nguồn điện bên ngoài, nơi cần ba dây riêng biệt. Chúng tôi sẽ sử dụng cấu hình thứ hai.
Vì bây giờ chúng ta đã quen thuộc với xếp hạng công suất của các khu vực liên quan đến cảm biến và kết nối, nên bây giờ chúng ta có thể tập trung vào việc tạo sơ đồ.
Sơ đồ mạch:-
Nếu chúng ta xem sơ đồ mạch, chúng ta sẽ thấy rằng: -
Màn hình LCD 16x2 ký tự được kết nối qua vi điều khiển PIC16F877A, trong đó RB0, RB1, RB2 được kết nối với chân LCD RS, R / W, E. Và RB4, RB5, RB6 và RB7 được kết nối qua 4 chân D4, D5, D6 của LCD, D7. Màn hình LCD được kết nối ở chế độ 4bit hoặc chế độ nibble.
Một bộ dao động tinh thể tần số 20MHz với hai tụ gốm 33pF được kết nối qua chân OSC1 và OSC2. Nó sẽ cung cấp tần số xung nhịp 20Mhz không đổi cho vi điều khiển.
DS18B20 cũng được kết nối theo cấu hình chân và với một điện trở kéo lên 4,7k như đã thảo luận trước đây. Tôi đã kết nối tất cả những thứ này trong breadboard.
Nếu bạn chưa quen với Vi điều khiển PIC, hãy làm theo Hướng dẫn về Vi điều khiển PIC của chúng tôi nêu rõ với Bắt đầu với Vi điều khiển PIC.
Các bước hoặc dòng mã: -
- Đặt cấu hình của bộ vi điều khiển bao gồm cấu hình Bộ tạo dao động.
- Đặt cổng mong muốn cho LCD bao gồm thanh ghi TRIS.
- Mọi chu kỳ với cảm biến ds18b20 đều bắt đầu bằng việc đặt lại, vì vậy chúng tôi sẽ đặt lại ds18b20 và chờ xung hiện diện.
- Viết bàn di chuột và đặt độ phân giải của cảm biến 12bit.
- Bỏ qua phần đọc ROM, sau đó là một xung đặt lại.
- Gửi lệnh chuyển đổi nhiệt độ.
- Đọc nhiệt độ từ bàn di chuột.
- Kiểm tra giá trị nhiệt độ âm hay dương.
- In nhiệt độ trên màn hình LCD 16x2.
- Chờ nhiệt độ thay đổi trong khoảng +/-. 20 độ C.
Giải thích mã:
Mã đầy đủ cho Nhiệt kế kỹ thuật số này được cung cấp ở cuối hướng dẫn này cùng với Video minh họa. Bạn sẽ cần một số tệp tiêu đề để chạy chương trình này có thể được tải xuống từ đây.
Đầu tiên, chúng ta cần thiết lập các bit cấu hình trong vi điều khiển pic và sau đó bắt đầu với hàm void main .
Sau đó, bốn dòng dưới đây được sử dụng để bao gồm tệp tiêu đề thư viện, lcd.h và ds18b20.h . Và xc.h dành cho tệp tiêu đề vi điều khiển.
#include
Các định nghĩa này được sử dụng để gửi lệnh đến cảm biến nhiệt độ. Các lệnh được liệt kê trong biểu dữ liệu của cảm biến.
#define Bỏ qua_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define Resolution_12bit 0x7F #define read_scratchpad 0xBE
Bảng 3 này từ biểu dữ liệu của cảm biến hiển thị tất cả các lệnh trong đó macro được sử dụng để gửi các lệnh tương ứng.
Nhiệt độ sẽ chỉ hiển thị trên màn hình nếu nhiệt độ thay đổi +/- .20 độ. Chúng ta có thể thay đổi khoảng cách nhiệt độ này từ macro temp_gap này. Bằng cách thay đổi giá trị tại macro này, thông số kỹ thuật sẽ được thay đổi.
Hai biến float khác được sử dụng để lưu trữ dữ liệu nhiệt độ được hiển thị và phân biệt chúng với khoảng cách nhiệt độ
#define temp_gap 20 float pre_val = 0, aft_val = 0;
Trong hàm void main () , lcd_init () ; là một chức năng để khởi tạo LCD. Hàm lcd_init () này được gọi từ thư viện lcd.h.
Thanh ghi TRIS được sử dụng để chọn các chân I / O làm đầu vào hoặc đầu ra. Hai biến ngắn TempL và TempH không có dấu được sử dụng để lưu trữ dữ liệu độ phân giải 12bit từ cảm biến nhiệt độ.
void main (void) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; không dấu TempL ngắn, TempH; không dấu int t, t2; float chênh lệch1 = 0, chênh lệch2 = 0; lcd_init ();
Hãy xem vòng lặp while, ở đây chúng tôi đang chia vòng lặp while (1) thành nhiều phần nhỏ.
Những đường này dùng để cảm nhận cảm biến nhiệt độ đã được kết nối hay chưa.
while (ow_reset ()) {lcd_com (0x80); lcd_puts ("Vui lòng kết nối"); lcd_com (0xC0); lcd_puts ("Đầu dò Temp-Sense"); }
Bằng cách sử dụng đoạn mã này, chúng tôi khởi tạo cảm biến và gửi lệnh để chuyển đổi nhiệt độ.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); ghi_byte (0); ghi_byte (0); ghi_byte (độ phân giải 12bit); // Độ phân giải 12bit ow_reset (); ghi_byte (bỏ qua); write_byte (convert_temp);
Mã này là để lưu trữ dữ liệu nhiệt độ 12bit trong hai biến ngắn không dấu.
while (read_byte () == 0xff); __delay_ms (500); ow_reset (); ghi_byte (bỏ qua); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
Sau đó, nếu bạn kiểm tra mã hoàn chỉnh bên dưới, chúng tôi đã tạo điều kiện if-else để tìm ra dấu hiệu nhiệt độ là dương hay âm.
Bằng cách sử dụng mã lệnh If , chúng tôi thao tác dữ liệu và xem liệu nhiệt độ có âm hay không và xác định sự thay đổi nhiệt độ có nằm trong phạm vi +/-.20 độ hay không. Và phần khác, chúng tôi kiểm tra xem nhiệt độ có tích cực hay không và phát hiện sự thay đổi nhiệt độ.
mã
Nhận dữ liệu từ cảm biến nhiệt độ DS18B20:
Hãy xem khoảng cách thời gian của Giao diện 1-Wire®. Chúng tôi đang sử dụng Tinh thể 20Mhz. Nếu chúng ta nhìn vào bên trong tệp ds18b20.c, chúng ta sẽ thấy
#define _XTAL_FREQ 20000000
Định nghĩa này được sử dụng cho thói quen trì hoãn trình biên dịch XC8. 20Mhz được đặt làm tần số tinh thể.
Chúng tôi đã thực hiện năm chức năng
- ow_reset
- read_bit
- read_byte
- ghi_bit
- write_byte
Giao thức 1-Wire ® cần các khe cắm liên quan đến thời gian nghiêm ngặt để giao tiếp. Bên trong biểu dữ liệu, chúng ta sẽ nhận được thông tin liên quan đến thời gian hoàn hảo.
Bên trong hàm dưới đây, chúng tôi đã tạo khe thời gian chính xác. Điều quan trọng là phải tạo độ trễ chính xác cho việc giữ và nhả và điều khiển bit TRIS của cổng cảm biến tương ứng.
unsigned char ow_reset (void) {DQ_TRIS = 0; // Tris = 0 (đầu ra) DQ = 0; // đặt pin # ở mức thấp (0) __delay_us (480); // 1 dây yêu cầu thời gian trễ DQ_TRIS = 1; // Tris = 1 (input) __delay_us (60); // 1 dây yêu cầu thời gian trễ if (DQ == 0) // nếu có sự hiện diện pluse {__delay_us (480); trả về 0; // return 0 (1-wire là hiện diện)} else {__delay_us (480); trả về 1; // trả về 1 (1-wire KHÔNG hiện diện)}} // 0 = hiện diện, 1 = không có phần
Bây giờ theo mô tả khe thời gian dưới đây được sử dụng trong Đọc và Viết, chúng tôi đã tạo chức năng đọc và ghi tương ứng.
unsigned char read_bit (void) {unsigned char i; DQ_TRIS = 1; DQ = 0; // kéo DQ xuống thấp để bắt đầu khe thời gian DQ_TRIS = 1; DQ = 1; // sau đó trả về giá trị cao for (i = 0; i <3; i ++); // trì hoãn 15us kể từ đầu thời gian trả về (DQ); // giá trị trả về của dòng DQ} void write_bit (char bitval) {DQ_TRIS = 0; DQ = 0; // kéo DQ xuống thấp để bắt đầu khe thời gian if (bitval == 1) DQ = 1; // trả về DQ cao nếu ghi 1 __delay_us (5); // giữ giá trị cho phần còn lại của khe thời gian DQ_TRIS = 1; DQ = 1; } // Độ trễ cung cấp 16us cho mỗi vòng lặp, cộng thêm 24us. Do đó độ trễ (5) = 104us
Kiểm tra thêm tất cả các tệp tiêu đề và.c liên quan tại đây.
Vì vậy, đây là cách chúng ta có thể sử dụng cảm biến DS18B20 để nhận nhiệt độ với Vi điều khiển PIC.
Nếu bạn muốn chế tạo một Nhiệt kế kỹ thuật số đơn giản với LM35, hãy xem các dự án bên dưới với các Bộ vi điều khiển khác:
- Đo nhiệt độ phòng với Raspberry Pi
- Nhiệt kế kỹ thuật số sử dụng Arduino và LM35
- Nhiệt kế kỹ thuật số sử dụng LM35 và 8051
- Đo nhiệt độ sử dụng LM35 và Vi điều khiển AVR