ESP32 ADC – Đọc giá trị Analog bằng Arduino IDE

ESP32 ADC (Analog-to-Digital Converter) là bộ chuyển đổi tín hiệu Analog sang tín hiệu Digital. Việc đọc tín hiệu Analog sẽ rất hữu ích trong các trường hợp như đọc giá trị thay đổi điện trở khi chiết áp.

Trong bài viết này mình sẽ hướng dẫn các bạn cách đọc tín hiệu Analog trên mạch ESP32 chi tiết nhé!

Đọc tín hiệu Analog từ chân ESP32 ADC

Tín hiệu đầu vào Analog (ADC)

Việc đọc tín hiệu ESP32 Analog (Analog read ESP32) tương đương với việc chúng ta có thể đo các mức điện áp khác nhau nằm trong khoảng từ 0 V đến 3,3 V.

Sau đó các mức điện áp này được quy đổi thành một giá trị tương ứng nằm trong khoảng từ 0 đến 4095, cụ thể thì:

  • Mức 0V tương ứng với số 0
  • Mức 3,3 V tương ứng với 4095
  • Các giá trị điện áp ở giữa sẽ có giá trị tương ứng nằm trong khoảng từ 0 – 4095
Quy đổi giá trị ESP32 ADC
Quy đổi giá trị các mức điện áp ESP32 ADC

Tuy nhiên, chân ESP32 ADC không có tính tuyến tính. ABC là phi tuyến tính và nó sẽ trả về kết quả là một biểu đồ như sau:

Chân ESP32 ADC là phi tuyến tính
Chân ESP32 ADC là phi tuyến tính

Điều này đồng nghĩa với mạch ESP32 ADC không thể phân biệt được 3,2 V và 3,3 V. Với các mức điện áp này, bạn sẽ nhận được cùng một giá trị là 4095.

Tương tự với các mức điện áp thấp như 0 V hoặc 0,1 V thì bạn sẽ nhận được cùng một giá trị là 0. Do đó, bạn cần phải lưu ý điều này khi sử dụng chân ESP32 ADC.

Đọc tín hiệu Analog bằng hàm AnalogRead()

Việc đọc tín hiệu Analog của mạch ESP32 trên Arduino IDE rất đơn giản, bạn chỉ cần sử dụng hàm sau với thông tin là cổng GPIO mà bạn muốn đọc:

analogRead(GPIO);

Mạch ESP32 hỗ trợ đo tín hiệu Analog ở 18 kênh khác nhau. Bạn có thể xem sơ đồ chân trên board để xác định vị trí các trang ESP32 ADC.

Dưới đây là hình ảnh minh họa các chân ADC trên mạch ESP32 DEVKIT V1:

Hình ảnh minh họa cách chân ESP32 ADC
Hình ảnh minh họa cách chân ESP32 ADC

Cách chân đầu vào này có được phân giải 12 bit. Do đ,ó khi bạn đọc tín hiệu Analog chúng có thể thay đổi trong khoảng giá trị từ 0 đến 4095.

Lưu ý: Khi sử dụng chân ESP32 ADC 2, bạn không thể sử dụng WiFi. Do đó, nếu bạn sử dụng cả hai tính năng này cùng lúc và bị lỗi, thì bạn có thể cân nhắc chuyển sang cổng GPIO ADC1 để thay thế.

Một số hàm khác làm việc với chân ESP32 ADC

Ngoài ra, chân ESP32 ADC sẽ giúp ích rất nhiều trong các dự án khác. Dưới đây là một số hàm chúng ta có thể sử dụng để làm việc với ESP32 ADC:

  • analogReadResolution(resolution): Cấu hình độ phân giải và bit mẫu. Bạn có thể cấu hình các giá trị từ 9 bit (0-511) đến 12 bit (0-4095). Độ phân giải mặc định là 12 bit
  • analogSetCycles(cycles): Đặt số chu kỳ cho mỗi mẫu, giá trị mặc định là 8. Chúng sẽ nằm trong phạm vi từ 1 đến 255.
  • analogSetClockDiv(attenuation): Đặt bộ chia cho đồng hồ ADC giá trị mặc định là 1 
  • adcAttachPin(pin): Gắn một chân vào ADC và trả về kết quả là true hoặc false.

Đọc giá trị Analog từ chiết áp trên mạch ESP32

Để có thể hình dung rõ hơn về các kiến thức trên, mình sẽ hướng dẫn bạn làm một ví dụ đơn giản để đọc giá trị Analog từ mặt chiết áp nhé!

Chuẩn bị

Để thực hành dự án này, bạn cần chuẩn bị các thiết bị sau:

  • Mạch ESP32
  • Mạch chiết áp
  • Breadboard
  • Dây Jumper

Kết nối phần cứng

Bạn tiến hành kết nối chiết áp vào mạch ESP32 của mình như hình dưới, chân giữa của mạch chiết áp phải được kết nối với chân GPIO 34:

Kết nối mạch chiết áp với chân GPIO 34 trên mạch ESP32

Chương trình lập trình

Trong ví dụ này, chúng ta sẽ lập trình mạch ESP32 bằng phần mềm Arduino IDE. Nếu bạn chưa cài phần mềm này hoặc chưa cài tiện ích ESP32, bạn vui lòng làm theo hướng dẫn sau: Cách lập trình ESP32 bằng Arduino IDE (Windows, Linux, Mac OS X)

Sau đó bạn tiến hành copy đoạn mã mà mình đã viết sẵn dưới đây và chạy nhé:

// Potentiometer is connected to GPIO 34 (Analog ADC1_CH6) 
const int potPin = 34;

// variable for storing the potentiometer value
int potValue = 0;

void setup() {
  Serial.begin(115200);
  delay(1000);
}

void loop() {
  // Reading potentiometer value
  potValue = analogRead(potPin);
  Serial.println(potValue);
  delay(500);
}

Đây là một chương trình đơn giản giúp hệ thống đọc các giá trị từ mạch chiết áp và in các giá trị đó ra trong màn hình Serial.

Dưới đây, mình sẽ giải thích chi tiết từng dòng lệnh cho bạn nhé!

Giải thích chương trình

Đầu tiên. chúng ta sẽ cấu hình chân GPIO mà mạch chiết áp đã kết nối (ở đây là cổng GPIO34):

const int potPin = 34;

Chúng ta khởi tạo giao tiếp nối tiếp ở tốc độ truyền (baud rate) 115200:

Serial.begin(115200);

Trong vòng lặp loop(), bạn sử dụng hàm analogRead() để đọc giá trị tín hiệu Analog từ potPin:

potValue = analogRead(potPin);

Cuối cùng, chúng ta sẽ in giá trị đã đọc được ra màn hình cửa sổ Serial:

Serial.println(potValue);

Sau đó, nạn hãy upload chương trình này vào trong mạch ESP32 của bạn nhé! Lưu ý hãy chọn đúng bo mạch và chọn đúng cổng COM đã kết nối.

Kết quả

Sau khi đã nạp chương trình, bạn hãy mở màn hình serial ở tốc độ truyền 115200. Sau đó, bạn hãy thử xoay chiếc áp và xem các giá trị thay đổi như thế nào nhé!

Mở màn hình serial và xoay chiết áp
Mở màn hình serial và xoay chiết áp

Bạn sẽ thấy, giá trị tối đa mình nhận được là 4095 và giá trị thấp nhất là 0 như hình:

Kết quả đo giá trị chiết áp từ chân ESP32 ADC
Kết quả đo giá trị chiết áp từ chân ESP32 ADC

Lời kết

Trong hướng dẫn này, IoTZone đã hướng dẫn bạn cách đọc tín hiệu Analog bằng chân ESP32 ADC trên phần mềm Arduino IDE. Dưới đây, mình sẽ tóm lại một số kiến thức chính  bạn ở cần nắm:

  • Mạch ESP32 hỗ trợ đo tín hiệu Analog ở 18 kênh khác nhau. Bạn có thể đọc sơ đồ mạch mình dùng để hiểu rõ hơn chân nào là chân ESP32 ADC 
  • Các chân này có được phân giải là 12 bit, Điều này tương đương với bạn có thể nhận lại các giá trị nằm trong khoảng từ 0 đến 4095
  • Để đọc giá trị ESP32 Analog bạn cần sử dụng hàm analogRead()
  • ESP32 ADC là phi tuyến tính. Nghĩa là chúng sẽ không phân biệt được các giá trị giữa 3,3 V và 3,2 V.

IoTZone hi vọng rằng kiến thức này hữu ích với bạn. Nếu bạn còn gặp khó khăn nào khác, vui lòng để lại bình luận bên dưới nhé!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *