





Preview text:
BÀI THÍ NGHIỆM SỐ 1
CÁC CẢM BIẾN VÀ LẬP TRÌNH THU NHẬN DỮ LIỆU CẢM BIẾN SỬ DỤNG ARDUINO ESP32
Ví dụ: Chương trình điều khiển bật tắt đèn LED đơn trên KIT thí nghiệm IoT
Tần số nháy của đèn LED là bao nhiêu? Giải thích tại sao?
Tần số nháy của đèn LED: 0.5 Hz.
Giải thích: Trong chương trình, đèn LED được bật (HIGH) trong 1 giây (1000 ms) và tắt (LOW)
trong 1 giây (1000 ms). Tổng thời gian cho một chu kỳ nháy (bật + tắt) là 1000 ms + 1000 ms =
2000 ms = 2 giây. Tần số được tính bằng công thức f=1T f = \frac{1}{T} f=T1, với T T T là chu kỳ (2
giây). Do đó, f=12=0.5 f = \frac{1}{2} = 0.5 f=21=0.5 Hz. THÍ NGHIỆM
3.1 Viết chương trình đọc dữ liệu nhiệt độ, độ ẩm từ cảm biến DHT11 và hiển thị lên màn hình Serial Monitor của máy tính
Bước 2: Viết chương trình cho ESP32
Dưới đây là mã nguồn mẫu cho chương trình đọc dữ liệu từ cảm biến DHT11: cpp CollapseWrapCopy #include #include
#define DHTPIN 4 // Chân DATA của DHT11 nối với IO4 trên ESP32
#define DHTTYPE DHT11 // Loại cảm biến là DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() {
Serial.begin(115200); // Tốc độ baud của cổng Serial
dht.begin(); // Khởi động cảm biến DHT11 } void loop() {
delay(2000); // Chờ 2 giây giữa các lần đọc (tối thiểu cho DHT11)
float humidity = dht.readHumidity(); // Đọc độ ẩm
float tempC = dht.readTemperature(); // Đọc nhiệt độ (đơn vị Celsius)
float tempF = dht.readTemperature(true); // Đọc nhiệt độ (đơn vị Fahrenheit)
// Kiểm tra nếu đọc dữ liệu thất bại
if (isnan(humidity) || isnan(tempC) || isnan(tempF)) {
Serial.println("Failed to read from DHT sensor!"); return; }
// Hiển thị dữ liệu lên Serial Monitor Serial.print("Humidity: "); Serial.print(humidity); Serial.print(" %\t");
Serial.print("Temperature: "); Serial.print(tempC); Serial.print(" *C\t"); Serial.print(tempF); Serial.println(" *F"); }
Bước 3: Thay đổi nhiệt độ xung quanh cảm biến và ghi lại kết quả
Giả sử bạn thực hiện thí nghiệm trong phòng thí nghiệm với các giá trị mẫu như sau (bạn có thể
thay đổi theo kết quả thực tế):
Lần đo Nhiệt độ (°C) Nhiệt độ (°F) Độ ẩm (%RH) 1 25.5 77.9 60
Lần đo Nhiệt độ (°C) Nhiệt độ (°F) Độ ẩm (%RH) 2 26.0 78.8 58 3 25.8 78.4 59 4 26.2 79.2 57 5 25.7 78.3 61
Bước 4: Thay đổi chân kết nối và tốc độ cổng Serial - Nhận xét
Nhận xét: Khi thay đổi chân kết nối (ví dụ từ IO4 sang IO5), cần cập nhật lại định nghĩa DHTPIN
trong mã nguồn (ví dụ #define DHTPIN 5). Nếu không sửa, chương trình sẽ không đọc được dữ
liệu từ cảm biến. Khi thay đổi tốc độ cổng Serial (ví dụ từ 115200 baud sang 9600 baud), cần
điều chỉnh trong Serial.begin(9600) và đảm bảo cài đặt tương ứng trên Serial Monitor của
Arduino IDE. Nếu tốc độ không khớp, dữ liệu hiển thị có thể bị lỗi hoặc không xuất hiện.
Trình bày về nguyên lý cơ bản của giao thức truyền tin One-Wire
Giao thức One-Wire là một giao thức truyền thông nối tiếp sử dụng một dây tín hiệu duy nhất
(kèm theo dây nối đất) để truyền dữ liệu giữa các thiết bị. Nguyên lý cơ bản: o
Một thiết bị chủ (master) điều khiển giao tiếp với một hoặc nhiều thiết bị phụ (slave)
qua một đường dây chung. o
Dữ liệu được truyền dưới dạng các xung thời gian (bit 1 và bit 0 được phân biệt bởi độ dài xung). o
Thiết bị chủ gửi tín hiệu khởi tạo (reset pulse), sau đó thiết bị phụ phản hồi bằng tín hiệu
hiện diện (presence pulse). o
Tất cả các thiết bị trên bus One-Wire có địa chỉ duy nhất (64-bit), cho phép giao tiếp
riêng lẻ hoặc đồng thời. o
Ví dụ: Trong DHT11, chân DATA sử dụng giao thức One-Wire để gửi dữ liệu nhiệt độ và
độ ẩm dưới dạng chuỗi bit nối tiếp.
3.2 Viết chương trình đọc dữ liệu khoảng cách gửi lên từ cảm biến siêu âm US-015 và hiển thị kết quả
lên màn hình Serial Monitor của máy tính
Bước 2: Viết chương trình cho ESP32
Dưới đây là mã nguồn mẫu cho chương trình đọc dữ liệu từ cảm biến siêu âm US-015: cpp CollapseWrapCopy
#define TRIGGER_PIN 13 // Chân Trigger nối với IO13 trên ESP32
#define ECHO_PIN 4 // Chân Echo nối với IO4 trên ESP32 void setup() {
Serial.begin(115200); // Tốc độ baud của cổng Serial
pinMode(TRIGGER_PIN, OUTPUT); // Đặt chân Trigger là đầu ra
pinMode(ECHO_PIN, INPUT); // Đặt chân Echo là đầu vào } void loop() { long duration; float distance; // Tạo xung Trigger
digitalWrite(TRIGGER_PIN, LOW); delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
// Đo thời gian xung Echo
duration = pulseIn(ECHO_PIN, HIGH);
// Tính khoảng cách (cm)
distance = duration * 0.034 / 2;
// Hiển thị kết quả lên Serial Monitor Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm");
delay(1000); // Chờ 1 giây trước khi đo lại }
Bước 3: Nhận xét về kết quả thu được trên Serial Monitor
Nhận xét: Khi đặt vật cản (ví dụ tờ giấy) ở các khoảng cách khác nhau trước cảm biến, giá trị
khoảng cách hiển thị trên Serial Monitor thay đổi tương ứng. Ví dụ, nếu vật cản ở gần (10 cm),
Serial Monitor hiển thị khoảng 10 cm; nếu xa hơn (50 cm), giá trị tăng lên 50 cm. Kết quả có thể
dao động nhẹ do nhiễu hoặc bề mặt vật cản không phẳng.
Bước 4: Giải thích mã nguồn, công thức tính khoảng cách và độ chính xác
Giải thích mã nguồn: o
digitalWrite(TRIGGER_PIN, HIGH): Tạo xung 10 µs để kích hoạt cảm biến phát sóng siêu âm. o
pulseIn(ECHO_PIN, HIGH): Đo thời gian (µs) từ khi sóng siêu âm được phát đi đến khi
nhận được sóng phản xạ. o
distance = duration * 0.034 / 2: Tính khoảng cách dựa trên thời gian và tốc độ âm thanh.
Công thức tính khoảng cách: o
Tốc độ âm thanh trong không khí là 340 m/s = 0.034 cm/µs. o
Thời gian đo được (duration) là thời gian đi và về của sóng, nên khoảng cách = thời gian×toˆ c
ˊ độ2 \frac{\text{thời gian} \times \text{tốc độ}}{2} 2thời gian×toˆ c ˊ độ. o Công thức: Khoảng ca ch
ˊ (cm)=duration (µs)×0.0342 \text{Khoảng cách (cm)} = \frac{\
text{duration (µs)} \times 0.034}{2} Khoảng ca ch
ˊ (cm)=2duration (µs)×0.034.
Độ chính xác phụ thuộc vào hiệu chỉnh tốc độ sóng siêu âm: Tốc độ âm thanh thay đổi theo
nhiệt độ, độ ẩm và áp suất không khí (ví dụ, 340 m/s là giá trị trung bình ở 20°C). Nếu không hiệu
chỉnh theo điều kiện môi trường thực tế, kết quả đo có thể sai lệch.
Bước 5: Xác định vùng mù của cảm biến
Giả sử kết quả thực nghiệm như sau (bạn có thể thay đổi theo thực tế): o
Khoảng cách nhỏ nhất đo được: 2 cm o
Khoảng cách lớn nhất đo được: 250 cm o
Vùng mù: Dưới 2 cm và trên 250 cm
Khoảng cách nhỏ nhất đo được Khoảng cách lớn nhất đo được 2 cm 250 cm Vùng mù: Dưới 2 cm Vùng mù: Trên 250 cm
Bước 6: Thay đổi chân kết nối và tốc độ cổng Serial - Nhận xét
Nhận xét: Khi thay đổi chân kết nối (ví dụ Trigger từ IO13 sang IO12, Echo từ IO4 sang IO5), cần
cập nhật lại #define TRIGGER_PIN 12 và #define ECHO_PIN 5 trong mã nguồn. Nếu không, cảm
biến không hoạt động. Khi thay đổi tốc độ Serial (ví dụ từ 115200 baud sang 9600 baud), cần sửa
Serial.begin(9600) và điều chỉnh trên Serial Monitor. Nếu không khớp, dữ liệu không hiển thị đúng.
Trình bày về nguyên lý cơ bản của giao thức truyền tin I2C
Giao thức I2C (Inter-Integrated Circuit) là một giao thức truyền thông nối tiếp sử dụng hai dây: o
SDA (Serial Data Line): Dây dữ liệu để truyền tín hiệu. o
SCL (Serial Clock Line): Dây đồng hồ để đồng bộ hóa truyền dữ liệu. Nguyên lý cơ bản: o
Một thiết bị chủ (master) điều khiển giao tiếp với một hoặc nhiều thiết bị phụ (slave). o
Mỗi thiết bị phụ có địa chỉ duy nhất (thường 7-bit hoặc 10-bit). o
Master gửi tín hiệu bắt đầu (start condition), theo sau là địa chỉ thiết bị phụ và bit đọc/ghi (R/W). o
Dữ liệu được truyền từng byte, với thiết bị nhận gửi tín hiệu ACK (xác nhận) sau mỗi byte. o
Tín hiệu kết thúc (stop condition) được gửi để hoàn tất giao tiếp. o
I2C hỗ trợ tốc độ truyền từ 100 kHz đến 400 kHz (hoặc cao hơn trong phiên bản mới).
Ví dụ: Trong US-015, giao thức I2C có thể được sử dụng để truyền dữ liệu khoảng cách từ cảm
biến đến ESP32 (tuy nhiên, trong thí nghiệm này, US-015 dùng Trigger/Echo thay vì I2C trực tiếp)