Bài 5: Ứng dụng ADC trong đọc cảm biến LDR với ESP32


1.ADC 


Khi mới bắt đầu học ESP32, bạn sẽ gặp một vấn đề đơn giản nhưng quan trọng: cảm biến ngoài đời (như cảm biến ánh sáng, nhiệt độ…) tạo ra tín hiệu analog – tức là điện áp thay đổi liên tục. Trong khi đó, ESP32 lại chỉ “hiểu” được dữ liệu dạng số (digital). Lúc này, ADC sẽ đóng vai trò trung gian.

ADC (Analog-to-Digital Converter) là bộ chuyển đổi từ tín hiệu analog sang tín hiệu số. Nói dễ hiểu hơn, nó giống như một “phiên dịch viên” giúp ESP32 đọc được tín hiệu điện áp từ cảm biến và biến nó thành một con số. ESP32 có ADC 12-bit, nghĩa là nó có thể chuyển điện áp từ 0V đến khoảng 3.3V thành giá trị từ 0 đến 4095. Số càng lớn thì điện áp đọc được càng cao.

ESP32 có hai nhóm ADC là ADC1 và ADC2. Nếu bạn làm project có dùng WiFi thì nên ưu tiên dùng ADC1, vì ADC2 có thể hoạt động không ổn định khi WiFi được bật. Ngoài ra, ADC của ESP32 không quá chính xác tuyệt đối, nên khi đọc cảm biến, chúng ta thường đọc nhiều lần rồi lấy giá trị trung bình để kết quả ổn định hơn.




Chân ADC trong esp32 sẽ là GPIO34, GPIO36, GPIO32, GPIO35,GPIO 39 và GPIO 33.


2.Cảm biến LDR 

Cảm biến LDR (Light Dependent Resistor) là một loại điện trở đặc biệt có giá trị thay đổi theo cường độ ánh sáng môi trường. Khi ánh sáng chiếu vào càng mạnh, điện trở của LDR càng giảm; ngược lại, khi môi trường tối, điện trở của LDR sẽ tăng lên. Nhờ đặc tính này, LDR thường được sử dụng để nhận biết mức độ sáng – tối trong nhiều ứng dụng điện tử đơn giản.


LDR có cấu tạo đơn giản, giá thành rẻ và rất dễ sử dụng, đặc biệt phù hợp cho người mới bắt đầu học về Arduino, ESP32 hay các hệ thống nhúng cơ bản. Trong thực tế, cảm biến LDR thường được dùng trong các ứng dụng như đèn tự động bật khi trời tối, hệ thống tiết kiệm năng lượng, đo ánh sáng môi trường hoặc các dự án nhà thông minh nhỏ.




*Thông số kỹ thuật


3. Chuẩn bị dụng cụ

Cảm biến LDR (Light Dependent Resistor):

Dùng để phát hiện và đo mức độ ánh sáng môi trường thông qua sự thay đổi điện trở.

Vi điều khiển ESP32:

Đóng vai trò trung tâm xử lý, đọc tín hiệu analog từ LDR thông qua bộ chuyển đổi ADC và xử lý dữ liệu.

Điện trở cố định (thường là 10kΩ):

Dùng để tạo mạch chia áp với LDR, giúp chuyển sự thay đổi điện trở của LDR thành điện áp phù hợp để ESP32 đọc được.

Breadboard (board cắm thử):

Giúp lắp ráp mạch nhanh chóng mà không cần hàn.

Dây nối (jumper wires):

Dùng để kết nối các linh kiện với ESP32.

Cáp USB:

Dùng để cấp nguồn và nạp chương trình cho ESP32.

Máy tính cài Arduino IDE:

Dùng để viết chương trình, nạp code và theo dõi kết quả qua Serial Monitor.

*Sơ đồ chân kết nối

LDR tới ESP32




4. Nạp và chạy chương trình


*Đầu tiên ta chọn board nhé


Cách chọn: Tools -> Board (ESP32 Dev Module)



* Chọn cổng port để nạp chương trình


Đầu tiên vào device manager tìm cổng kết nối (ví dụ COM4)

Tiếp vào arduino chọn Port: COM4 (Tools → Port : COM4)



Code mẫu

#define LDR_PIN 32

#define LED_PIN 14   // LED ngoài 

void setup() {

  Serial.begin(115200);

  pinMode(LED_PIN, OUTPUT);

  analogReadResolution(12);                  // ADC 12-bit

  analogSetPinAttenuation(LDR_PIN, ADC_11db);

}

void loop() {

  int ldrValue = analogRead(LDR_PIN);

  if (ldrValue < 1500) {   // Trời tối

    digitalWrite(LED_PIN, HIGH);

    Serial.print("LDR = ");

    Serial.print(ldrValue);

    Serial.println(" -> Troi toi, LED BAT");

  } else {

    digitalWrite(LED_PIN, LOW);

    Serial.print("LDR = ");

    Serial.print(ldrValue);

    Serial.println(" -> Troi sang, LED TAT");

  }

  delay(500);

}

*Giờ ta check xem code có sai gì không







*Mô phỏng