Giới thiệu dự án

Lạm dụng rượu bia khi tham gia giao thông là một trong những nguyên nhân hàng đầu gây ra tai nạn giao thông nghiêm trọng trên toàn cầu và tại Việt Nam. Theo thống kê từ Tổ chức Y tế Thế giới (WHO), tai nạn liên quan đến nồng độ cồn chiếm hơn 20% tổng số ca tử vong do tai nạn giao thông tại các quốc gia có thu nhập cao. Tại Việt Nam, số liệu y tế ghi nhận 36,5% người điều khiển xe máy và 66,8% tài xế ô tô nhập viện do tai nạn giao thông có nồng độ cồn trong máu vượt ngưỡng cho phép. Lượng tiêu thụ bia rượu trong nước đạt mức báo động với hơn 3,4 tỷ lít bia và hơn 270 triệu lít rượu tiêu thụ mỗi năm, đặt ra thách thức cấp bách cho công tác giám sát trật tự an toàn giao thông theo Nghị định 100/2019/NĐ-CP và Nghị định 71/2012/NĐ-CP.

Thực trạng kiểm tra nồng độ cồn hiện nay chủ yếu phụ thuộc vào việc dừng phương tiện trực tiếp bằng các chốt chặn của lực lượng Cảnh sát Giao thông (CSGT). Phương pháp thủ công này bộc lộ nhiều điểm nghẽn: tốn kém nhân lực, gia tăng nguy cơ ùn tắc giao thông, giới hạn về phạm vi kiểm soát và tiềm ẩn nguy cơ lây nhiễm bệnh truyền nhiễm qua đường hô hấp khi dùng chung ống thổi.

+-------------------------------------------------------------------------+
|                              VẤN ĐỀ CỐT LÕI                             |
|  - Kiểm tra thủ công tại chốt -> Quá tải, dễ ùn tắc giao thông          |
|  - Thiết bị chuyên dụng nhập ngoại đắt đỏ ($150 - $1.500/thiết bị)      |
|  - Dữ liệu đo phân tán, thiếu cơ chế đồng bộ tự động về hệ thống trung tâm|
+-------------------------------------------------------------------------+
                                    │
                                    ▼
+-------------------------------------------------------------------------+
|                           GIẢI PHÁP ĐỀ TÀI                              |
|  Hệ thống đo nồng độ cồn khí thở tự động dựa trên IoT:                 |
|  NodeMCU ESP8266 + MQ-3 + I2C LCD 16x2 + ThingSpeak Cloud Platform       |
+-------------------------------------------------------------------------+

Mục tiêu của dự án

  1. Nghiên cứu nguyên lý chuyển đổi hóa-điện: Phân tích phản ứng oxy hóa-khử của cảm biến khí bán dẫn $SnO_2$ (Tin Dioxide) với ethanol ở tỉ lệ khí thở - máu quy đổi $2100:1$.
  2. Thiết kế phần cứng nhúng: Chế tạo bo mạch giám sát tích hợp vi điều khiển NodeMCU ESP8266, cảm biến khí MQ-3, cảm biến âm thanh định hướng luồng thổi và màn hình LCD 1602 qua giao tiếp I2C.
  3. Phát triển firmware xử lý tín hiệu: Xây dựng thuật toán lọc nhiễu, chuyển đổi ADC 10-bit sang nồng độ cồn định lượng ($\text{mg/L}$ khí thở) với thời gian trễ dưới $10\text{ giây}$.
  4. Tích hợp truyền thông đám mây IoT: Đẩy dữ liệu thời gian thực lên nền tảng ThingSpeak thông qua giao thức HTTP/REST API để quản lý và hiển thị trực quan từ xa.
  5. Đánh giá và kiểm chuẩn hệ thống: Thử nghiệm sai số, độ ổn định nhiệt độ sấy buồng đo ($60^\circ\text{C}$) và tính khả thi khi ứng dụng tại trạm thu phí tự động (ETC) hoặc chốt kiểm soát doanh nghiệp vận tải.

Phạm vi và giới hạn hệ thống

  • Phạm vi ứng dụng: Giám sát nồng độ cồn trong hơi thở (BrAC - Breath Alcohol Concentration) tại các điểm cố định như trạm kiểm soát vé tự động, cổng trạm xe buýt/taxi, trạm thu phí cao tốc.
  • Giới hạn kỹ thuật: Dải đo cảm biến MQ-3 đạt hiệu quả tối ưu trong khoảng $0,04 - 0,40\text{ mg/L}$ khí thở; cảm biến nhạy chéo với các hợp chất hữu cơ dễ bay hơi (VOCs) như cồn công nghiệp, benzen và khí gas methane ($CH_4$).

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Các thiết bị đo nồng độ cồn chuyên dụng trên thị trường hiện nay phần lớn sử dụng công nghệ cảm biến quang phổ hồng ngoại hoặc cảm biến pin nhiên liệu hóa học (Fuel Cell Sensor).

Dòng thiết bị Xuất xứ Công nghệ cảm biến Ưu điểm Nhược điểm Giá thị trường
FiT331 Trung Quốc Fuel Cell + Camera Tích hợp in nhiệt, camera HD, độ chính xác cao Không hỗ trợ API mở, phụ thuộc máy in 9.000.000 - 10.000.000 VNĐ
TigerDirect AT6000 Mỹ Bán dẫn oxit phẳng Nhỏ gọn, hiển thị LED rõ ràng, dễ thay ống thổi Không có kết nối mạng, độ phân giải thấp 1.600.000 - 2.000.000 VNĐ
Lion SD-400 Anh Fuel Cell cao cấp Lưu trữ 2.500 mẫu đo, độ chính xác chuẩn tư pháp Giá thành rất cao, cần hiệu chuẩn định kỳ tại hãng > 30.000.000 VNĐ
Sentech AL8000 Hàn Quốc Fuel Cell Sensor Pin bền, thiết kế công thái học, độ trễ thấp Không có tính năng truyền dữ liệu từ xa ~ 3.000.000 VNĐ
Hệ thống đề tài Việt Nam Bán dẫn $SnO_2$ + ESP8266 Truyền dữ liệu đám mây IoT, chi phí thấp, dễ tích hợp Nhạy chéo với VOCs, cần tiền gia nhiệt < 400.000 VNĐ

Yêu cầu hệ thống theo mô hình MoSCoW

  • Must have (Bắt buộc có): Đọc tín hiệu Analog từ MQ-3; tính toán quy đổi ra $\text{mg/L}$; cảnh báo bằng còi Buzzer khi nồng độ vượt ngưỡng $0,25\text{ mg/L}$; đẩy dữ liệu lên ThingSpeak qua Wi-Fi 802.11 b/g/n.
  • Should have (Nên có): Hiển thị trực quan dữ liệu trên LCD 16x2 qua giao tiếp I2C để tiết kiệm chân GPIO; cảm biến âm thanh để xác định người lái xe đang thực hiện thao tác thổi.
  • Could have (Có thể có): Cơ chế tiền sấy cảm biến tự động để đưa bề mặt bán dẫn lên $60^\circ\text{C}$; chế độ ngủ sâu (Deep Sleep) giảm điện năng tiêu thụ.
  • Won't have (Chưa hỗ trợ phiên bản này): Nhận diện khuôn mặt tài xế bằng camera AI nhúng; tích hợp van đo lưu lượng khí thể tích chuẩn (Spirometer).

Thiết kế hệ thống

flowchart TB
    subgraph SENSING["Khối Thu Thập Dữ Liệu"]
        MQ3["Cảm biến MQ-3 (Analog A0)"]
        SOUND["Cảm biến âm thanh (Digital D3)"]
    end

    subgraph MCU["Khối Xử Lý Trung Tâm - NodeMCU ESP8266"]
        ADC_CONV["10-bit ADC Converter"]
        PROC["Bộ xử lý Tensilica L106 (80MHz)"]
        WIFI_MOD["Wi-Fi Stack TCP/IP"]
    end

    subgraph ACTUATION["Khối Hiển Thị & Cảnh Báo"]
        LCD["LCD 1602 + PCF8574 (I2C)"]
        BUZZER["Còi báo Buzzer 5V"]
        LED["LED Chỉ thị"]
    end

    subgraph CLOUD["Khối Nền Tảng Đám Mây"]
        TS["ThingSpeak Cloud IoT Engine"]
        REST["HTTP REST API / Endpoints"]
        DASH["Web Dashboard & MATLAB Analytics"]
    end

    MQ3 -->|Điện áp 0-3.3V| ADC_CONV
    SOUND -->|Mức Logic HIGH/LOW| PROC
    ADC_CONV --> PROC
    PROC -->|Giao tiếp I2C (SDA/SCL)| LCD
    PROC -->|Kích hoạt còi báo| BUZZER
    PROC -->|Chỉ thị trạng thái| LED
    PROC --> WIFI_MOD
    WIFI_MOD -->|HTTP POST JSON/Payload| REST
    REST --> TS
    TS --> DASH

Bảng thông số kỹ thuật phần cứng và phần mềm

Thành phần Thông số / Phiên bản Chức năng kỹ thuật
Vi điều khiển NodeMCU ESP8266 (ESP-12E Module) CPU 32-bit Tensilica L106 80MHz, 4MB SPI Flash, Wi-Fi 2.4GHz WPA/WPA2
Cảm biến cồn MQ-3 Gas Sensor ($SnO_2$) Dải đo $0,04 - 0,40\text{ mg/L}$, điện áp sấy $5\text{V} \pm 0,2\text{V}$, công suất sấy $\le 900\text{mW}$
Cảm biến âm thanh Electret Microphone + LM393 Phát hiện luồng hơi thổi tạo áp lực âm thanh, trả mức logic Digital TTL
Màn hình LCD 16x2 + PCF8574 I2C Adapter Driver HD44780, giao tiếp 2 dây (SDA tại GPIO4, SCL tại GPIO5)
Còi báo Active Buzzer 5V DC Tần số âm thanh $2500\text{Hz}$, dòng tiêu thụ $< 25\text{mA}$
Môi trường lập trình Arduino IDE v1.8.13 Trình biên dịch Xtensa GCC, tích hợp thư viện ESP8266 Core v2.7.4
Nền tảng Cloud ThingSpeak IoT Platform Lưu trữ kênh dữ liệu qua REST API, phân tích MATLAB tích hợp

Thiết kế giao tiếp API Cloud

Hệ thống sử dụng phương thức HTTP GET/POST gửi dữ liệu lên ThingSpeak API Endpoint:

POST /update HTTP/1.1
Host: api.thingspeak.com
Connection: close
X-THINGSPEAKAPIKEY: YOUR_WRITE_API_KEY
Content-Type: application/x-www-form-urlencoded

field1=0.28&field2=572&field3=1
  • field1: Nồng độ cồn tính toán định lượng ($\text{mg/L}$ khí thở).
  • field2: Giá trị ADC thô ($0 - 1023$).
  • field3: Trạng thái cảnh báo vi phạm ($0$: An toàn, $1$: Vượt ngưỡng cho phép).

Methodology

Dự án áp dụng mô hình phát triển hệ thống nhúng theo chu trình xoay vòng nhanh (Embedded Agile Sprints) kết hợp kiểm chuẩn mô hình chữ V (V-Model Verification).

Tuần 1-2: Khảo sát & Thiết kế kiến trúc phần cứng
Tuần 3-4: Lập trình Firmware & Thuật toán chuyển đổi MQ-3
Tuần 5-6: Xây dựng giao thức mạng & Kết nối ThingSpeak API
Tuần 7-8: Đo kiểm thực nghiệm, Đánh giá sai số & Tối ưu hóa
Rủi ro kỹ thuật Mức độ Biện pháp giảm thiểu
Nhiễu điện áp ADC do sấy cảm biến Cao Bổ sung tụ lọc nguồn $100\mu\text{F} + 104\text{nF}$, tách biệt đường nguồn sấy $5\text{V}$ và nguồn logic vi điều khiển $3.3\text{V}$.
Trôi điểm không (Zero-drift) của MQ-3 Trung bình Thực hiện chu trình sấy cảm biến khởi động tối thiểu $8 - 10\text{ giây}$ ở $60^\circ\text{C}$ trước khi cho phép đo.
Mất kết nối Wi-Fi tại hiện trường Trung bình Thiết lập bộ đệm Circular Buffer trên RAM ESP8266; tự động kích hoạt chế độ Auto-Reconnect.

Implementation và kết quả

Development process

Cốt lõi xử lý của thiết bị nằm ở nguyên lý biến đổi điện trở của vật liệu bán dẫn $SnO_2$. Trong môi trường không khí sạch, các phân tử oxy bị hấp phụ trên bề mặt màng $SnO_2$ sẽ bẫy các electron tự do, làm tăng điện trở cảm biến ($R_0$). Khi tiếp xúc với hơi cồn ($C_2H_5OH$), phản ứng oxy hóa diễn ra giải phóng electron trở lại dải dẫn, làm giảm điện trở cảm biến ($R_s$):

$$\text{C}_2\text{H}_5\text{OH} + 6\text{O}^- (\text{ads}) \xrightarrow{60^\circ\text{C}} 2\text{CO}_2 + 3\text{H}_2\text{O} + 6e^-$$

Điện trở cảm biến $R_s$ được xác định qua cầu phân áp với điện trở tải $R_L$:

$$R_s = \left(\frac{V_{in} - V_{RL}}{V_{RL}}\right) \times R_L$$

Trong đó:

  • $V_{in} = 5\text{V}$ (Điện áp cung cấp mạch đo).
  • $V_{RL}$ là điện áp đo được trên tải $R_L$ ($0 - 5\text{V}$, qua cầu phân áp chia 3.3V đưa vào chân A0 ESP8266).
  • Tỉ số $R_s / R_0$ liên hệ phi tuyến với nồng độ cồn $\text{mg/L}$ theo hàm logarit thực nghiệm:

$$\log(C_{\text{alcohol}}) = a \cdot \log\left(\frac{R_s}{R_0}\right) + b$$

#include <ESP8266WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const char* ssid = "IoT_Traffic_Station";
const char* password = "SecurePassword123";
const char* server = "api.thingspeak.com";
const String apiKey = "THINGSPEAK_API_KEY_HERE";

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int mq3Pin = A0;
const int soundSensorPin = D3;
const int buzzerPin = D5;
const float ALCOHOL_THRESHOLD = 0.25; // Ngưỡng phạt theo NĐ 100/2019 (mg/L)
const float R0 = 12.5;                // Điện trở chuẩn trong không khí sạch (kOhm)
const float RL = 10.0;                // Điện trở tải (kOhm)

void setup() {
  Serial.begin(115200);
  pinMode(soundSensorPin, INPUT);
  pinMode(buzzerPin, OUTPUT);
  digitalWrite(buzzerPin, LOW);

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("He thong khoi dong");
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  lcd.clear();
  lcd.print("He thong san sang");
  delay(1000);
}

float readAlcoholConcentration() {
  int rawADC = analogRead(mq3Pin);
  float vRL = (rawADC / 1023.0) * 3.3 * (5.0 / 3.3); // Quy đổi điện áp thực
  float rs = ((5.0 - vRL) / vRL) * RL;
  float ratio = rs / R0;
  
  // Đường đặc tuyến logarit thực nghiệm cảm biến MQ-3
  float mgL = pow(10, (-1.497 * log10(ratio) - 0.448));
  return mgL;
}

void sendDataToThingSpeak(float concentration, int rawVal, int status) {
  WiFiClient client;
  if (client.connect(server, 80)) {
    String postStr = apiKey;
    postStr += "&field1=" + String(concentration, 3);
    postStr += "&field2=" + String(rawVal);
    postStr += "&field3=" + String(status);
    postStr += "\r\n\r\n";

    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
    client.print("Content