Robot cảm nhận môi trường là gì
Bài 2 trong khóa Robot Thế hệ 2 — Cảm nhận môi trường và kết nối IoT

G2 01 - Robot cảm nhận môi trường là gì
Linh kiện cần chuẩn bị
- 1 ESP32-S3 DevKit.
- 1 robot base Gen 1 đã hoàn thành, có công tắc nguồn và khu vực gắn cảm biến phía trên thân robot.
- 1 cảm biến nhiệt độ/độ ẩm SHT31 giao tiếp I2C, địa chỉ thường gặp
0x44. - 1 LDR và 1 điện trở 10 kOhm để tạo mạch chia áp đo ánh sáng.
- 1 module MQ-135 analog để đọc xu hướng chất lượng không khí.
- 1 LED trạng thái và 1 điện trở 220 ohm nếu board không có LED phù hợp.
- 1 buzzer chủ động 3.3V hoặc 5V có transistor điều khiển nếu dòng lớn.
- Breadboard nhỏ hoặc shield nối dây, dây jumper đúng loại.
- Pin lithium hoặc nguồn USB ổn định; bài này chưa cần cấp nguồn motor.
- Máy tính có Arduino IDE hoặc Arduino CLI, cáp USB data, Serial Monitor.
- Bảng ghi dữ liệu gồm các cột: thời gian, nhiệt độ, độ ẩm, ánh sáng raw, khí raw, nhận xét.
Trong bài này code chỉ dùng SHT31, LDR, MQ-135, LED, buzzer và Serial Monitor. OLED/TFT, WiFi, dashboard và module đo pin sẽ học ở các bài sau.
Bài này giúp bạn làm được gì?
Ở Gen 1, robot đã biết di chuyển, tránh vật cản, dò line và nhận lệnh. Sang Gen 2, robot bắt đầu biết đo môi trường: nhiệt độ, độ ẩm, ánh sáng và xu hướng chất lượng không khí.
Kết quả cuối bài:
- ESP32-S3 tìm thấy cảm biến I2C SHT31.
- Robot đọc được raw data từ LDR và MQ-135.
- Serial Monitor in log môi trường theo chu kỳ.
- LED và buzzer báo được trạng thái cảm biến OK hoặc lỗi.
- Nhóm có bảng dữ liệu thật đầu tiên của robot Gen 2.
Mục tiêu bài học
Sau bài này, bạn có thể:
- Nêu được robot Gen 2 khác Gen 1 ở điểm nào.
- Lắp đúng 3 loại cảm biến môi trường đầu tiên.
- Phân biệt cảm biến I2C và cảm biến analog.
- Đọc log Serial để biết cảm biến đang hoạt động hay lỗi.
- Chuẩn bị dữ liệu thô cho các bài đọc nhiệt độ, ánh sáng và khí.
Kiến thức rất ngắn
Robot cảm nhận môi trường không phải là robot "đoán" môi trường. Robot cần cảm biến thật, dây nối đúng, code đọc dữ liệu đúng và log rõ ràng.
Trong khóa Gen 2, ta sẽ đi theo vòng lặp:
Cảm biến thật -> dữ liệu thô -> kiểm tra lỗi -> dữ liệu có ý nghĩa -> cảnh báo/hiển thị/gửi dashboard
Ở bài này, mục tiêu chỉ là đưa tất cả cảm biến lên bàn test và kiểm tra chúng có tín hiệu. Chưa cần kết luận phòng "tốt" hay "xấu".
Sơ đồ khối hệ thống
SHT31 ----I2C----\
LDR -----ADC------> ESP32-S3 -> Serial Monitor
MQ-135 --ADC-----/ |
+-> LED trạng thái
+-> buzzer báo lỗi
Pin map đề xuất
| Chức năng | Chân ESP32-S3 | Kiểu tín hiệu | Ghi chú |
|---|---|---|---|
| SHT31 SDA | GPIO8 | I2C data | Kéo lên 3.3V nếu breakout chưa có pull-up |
| SHT31 SCL | GPIO9 | I2C clock | Dùng chung bus I2C cho các bài sau |
| LDR chia áp | GPIO4 | Analog input | LDR nối 3.3V, điện trở 10 kOhm xuống GND, điểm giữa vào GPIO4 |
| MQ-135 AO | GPIO6 | Analog input | Bảo đảm module xuất tối đa 3.3V vào ESP32 |
| LED trạng thái | GPIO2 | Digital output | Nháy chậm khi mọi thứ OK |
| Buzzer | GPIO15 | Digital output | Kêu 2 nhịp khi lỗi cảm biến |
Thực hành từng bước
Bước 1: Kiểm tra nguồn và dây
- Chưa cấp nguồn motor cho robot.
- Nối GND chung giữa ESP32-S3, SHT31, mạch LDR, MQ-135, LED và buzzer.
- SHT31 dùng 3.3V, không cắm nhầm vào nguồn motor.
- Với MQ-135, kiểm tra chân AO bằng đồng hồ nếu module dùng 5V. Nếu AO có thể vượt 3.3V, dùng mạch chia áp trước khi nối vào GPIO.
Bước 2: Upload code bring-up
Upload sketch của bài, mở Serial Monitor 115200 baud. Log đầu tiên cần có:
G2 01 environment bring-up ready
i2c_found=0x44
Nếu không thấy 0x44, kiểm tra SDA/SCL, VCC/GND và địa chỉ SHT31.
Bước 3: Tác động từng cảm biến
- Thổi nhẹ gần SHT31 trong 2-3 giây, nhiệt độ/độ ẩm phải thay đổi nhẹ.
- Che LDR bằng tay,
light_rawphải đổi rõ. - Đưa MQ-135 ra nơi thoáng hơn hoặc gần hơi thở trong thời gian ngắn,
gas_rawcó thể đổi chậm.
Bước 4: Ghi bảng dữ liệu đầu tiên
Ghi ít nhất 10 dòng log, mỗi dòng cách nhau khoảng 1 giây. Không cần dữ liệu đẹp; điều quan trọng là dữ liệu có thay đổi khi môi trường thay đổi.
Code mẫu hoàn chỉnh
Code đầy đủ nằm trong file:
code/g2-01-robot-cam-nhan-moi-truong-la-gi/g2-01-robot-cam-nhan-moi-truong-la-gi.ino
Khối quan trọng nhất là hàm đọc tất cả cảm biến:
void printEnvironmentLog() {
Sht31Reading sht = readSht31();
int lightRaw = analogRead(PIN_LDR);
int gasRaw = analogRead(PIN_MQ135);
Serial.print("env t_ms=");
Serial.print(millis());
Serial.print(" sht_ok=");
Serial.print(sht.ok ? "YES" : "NO");
Serial.print(" temp_c=");
Serial.print(sht.temperatureC, 1);
Serial.print(" humidity_pct=");
Serial.print(sht.humidityPct, 1);
Serial.print(" light_raw=");
Serial.print(lightRaw);
Serial.print(" gas_raw=");
Serial.println(gasRaw);
}
Giải thích code theo từng khối
| Khối code | Vai trò | Dấu hiệu đúng |
|---|---|---|
scanI2c() | Tìm thiết bị I2C trên bus | In được i2c_found=0x44 |
readSht31() | Đọc nhiệt độ/độ ẩm từ SHT31 | sht_ok=YES |
analogRead(PIN_LDR) | Đọc ánh sáng tương đối | Raw đổi khi che tay hoặc chiếu đèn |
analogRead(PIN_MQ135) | Đọc xu hướng khí analog | Raw thay đổi chậm theo môi trường |
setStatus() | Điều khiển LED/buzzer báo lỗi | LED nháy khi OK, buzzer báo lỗi |
Kiểm thử robot thật
| Test | Thao tác | Kết quả mong đợi | Pass? |
|---|---|---|---|
| 1 | Boot ESP32-S3 | Serial in tên bài và I2C scan | |
| 2 | SHT31 nối đúng | Có i2c_found=0x44 và sht_ok=YES | |
| 3 | Che LDR | light_raw thay đổi rõ | |
| 4 | Thay đổi môi trường gần MQ-135 | gas_raw có xu hướng thay đổi | |
| 5 | Rút SHT31 rồi reset | Buzzer báo lỗi, log sht_ok=NO | |
| 6 | Ghi 10 dòng dữ liệu | Có bảng đo thật của nhóm |
Lỗi thường gặp và cách sửa
| Lỗi | Nguyên nhân hay gặp | Cách sửa |
|---|---|---|
| Không thấy I2C address | SDA/SCL đảo, thiếu GND chung hoặc cảm biến chưa cấp nguồn | Kiểm tra pin map, đổi lại SDA/SCL, đo VCC |
| SHT31 lúc được lúc không | Dây jumper lỏng hoặc bus I2C quá dài | Rút ngắn dây, cắm chắc, dùng breadboard gọn |
| LDR raw không đổi | Đấu sai mạch chia áp | Kiểm tra điểm giữa LDR và điện trở phải vào GPIO4 |
| MQ-135 raw luôn 0 hoặc 4095 | Sai nguồn, AO vượt mức hoặc module chưa warm-up | Kiểm tra AO, nguồn module, đợi cảm biến ổn định |
| Buzzer kêu liên tục | Code đang báo lỗi SHT31 | Xem log sht_ok, sửa cảm biến trước |
Checklist debug
- Có GND chung cho tất cả module.
- SHT31 xuất hiện trong I2C scan.
- LDR đổi raw khi che tay.
- MQ-135 có raw nằm trong vùng 0-4095, không kẹt mãi ở 0 hoặc 4095.
- LED/buzzer phản hồi đúng trạng thái.
- Có bảng log dữ liệu thật.
Thử thách nhỏ
Thêm một cột team_note vào bảng dữ liệu: normal, covered_ldr, near_breath, open_air. Sau đó giải thích vì sao ghi điều kiện đo quan trọng hơn chỉ nhìn một con số.
Checklist hoàn thành
- Robot Gen 2 đã có bộ cảm biến môi trường cơ bản trên bàn test.
- Code đọc được SHT31, LDR và MQ-135.
- Có ít nhất 10 dòng Serial log.
- Nhóm biết cảm biến nào là I2C, cảm biến nào là analog.
- Sẵn sàng học sâu SHT31 ở G2 02.
Bài tiếp theo
G2 02 sẽ tập trung vào SHT31: đọc nhiệt độ, độ ẩm, kiểm tra lỗi dữ liệu và in log sạch để dùng cho các bài lọc/hiển thị sau này.
Điều hướng bài học
Bài tiếp theo: G2 02 - Đọc nhiệt độ và độ ẩm
Bài trước: Không có