Trung cấp 75-90 phút practiceMiễn phí

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

Robot cảm nhận môi trường là gì

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ăngChân ESP32-S3Kiểu tín hiệuGhi chú
SHT31 SDAGPIO8I2C dataKéo lên 3.3V nếu breakout chưa có pull-up
SHT31 SCLGPIO9I2C clockDùng chung bus I2C cho các bài sau
LDR chia ápGPIO4Analog inputLDR nối 3.3V, điện trở 10 kOhm xuống GND, điểm giữa vào GPIO4
MQ-135 AOGPIO6Analog inputBảo đảm module xuất tối đa 3.3V vào ESP32
LED trạng tháiGPIO2Digital outputNháy chậm khi mọi thứ OK
BuzzerGPIO15Digital outputKê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

  1. Chưa cấp nguồn motor cho robot.
  2. Nối GND chung giữa ESP32-S3, SHT31, mạch LDR, MQ-135, LED và buzzer.
  3. SHT31 dùng 3.3V, không cắm nhầm vào nguồn motor.
  4. 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_raw phả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_raw có 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 codeVai tròDấu hiệu đúng
scanI2c()Tìm thiết bị I2C trên busIn được i2c_found=0x44
readSht31()Đọc nhiệt độ/độ ẩm từ SHT31sht_ok=YES
analogRead(PIN_LDR)Đọc ánh sáng tương đốiRaw đổi khi che tay hoặc chiếu đèn
analogRead(PIN_MQ135)Đọc xu hướng khí analogRaw thay đổi chậm theo môi trường
setStatus()Điều khiển LED/buzzer báo lỗiLED nháy khi OK, buzzer báo lỗi

Kiểm thử robot thật

TestThao tácKết quả mong đợiPass?
1Boot ESP32-S3Serial in tên bài và I2C scan
2SHT31 nối đúngi2c_found=0x44sht_ok=YES
3Che LDRlight_raw thay đổi rõ
4Thay đổi môi trường gần MQ-135gas_raw có xu hướng thay đổi
5Rút SHT31 rồi resetBuzzer báo lỗi, log sht_ok=NO
6Ghi 10 dòng dữ liệuCó bảng đo thật của nhóm

Lỗi thường gặp và cách sửa

LỗiNguyên nhân hay gặpCách sửa
Không thấy I2C addressSDA/SCL đảo, thiếu GND chung hoặc cảm biến chưa cấp nguồnKiểm tra pin map, đổi lại SDA/SCL, đo VCC
SHT31 lúc được lúc khôngDây jumper lỏng hoặc bus I2C quá dàiRút ngắn dây, cắm chắc, dùng breadboard gọn
LDR raw không đổiĐấu sai mạch chia ápKiểm tra điểm giữa LDR và điện trở phải vào GPIO4
MQ-135 raw luôn 0 hoặc 4095Sai nguồn, AO vượt mức hoặc module chưa warm-upKiểm tra AO, nguồn module, đợi cảm biến ổn định
Buzzer kêu liên tụcCode đang báo lỗi SHT31Xem 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ó