Professional Documents
Culture Documents
NHÓM 4
Phân công nhiệm vụ cho từng thành viên
Công Thiết Viết Viết Lắp ráp Thuyết
việc/ kế code báo cáo Trình
Tên
Lê Tuấn 10% 0% 50% 10% 20%
Kiệt
Nguyễn 10% 90% 0% 80% 20%
Minh
Nhựt
Nguyễn 10% 0% 50% 20% 20%
Thế
Khang
Nguyễn 50% 0% 20% 15% 20%
Hồng
Quang
Trần 50% 10% 20% 0% 20%
Ngọc
Đức
Đề tài: Sử dụng ESP32 thu thập dữ liệu từ cảm biến khí gas với cảm biến
nhiệt độ và độ ẩm hiển thị lên lcd với app trên điện thoại sử dụng giao
thức TCP/IP với I2C
Đề tài mà nhóm em đề cập bao gồm việc sử dụng ESP32 để thu thập dữ liệu từ cảm
biến khí gas, cùng với cảm biến nhiệt độ và độ ẩm, và hiển thị thông tin này lên
màn hình LCD. Bên cạnh đó, là sử dụng một ứng dụng trên điện thoại thông qua
giao thức TCP/IP để truy cập và hiển thị dữ liệu từ ESP32, sử dụng giao tiếp I2C để
kết nối các thành phần.
Đầu tiên, ESP32 được sử dụng như một vi điều khiển chính để thu thập dữ liệu từ
các cảm biến khí gas, cảm biến nhiệt độ và độ ẩm. ESP32 có tích hợp sẵn giao tiếp
I2C, cho phép nó kết nối với các cảm biến thông qua giao thức này. ESP32 có khả
năng đọc dữ liệu từ các cảm biến và lưu trữ chúng để sử dụng sau này.
Tiếp theo, một màn hình LCD được kết nối với ESP32 thông qua giao tiếp I2C.
Màn hình LCD sẽ hiển thị thông tin như dữ liệu khí gas, nhiệt độ và độ ẩm mà
ESP32 thu thập được từ các cảm biến. ESP32 sử dụng các thư viện phù hợp để điều
khiển màn hình LCD và hiển thị thông tin tương ứng lên màn hình.
Để truy cập và hiển thị thông tin từ ESP32 trên điện thoại thông qua giao thức
TCP/IP, bạn cần phát triển một ứng dụng trên điện thoại di động. Ứng dụng này sẽ
kết nối với ESP32 thông qua mạng TCP/IP và gửi yêu cầu để nhận thông tin từ
ESP32. ESP32 sẽ phản hồi bằng cách gửi dữ liệu thu thập được từ các cảm biến.
Điện thoại di động sẽ hiển thị thông tin này lên giao diện ứng dụng.
Giao tiếp I2C được sử dụng để kết nối ESP32 với màn hình LCD, trong khi giao
thức TCP/IP được sử dụng để kết nối ESP32 với ứng dụng trên điện thoại di động.
ESP32 sẽ hoạt động như một máy chủ TCP/IP, và điện thoại di động sẽ hoạt động
như một máy khách TCP/IP. Khi điện thoại di động yêu cầu dữ liệu từ ESP32,
ESP32 sẽ gửi dữ liệu thông qua giao thức TCP/IP để điện thoại di động hiển thị.
3. Sơ đồ các khối
4. Lưu đồ giải thuật
5. Mã nguồn của chương trình
/*----------------------------------------------------------*/
#include <DHT.h> # Câu lệnh này bao gồm thư viện <DHT.h>. Thư viện này cung
cấp các chức năng để đọc dữ liệu từ cảm biến <DHT1> hoặc <DHT22>.
//#include <DHT_U.h>
#define Gas 34 # Định nghĩa hằng số Gas với giá trị 34. Hằng số này được sử dụng
để xác định chân GPIO được kết nối với cảm biến khí gas.
#define Led 2 # Định nghĩa hằng số Led với giá trị 2
#define Gas2 0 # Định nghĩa hằng số Gas2 với giá trị 0
#define Fan 3 # Định nghĩa hằng số Fan với giá trị 3
/*----------------------------------------------------------*/
#define BLYNK_TEMPLATE_ID "TMPL60Lo-ESlj"
#define BLYNK_TEMPLATE_NAME "Esp32S NodeMcuCopy"
#define BLYNK_AUTH_TOKEN "TZczixmGaWVX3ZVoIE8aBI986Wmy7688"
//#define BLYNK_FIRMWARE_VERSION "0.1.0"
#define BLYNK_PRINT Serial
#include <WiFi.h> # Khai báo thư viện <Wifi.h>
#include <WiFiClient.h> # Khai báo thư viện <WifiClient.h>
#include <BlynkSimpleEsp32.h> # Khai báo thư viện <BlynkSimpleEsp32.h>
BlynkTimer timer; # Tạo ra một đối tượng timer của lớp BlynkTimer. Lớp
BlynkTimer được sử dụng để tạo các bộ đếm thời gian trong Blynk.
int flag = 0; # Khai báo biến flag kiểu int và khởi tạo giá trị ban đầu là 0
char ssid[] = "Nguyen Nhut"; # Khai báo mảng ký tự ssid và khởi tạo giá trị là
chuỗi "Nguyen Nhut". Mảng ssid được sử dụng để lưu trữ tên mạng WiFi.
char pass[] = "0987654321"; # Khai báo mảng ký tự pass và khởi tạo giá trị là
chuỗi "0987654321". Mảng pass được sử dụng để lưu trữ mật khẩu mạng WiFi.
/*----------------------------------------------------------*/
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Gas: ");
lcd.print(g);
lcd.print("PPM");
lcd.setCursor(0,1);
lcd.print("Fan: ");
if (f==1){
lcd.print("On");
}
else {
lcd.print("Off");
}
# if (f==1): Kiểm tra xem f có bằng 1 hay không.
# Nếu f == 1: In ra "On" (Bật) trên màn hình LCD.
# else: Nếu f không bằng 1.
# In ra "Off" (Tắt) trên màn hình LCD.
delay(2000);
}
void notification() # Hàm notification() này có chức năng kiểm tra cảm biến khí gas
thứ hai (Gas2) và thực hiện các hành động cảnh báo khi phát hiện rò rỉ khí gas.
{
if (digitalRead(Gas2)==1 && flag==0)
# Kiểm tra xem chân Gas2 có đang ở mức cao (HIGH) hay không. Mức cao thường
biểu thị khí gas được phát hiện.
# Kiểm tra xem biến flag có bằng 0 hay không. Biến flag được sử dụng để đánh dấu
trạng thái cảnh báo đã được kích hoạt.
# Điều kiện thỏa mãn: Cảm biến Gas2 báo gas ( mức cao) và flag bằng 0 (chưa
cảnh báo).
{
digitalWrite(Led,0); # Bật đèn LED (mức thấp thường dùng để bật đèn).
Serial.println(); # In xuống dòng trên màn hình nối tiếp.
Serial.println("Attention! Gas leak detected!"); # In ra thông báo "Attention! Gas
leak detected!" (Chú ý! Phát hiện rò rỉ khí gas!).
//Blynk.email("nguyennhut09102003@gmail.com","Gas", "Attention! Gas leak
detected!");
Blynk.logEvent("alarm","Gas Leakage Detected"); # Gửi log sự kiện "alarm" với
nội dung "Gas Leakage Detected" (Phát hiện rò rỉ khí gas) lên Blynk.
flag = 1; # Thiết lập flag thành 1 để đánh dấu trạng thái cảnh báo đã được kích
hoạt.
if(digitalRead(Fan) == 0)
# Kiểm tra trạng thái quạt hiện tại: digitalRead(Fan) == 0 - Kiểm tra xem chân Fan
có đang ở mức thấp (LOW) hay không (nguyên tắc điều khiển quạt có thể khác
nhau).
{
if(fanState == 1){
digitalWrite(Fan,1);
Blynk.virtualWrite(V4,digitalRead(Fan));
delay(200);
fanState=0;
}
}else{
fanState=1;
}
# Kiểm tra trạng thái bật/tắt quạt mong muốn (fanState): if(fanState == 1): Nếu
fanState bằng 1 (mong muốn bật quạt).
# digitalWrite(Fan, 1);: Bật quạt (mức cao thường dùng để bật quạt).
# Blynk.virtualWrite(V4, digitalRead(Fan));: Gửi trạng thái bật/tắt quạt (đọc từ
chân Fan) lên virtual pin V4 trên Blynk (để hiển thị hoặc xử lý trên giao diện
Blynk).
# delay(200);: Dừng chương trình 200 mili giây.
# fanState = 0;: Thiết lập fanState thành 0 (để lần sau không bật quạt lại trừ khi có
thay đổi).
# Nếu quạt đang bật (LOW): else - Nếu chân Fan đang ở mức thấp (quạt đang bật).
# fanState = 1;: Thiết lập fanState thành 1 (để lần sau bật quạt nếu cần).
Blynk.virtualWrite(V3,1); # Gửi giá trị 1 lên virtual pin V3 trên Blynk.
}
else
{
flag = 0; # Thiết lập lại biến flag bằng 0.
digitalWrite(Led,1); # Tắt đèn LED (mức cao thường dùng để tắt đèn).
if(digitalRead(Fan) == 0){
if(fanState == 1){
digitalWrite(Fan,1);
Blynk.virtualWrite(V4,digitalRead(Fan));
delay(200);
fanState=0;
}
}else{
fanState=1;
}
# Kiểm tra và điều khiển quạt (tương tự như trong khối if):
# Các câu lệnh digitalRead(Fan), fanState, digitalWrite(Fan),
Blynk.virtualWrite(V4), delay(200), và fanState hoạt động tương tự như trong khối
if.
# Kiểm tra trạng thái quạt hiện tại và bật/tắt quạt theo fanState (trạng thái mong
muốn) nhưng lần này là để tắt quạt (nếu đang bật).
Blynk.virtualWrite(V3,0);
# Gửi giá trị 0 lên virtual pin V3 trên Blynk.
# Có thể virtual pin V3 được dùng để điều khiển hiển thị (ví dụ như tắt đèn cảnh
báo) trên giao diện Blynk khi không còn rò rỉ khí gas.
};
}
void loop() {
Blynk.run(); # Thực hiện các tác vụ cần thiết để giao tiếp với Blynk server.
getdata();
# Gọi đến một hàm khác có tên getdata().
# Chức năng của hàm này chưa được cung cấp nhưng có thể liên quan đến việc đọc
dữ liệu từ cảm biến hoặc thực hiện các tính toán cần thiết.
timer.run(); # Gọi đến một hàm khác có tên timer.run().
7. Nhận
xét
Đề tài giúp
chúng em
hiểu thêm
về lập trình
vi điều
khiển, ứng
dụng các
giao thức
truyền
thông.
Ứng dụng
kiến thức
hệ thống
nhúng vào
các dự án
thực tiễn.