Giám sát mực nước không tiếp xúc dựa trên IoT với ESP32 và HC-SR04

Giám sát mực nước không tiếp xúc dựa trên IoT với ESP32 và HC-SR04

Trong dự án IoT này, chúng tôi sẽ tạo ra một máy chủ web giám sát mực nước bằng cách sử dụng cảm biến siêu âm HC-SR04 và ESP32. Nó sẽ là một hệ thống đo mực nước không tiếp xúc. Đầu tiên, chúng ta sẽ học cách giao tiếp HC-SR04 với ESP32. Sau đó, chúng ta sẽ thấy chương trình bảng ESP32 của chúng tôi với cảm biến siêu âm để xây dựng máy chủ web màn hình nước của chúng tôi. Máy chủ web sẽ hiển thị mực nước hiện tại được đo bằng khoảng cách tính bằng cm bởi HC-SR04. Vì vậy, hãy bắt đầu!

Bây giờ, trước tiên chúng ta hãy thảo luận về các thành phần khác nhau của hệ thống giám sát mực nước không tiếp xúc cơ sở IoT như cảm biến siêu âm, sơ đồ kết nối với ESP32 và bản phác thảo Arduino. Cuối cùng, chúng ta sẽ thấy một bản demo video.

Giới thiệu cảm biến siêu âm HC-SR04

Để giao tiếp cảm biến siêu âm HC-SR04 với ESP32, chúng ta nên biết chức năng của từng chân của cảm biến siêu âm. Bằng cách biết chức năng của chân đầu vào và đầu ra, chúng tôi sẽ có thể xác định chân GPIO nào của ESP32 nên được sử dụng để giao tiếp với HC-SR04.

Sơ đồ chân HC-SR04

Hình dưới đây cho thấy cấu hình pin của cảm biến siêu âm. Nó bao gồm bốn chân cụ thể là; Vcc, Ground, Trigger và Echo pin.

Sơ đồ pinout cảm biến siêu âm HC-SR04

Vcc và Ground được sử dụng để cung cấp năng lượng cho cảm biến. Chúng ta nên cung cấp 5 volt cho chân Vcc và kết nối chân GND với cực nối đất của nguồn điện.

Trigger: Nó là một chân đầu vào. Chân kích hoạt được sử dụng để khởi động cảm biến siêu âm để bắt đầu đo khoảng cách hoặc phạm vi khoảng cách. Khi người dùng muốn nhận các phép đo khoảng cách từ cảm biến, chúng tôi áp dụng xung 10μs cho chân này.

Echo Pulse: Đây là một chân đầu ra xung. Chân dội lại tạo ra xung dưới dạng đầu ra. Độ rộng của xung hoặc đúng giờ của xung phụ thuộc vào khoảng cách giữa cảm biến siêu âm và chướng ngại vật được đặt trước cảm biến HC-SR04. Trong điều kiện không tải, chân này vẫn ở mức thấp hoạt động.

Thông tin chi tiết về hoạt động của cảm biến siêu âm được cung cấp trong phần tiếp theo.

Cảm biến HC-SR04 hoạt động như thế nào?

Cảm biến siêu âm HC-SR04 đo khoảng cách bằng cách sử dụng sóng âm thanh siêu âm không nghe được tần số 40KHz. Giống như sóng âm thanh, sóng siêu âm truyền qua không khí và nếu có bất kỳ chướng ngại vật nào trước mặt, chúng phản xạ theo góc độ tới của chúng. Hơn nữa, nếu một vật thể được đặt song song với máy phát siêu âm, sóng siêu âm phản xạ chính xác ở góc 180 độ. Do đó, để đo khoảng cách với cảm biến HC-SR05, chúng tôi đặt đối tượng đang được thử nghiệm chính xác ở vị trí song song với cảm biến siêu âm như trong hình bên dưới.

HC-SR04 và vị trí khoảng cách đối tượng

Cảm biến siêu âm HC-SR05 bao gồm hai mô-đun cơ bản như máy phát siêu âm và mô-đun máy thu siêu âm. Mạch máy phát chuyển đổi tín hiệu điện thành một loạt 40KHz gồm 8 xung sóng sonar. Tín hiệu điện đầu vào mạch máy phát là đầu vào xung 10μs đến chân kích hoạt của cảm biến HC-SR04. Như chúng tôi đã đề cập trước đó, chúng tôi áp dụng tín hiệu đầu vào kích hoạt này thông qua ESP32 hoặc bất kỳ vi điều khiển nào. Mặt khác, mạch máy thu siêu âm lắng nghe các sóng siêu âm được tạo ra bởi mạch phát.

Đo thời gian xung tiếng vang HC-SR04 với ESP32

Cảm biến siêu âm HC-SR04 hoạt động

  • Để bắt đầu phạm vi với HC-SR04, đầu tiên, chúng tôi áp dụng xung 10μs cho chân kích hoạt của cảm biến HC-SR04 từ chân đầu ra kỹ thuật số ESP32.

  • Ngay khi tín hiệu kích hoạt đầu vào 10μs trở nên hoạt động thấp, mạch máy phát tạo ra một loạt 8 xung sonar siêu âm. Đồng thời, chân Echo cũng thực hiện chuyển đổi từ mức thấp logic sang mức cao logic.

  • Khi chân Echo tăng cao, Chúng tôi bắt đầu đo thời gian bằng chức năng đo thời lượng ESP32.

  • Những sóng này truyền qua không khí và nếu có bất kỳ vật thể nào được đặt song song với cảm biến, những sóng này sẽ phản xạ trở lại sau khi va chạm với vật thể.

  • Ngay sau khi sóng siêu âm nhận được bởi mạch thu sau khi tấn công với một vật thể, chân tiếng vọng sẽ xuống thấp. ESP32 phát hiện sự chuyển đổi này của tín hiệu đầu ra tiếng vang từ mức cao hoạt động sang mức thấp hoạt động và dừng phép đo.

Nói tóm lại, bằng cách đo đúng thời gian của tín hiệu xung đầu ra Echo, chúng ta có thể đo khoảng cách. Hình dưới đây minh họa tín hiệu đầu ra tiếng vang với tín hiệu kích hoạt đầu vào tôn trọng và 8 xung sonar.

Sơ đồ thời gian HC-SR04

Thời lượng mà tín hiệu đầu ra tiếng vang vẫn cao phụ thuộc vào khoảng cách giữa cảm biến siêu âm và đối tượng mà chúng ta đặt trước cảm biến. Khoảng cách càng cao, thời gian sóng sonar sẽ mất càng cao để quay trở lại mạch thu siêu âm. Bởi vì sóng siêu âm truyền qua không khí với tốc độ âm thanh và tốc độ không đổi.

Cách chuyển đổi khoảng thời gian thành khoảng cách

Trong phần tiếp theo, chúng ta sẽ xem cách đo thời lượng xung bằng ESP32. Giả sử rằng chúng ta đã đo xung đầu ra đúng giờ (t) bằng ESP32. Bây giờ câu hỏi là làm thế nào để chuyển đổi thời gian đo được này thành khoảng cách.

Chà, đây là phần rõ ràng nhất của hướng dẫn này. Ở trường trung học, tất cả chúng ta đều nghiên cứu một phương trình khoảng cách thời gian nổi tiếng là S = vt. Chúng ta có thể chuyển đổi thời lượng xung (t) thành khoảng cách (S) bằng phương trình này.

Distance (S) = Speed (v) * t  //distance in meters

Ở đây v là tốc độ của sóng siêu âm trong không khí. Tốc độ của sóng siêu âm trong không khí bằng với tốc độ âm thanh là 340 m / s (mét trên giây).

Phương trình trên sẽ cho đầu ra khoảng cách tính bằng đơn vị mét. Tuy nhiên, nếu bạn muốn khoảng cách tính bằng đơn vị centimet, hãy nhân 340 với 100. Do đó, phương trình trên trở thành:

S = 34000 * t   // distance in cm

Thời gian đưa ra trong công thức trên cũng nên được chia cho hai. Bởi vì sóng siêu âm truyền từ máy phát đến chướng ngại vật và sau đó phản xạ trở lại mạch thu bằng cách di chuyển cùng một khoảng cách. Chúng tôi chỉ muốn tìm khoảng cách giữa HC-SR04 và đối tượng. Do đó, công thức tính khoảng cách trở thành:

S = 17000 * t    // distance in cm

Cách giao diện cảm biến siêu âm HC-SR04 với ESP32

Cho đến bây giờ chúng ta đã thấy hoạt động của cảm biến siêu âm và các chi tiết pin. Bây giờ chúng ta biết rằng để giao tiếp cảm biến HC-SR04 với ESP32, chúng ta cần bốn chân trong đó hai chân là chân cấp nguồn và hai chân là chân đầu ra đầu vào kỹ thuật số. Một chân GPIO của ESP32 sẽ được sử dụng làm chân đầu ra kỹ thuật số để cung cấp tín hiệu kích hoạt cho cảm biến siêu âm. Tương tự, một chân GPIO sẽ được sử dụng làm chân đầu vào kỹ thuật số để thu tín hiệu đầu ra tiếng vang của cảm biến đầu ra.

Cảm biến siêu âm HC-SR04 giao tiếp với ESP32

Bây giờ thực hiện kết nối ESP32 với cảm biến HC-SR04 theo sơ đồ kết nối này. Trong sơ đồ sơ đồ này, chúng tôi sử dụng chân GPIO5 của ESP32 để cung cấp tín hiệu kích hoạt và GPIO18 để ghi lại xung đầu ra tiếng vang.

HC-SR04 ·

ESP32 ·

VCC

Vin

GND ·

GND ·

Trigger

GPIO5 ·

Echo Pulse

GPIO18 ·

Chúng tôi sẽ thiết lập cảm biến siêu âm trên đầu một thùng chứa sẽ mang nước. Bằng cách này, chúng tôi sẽ có thể xác định mực nước bằng cách lấy khoảng cách (cm) từ cảm biến gửi nó đến máy chủ web giám sát mực nước ESP32.

Đây là cách thiết lập trông như thế nào:

Cảm biến siêu âm với ESP32 Phần cứng theo dõi mực nước

Thiết lập Arduino IDE

Chúng tôi sẽ sử dụng Arduino IDE để lập trình bảng phát triển ESP32 của chúng tôi. Vì vậy, bạn nên có phiên bản Arduino IDE mới nhất. Ngoài ra, bạn cũng cần cài đặt plugin cho bo mạch tương ứng mà bạn sẽ sử dụng.

Nếu IDE của bạn chưa cài đặt plugin, bạn có thể truy cập liên kết bên dưới:

Arduino Sketch ESP32 Giám sát mực nước Máy chủ web

Mở Arduino IDE của bạn và đi tới Tệp > Mới để mở tệp mới.

Sao chép mã được cung cấp bên dưới trong tệp đó. Bạn sẽ phải thay thế thông tin đăng nhập mạng để kết nối thành công với WiFi cục bộ của mình.

#include <WiFi.h>

#include <WiFiClient.h>

#include <WebServer.h>

 

int trigger_pin = 5;

int echo_pin   = 18;

 

// Replace with your network credentials

const char* ssid = "MASTERS";

const char* password = "english123";

 

WebServer server(80);

 

String page = "";

int distance_cm;

 

void setup() {

  Serial.begin(115200);

  pinMode(trigger_pin, OUTPUT);

  pinMode(echo_pin, INPUT);

  delay(1000);

 

  WiFi.begin(ssid, password);

  Serial.println("");

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println("");

  Serial.print("IP address: ");

  Serial.println(WiFi.localIP());

 

  server.on("/", []() {

    page = "<head><meta http-equiv=\"refresh\" content=\"3\"></head><center><h1>Ultasonic Water Level Monitor</h1><h3>Current water level:</h3> <h4>" + String(distance_cm) + "</h4></center>";

    server.send(200, "text/html", page);

  });

  server.begin();

  Serial.println("Web server started!");

}

 

void loop() {

  digitalWrite(trigger_pin, LOW);

  delayMicroseconds(2);

  digitalWrite(trigger_pin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigger_pin, LOW);

  long duration = pulseIn(echo_pin, HIGH);

  distance_cm = (duration / 2) / 29.09;

  Serial.println(distance_cm);

  server.handleClient();

  delay(3000);

}

Mã hoạt động như thế nào?

Đầu tiên, chúng tôi sẽ bao gồm các thư viện cần thiết. Vì chúng tôi phải kết nối ESP32 của mình với mạng không dây, chúng tôi cần thư viện WiFi.h cho mục đích đó. WebServer.h sẽ được yêu cầu để xây dựng máy chủ web.

#include <WiFi.h>

#include <WiFiClient.h>

#include <WebServer.h>

Tiếp theo, chúng tôi sẽ xác định tên của các chân ESP32 mà chúng tôi đã kết nối với các chân Trigger và Echo của cảm biến. Dòng sau xác định rằng các chân GPIO5 và GPIO18 của ESP32 được sử dụng để điều khiển các chân kích hoạt và tiếng vang của cảm biến HC-SR04 tương ứng.

 

int trigger_pin = 5;

int echo_pin   = 18;

Tiếp theo, chúng ta sẽ tạo hai biến toàn cục, một biến cho SSID và một biến khác cho mật khẩu. Chúng sẽ giữ thông tin đăng nhập mạng của chúng tôi sẽ được sử dụng để kết nối với bộ định tuyến không dây của chúng tôi. Thay thế cả hai bằng thông tin đăng nhập của bạn để đảm bảo kết nối thành công.

// Replace with your network credentials

const char* ssid = "YOUR_SSID";

const char* password = "YOUR_PASSWORD";

Đối tượng WebServer sẽ được sử dụng để thiết lập máy chủ web ESP32. Chúng ta sẽ truyền cổng HTTP mặc định là 80, làm đầu vào cho hàm xây dựng. Đây sẽ là cổng nơi máy chủ sẽ lắng nghe các yêu cầu.

 

WebServer server(80);

Biến số nguyên 'distance_cm' sẽ giữ giá trị cho khoảng cách tính bằng cm.

 

int distance_cm;

thiết lập()

Bên trong hàm setup(), chúng ta sẽ mở giao tiếp nối tiếp với tốc độ truyền là 115200.

Serial.begin(115200);

Ngoài ra, khởi tạo trigger_pin dưới dạng chân đầu ra kỹ thuật số và echo_pin làm chân đầu vào kỹ thuật số bằng chức năng pinMode ().

  pinMode(trigger_pin, OUTPUT);

  pinMode(echo_pin, INPUT);

Phần mã sau đây sẽ kết nối bo mạch ESP32 của chúng tôi với mạng cục bộ có thông tin đăng nhập mạng mà chúng tôi đã chỉ định ở trên. Sau khi kết nối được thiết lập, địa chỉ IP của bo mạch ESP32 sẽ được in trên màn hình nối tiếp. Điều này sẽ giúp chúng tôi thực hiện một yêu cầu đến máy chủ.

 WiFi.begin(ssid, password);

  Serial.println("");

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println("");

  Serial.print("IP address: ");

  Serial.println(WiFi.localIP());

Các dòng sau tạo máy chủ web HTML và khởi động nó. Sử dụng on() trên đối tượng server của chúng ta, chúng ta sẽ xử lý / URL. Trang HTML sẽ được xây dựng với ba tiêu đề hiển thị 'Màn hình mực nước siêu âm', 'Mực nước hiện tại' và khoảng cách tính bằng cm. Ngoài ra, trang web sẽ tự động làm mới sau mỗi 3 giây để hiển thị kết quả đọc hiện tại.

Ngoài ra, phương thức send() sẽ được sử dụng để trả về phản hồi. Nó có ba tham số. Tham số đầu tiên là mã phản hồi mà chúng ta sẽ chỉ định là 200. Nó là mã phản hồi HTTP cho ok. Tham số thứ hai là loại nội dung của phản hồi mà chúng ta sẽ chỉ định là "text / html" và tham số thứ ba là thông báo thực tế mà chúng ta sẽ được gửi dưới dạng phản hồi HTTP.

Để start server, chúng ta sẽ gọi begin() trên đối tượng server của chúng ta.

 server.on("/", []() {

    page = "<head><meta http-equiv=\"refresh\" content=\"3\"></head><center><h1>Ultasonic Water Level Monitor</h1><h3>Current water level:</h3> <h4>" + String(distance_cm) + "</h4></center>";

    server.send(200, "text/html", page);

  });

  server.begin();

  Serial.println("Web server started!");

vòng lặp()

Bên trong hàm loop(), trước tiên chúng ta sẽ cung cấp xung 10μs cho chân kích hoạt. Điều này là để cho phép phạm vi dữ liệu từ cảm biến HC-SR04. Nó sẽ bắt đầu quá trình lấy mẫu khoảng cách.

 

  digitalWrite(trigger_pin, LOW);

  delayMicroseconds(2);

  digitalWrite(trigger_pin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigger_pin, LOW);

Ngay sau khi chúng tôi áp dụng xung 10μs cho cảm biến siêu âm, để đáp lại, nó tạo ra sóng sonar 40KHz và tăng tín hiệu đầu ra Echo lên trạng thái cao hoạt động. Tín hiệu đầu ra tiếng vang vẫn hoạt động cao cho đến khi các sóng sonar này phản xạ trở lại máy phát siêu âm. Ngay khi, mạch thu nhận được các sóng này, tín hiệu đầu ra tiếng vang đi đến mức thấp hoạt động.

Chúng tôi đo thời gian mà tín hiệu đầu ra vẫn ở trạng thái cao hoạt động bằng cách sử dụng hàm pulseIn (). Chuyển echo_pin làm tham số đầu tiên và trạng thái 'CAO' của nó làm tham số thứ hai. Lần này chúng ta sẽ lưu trong biến 'duration'.

long duration = pulseIn(echo_pin, HIGH);

Hàm pulseIn() được sử dụng để đo thời lượng xung và nó trả về đầu ra khoảng thời gian tính bằng micro giây. Nhưng công thức của mối quan hệ khoảng cách-thời gian mà chúng ta rút ra ở trên hoạt động nếu cả tốc độ và thời gian đều có cùng đơn vị về thời gian như giây, micro giây hoặc mili giây. Trong phương trình này, đơn vị cho tốc độ là centimet trên giây.

S = 17000 * t

Để chuyển đổi tốc độ thành centimet trên micro giây, hãy chia phương trình này với 10 ^ -6. Bây giờ các đơn vị tốc độ và thời gian cả hai đều tương thích với nhau.

S = 0,017* t

Sau đó, chúng tôi sẽ tính khoảng cách tính bằng cm bằng cách sử dụng phép tính dưới đây. Điều này sẽ được lưu trong biến 'distance_cm' mà chúng ta đã xác định trước đó.

 distance_cm = (duration / 2) / 29.09;

Giá trị này được in trong màn hình nối tiếp và cũng được gửi đến máy chủ web ESP32.

 Serial.println(distance_cm);

  server.handleClient();

  delay(3000);

Trình diễn giám sát mực nước dựa trên IoT

Đảm bảo rằng bạn chọn đúng bảng và cổng COM trước khi tải mã của mình lên bảng. Đi tới Bảng > Công cụ và chọn Mô-đun ESP32 Dev.

Chọn bảng ESP32

Tiếp theo, đi tới Công cụ > Cổng và chọn cổng thích hợp mà qua đó bảng của bạn được kết nối.

Chọn COM PORT ESP32

Nhấp vào nút tải lên để tải mã lên bảng phát triển ESP32.
Sau khi bạn đã tải mã của mình lên bảng phát triển, hãy nhấn nút BẬT của nó.

Nút đặt lại bật ESP32

Trong Arduino IDE của bạn, hãy mở màn hình nối tiếp và bạn sẽ có thể thấy địa chỉ IP của mô-đun ESP32 cũng như các bài đọc từ xa.

Cảm biến siêu âm với màn hình mực nước ESP32 màn hình nối tiếp demoMàn hình nối tiếp

Nhập địa chỉ IP này vào trình duyệt web mới và nhấn enter. Trang web sau đây sẽ mở ra.

Cảm biến siêu âm với ESP32 Water level monitor web server 1

Bạn có thể xem chỉ số mực nước hiện tại. Hiện tại là 23 cm vì thùng chứa trống rỗng và 23 cm là tổng chiều dài của container.

Bây giờ bắt đầu đổ nước vào thùng chứa và giá trị sẽ bắt đầu giảm. Ở mức trung bình, giá trị xấp xỉ 11 cm.

Tương tự như vậy, khi mực nước tăng khoảng cách (cm) giảm.

Cảm biến siêu âm với ESP32 Water level monitor web server 2

Cảm biến siêu âm với ESP32 Water level monitor web server 3

>>> 1000+ Mã Sản Phẩm của thương hiệu Bosch: https://mecsu.vn/thuong-hieu/bosch 

>>> 350+ Mã Sản Phẩm của thương hiệu Sata: https://mecsu.vn/thuong-hieu/sata 

 

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn