Điều chỉnh mực nước bằng sóng siêu âm sử dụng vi điều khiển 8051 và module HC-SR04
Điều khiển mực nước sử dụng vi điều khiển 8051
Bộ điều chỉnh mực nuớc đơn giản sử dụng module xác định phạm vi sóng siêu âm và vi điều khiển 8051 sẽ là tiêu điểm được thảo luận trong bài viết này. Đây chỉ là một phần ứng dụng của module sóng siêu âm. Bộ điều chỉnh mực nước này có thể giám sát và điều chỉnh một lượng thể tích nước bất kỳ độ sâu 2m, với sự sai số nhỏ hơn 1cm. Vì không sử dụng công tắc dòng chảy cơ học hay cực điện nên sẽ không có sự hao mòn cơ học hay hao mòn do oxi hoá, điều này làm hệ thống có sự chính xác cao. Thế nhưng sự chăm sóc và bảo dưỡng hợp lý cũng rất cần thiết do module siêu âm cần được thiết kế giảm xóc vì nó chứa nhiều linh kiện điện tử
Bộ module siêu âm HC-SR04
HC-SR04 bao gồm bộ truyền, bộ nhận sóng siêu âm và các thành phần điện tử cần thiết cho việc cấu thành nên một hệ thống hoạt động tách rời. Nguyên lý hoạt động của module này khá đơn giản. Nó sẽ truyền 8 xung sóng âm thanh tần số 40KHz và nhận các sóng phản xạ về. Thởi gian chênh lệch giữa việc truyền và nhận sẽ được tính toán, khoảng cách sẽ được tính theo công thức D=TS/2 với D là khoảng cách, T là thời gian trễ và S là vận tốc âm thanh. Ngõ ra của HC-SR04 sẽ là một xung với độ rộng tỷ lệ thuận với khoảng cách truyền đi. Từ datasheet, ta thấy độ rộng tín hiệu ngõ ra echo là 58uS với tương ứng với khoảng cách 1cm. Việc chúng ta cần làm là gửi một tín hiệu độ rộng 10uS tới ngõ vào trigger của module và chờ xung ngõ ra tại đầu ra echo của module.
Sơ đồ toàn mạch của bộ điều khiển mực nước bằng sóng siêu âm sử dụng vi điều khiển 8051 thể hiện như hình dưới đây
Chân Trigger của module siêu âm được kết nối với chân P3.0 của vi điều khiển. Chân Echo của module được kết nối với chân P3.1 của vi điều khiển. Các đường dữ liệu của LCD là module được giao tiếp qua Port0 của vi điều khiển. Các đường điều khiển RS, RW và E của module LCD được kết nối với các chân P2.7, P2.6 và P2.5 của vi điều khiển. Bơm (12V DC pump) được điều khiển bằng cổng P2.0 của vi điều khiển. Máy bơm được sử dụng ở đây là máy bơm nước rửa kính chắn gió cho ô tô. Các máy bơm khác cũng sẽ mắc theo mạch này nhưng mức dòng điện được cấp cho chúng phải phù hợp với rơle bạn đang sử dụng. Cẩn thận để tránh nguy cơ bị điện giật khi làm việc với nguồn điện khi các thiết bị hoạt động.
Ở đây, module siêu âm được đặt trên đỉnh bể đối diện với mặt nước. Nước phản xạ các xung siêu âm phát ra từ module. Module thu lại các sóng phản xạ và đo độ trễ thời gian. Khoảng cách giữa mặt nước và cảm biến được tính từ dữ liệu thu thập được và module tạo ra một xung có chiều rộng tỷ lệ thuận với khoảng cách. Bộ vi điều khiển đọc độ rộng của xung đầu ra này và thực hiện các phép toán cần thiết trên nó để có được khoảng cách. Ở đây chúng ta có thể thấy rằng mực nước được đo từ trên xuống dưới không giống như hầu hết các cảm biến đo mức từ dưới lên trên. Điều này được thực hiện để làm cho thiết bị này phù hợp với nhiều độ sâu. Vì cảm biến được đặt trên đỉnh bể, chúng ta cần trừ khoảng cách từ cảm biến đến mặt nước từ tổng độ sâu của bể để có được mức nước từ dưới lên trên. Vì các bể khác nhau có độ sâu khác nhau, người dùng cá nhân phải đo độ sâu của bể theo cách thủ công và thay đổi chương trình với dữ liệu này.
Vấn đề này được giải quyết bằng cách đo mức độ từ trên xuống dưới. Tại đây, thiết bị sẽ chuyển sang trạng thái bật máy bơm khi mức nước giảm xuống dưới 20 cm so với đỉnh và tắt bơm khi mức tăng lên 5 cm so với đỉnh (đỉnh ở đây là cảm biến). Mức hiển thị trên màn hình LCD thực sự là độ sâu của mặt nước từ trên xuống. Bể có độ sâu lên tới 1,5 mét sẽ phù hợp với dự án này.
Viết chường trình:
RS EQU P2.7 ;equates RS to P2.7
RW EQU P2.6 ;equates RW to P2.6
E EQU P2.5 ;equates E to P2.5
ORG 00H ;origin
MOV DPTR,#LUT ;move starting address of LUT to DPTR
CLR P3.0 ;clears P3.0(output)
SETB P3.1 ;sets p3.1(input)
MOV TMOD,#00100001B ;sets Timer1 as Mode2 timer and Timer0 as Mode1 timer
MAIN:ACALL DINT ;calls DINT subroutine
ACALL TEXT1 ;calls TEXT1 subroutine
MOV TL1,#200D ;loads TL1 with start value
MOV TH1,#200D ;loads TH1 with reload value
MOV A,#00000000B ;loads A with all Zeros
SETB P3.0 ;sets P3.0(trigger pulse)
ACALL DELAY1 ;calls DELAY1 subroutine (1uS)
CLR P3.0 ;clears P3.0
HERE: JNB P3.1,HERE ;loops here until echo is received
BACK:SETB TR1 ;statrs Timer1
HERE1:JNB TF1,HERE1 ;loop here until Timer1 roll over occurs
CLR TR1 ;stops Timer1
CLR TF1 ;clears Timer Flag 1
INC A ;Increments accumulator
JB P3.1,BACK ;jumps to label BACK if echo is still present
MOV R7,A ;saves accumulator to R7
ACALL SPLIT ;calls SPLIT subroutine
ACALL LINE2 ;calls LINE2 subroutine
ACALL LEVEL ;calls LEVEL subroutine
ACALL TEXT2 ;calls TEXT2 subroutine
ACALL TEXT3 ;calls TEXT3 subroutine
ACALL CHECK ;calls CHECK subroutine
JB P2.0,JUMP ;jumps to label JUMP if P2.0 is set
ACALL TEXT4 ;calls TEXT4 subroutine
SJMP EXIT2 ;jumps to label EXIT2
JUMP:ACALL TEXT5 ;calls TEXT5 subroutine
EXIT2:ACALL DELAY2 ;calls DELAY2 subroutine(1S)
SJMP MAIN ;jumps to label MAIN
CHECK:MOV A,R7 ;loads value of R7 to accumulator
SUBB A,#20D ;subtracts 20D from A
JNC ON ;jumps to label ON if carry flag not set(A>20D)
ACALL OFF ;else calls OFF subrotine
SJMP EXIT ;jumps to label EXIT
ON:SETB P2.0 ;sets P2.0 (motor ON)
EXIT:CLR CY ;clears carry flag
RET ;return from subroutine
OFF: MOV A,R7 ;loads value of R7 to accumulator
SUBB A,#5D ;subtracts 5D from A
JNC EXIT1 ;jumps to label EXIT1 if carry flag not set(A>5D)
CLR P2.0 ;else clears P2.0(motor OFF)
EXIT1:CLR CY ;clears carry flag
RET ;return from subroutine
DELAY1: MOV R6,#2D ;loads R6 with 2D
LABEL1: DJNZ R6,LABEL1 ;loops here until R6 is 0
RET ;return from subroutine
DELAY2:MOV R0,#15D ;loads R0 with 15D
BACK1: MOV TH0,#00000000B ;loads TH0 with start value
MOV TL0,#00000000B ;loads TL0 with start value
SETB TR0 ;starts Timer0
HERE2: JNB TF0,HERE2 ;loops here until roll over occurs
CLR TR0 ;stops Timer0
CLR TF0 ;clear Timer Flag 0
DJNZ R0,BACK1 ;loops the timer session 15 times for 1S delay
RET ;return from subroutine
TEXT1: MOV A,#48H ;ascii of "H"
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#32H ;ascii of "2"
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#4FH ;ascii of "0"
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#20H ;ascii of " "
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#4CH ;ascii of "L"
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#45H ;ascii of "E"
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#56H ;ascii of "V"
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#45H ;ascii of "E"
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#4CH ;ascii of "L"
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#20H ;ascii of " "
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#43H ;ascii of "c"
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#54H ;ascii of "T"
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#52H ;ascii of "R"
ACALL DISPLAY ;calls DISPLAY subroutine
MOV A,#4CH ;ascii of "L"
ACALL DISPLAY ;calls DISPLAY subroutine
RET ;return from subroutine
TEXT2: MOV A,#63H ;ascii of "c"
Hotline: 0979 466 469