Trong bài viết này chúng ta sẽ học cách lập trình ESP32 Analog Input, hay còn gọi là ADC ( Analog Digital Convert) nghĩa chuyển đổi tín hiệu tương tự sang số, như những vi điều khiển khác.
Bài 2 trong Serie Lập trình ESP32 từ A tới Z
Khái niệm chuyển đổi tương tự sang số ADC
Chuyển đổi tương tự ra số hay ADC ( Analog-to-Digital Converter) là hệ thống mạch thực hiện chuyển đổi một tín hiệu analog (tín hiệu tương tự) liên tục, ví dụ như tín hiệu âm thanh thanh micro, hay tín hiệu ánh sáng trong máy ảnh kỹ thuật số, thành tín hiệu số. Một hệ thống ADC là một bộ phận phần cứng (như một bộ tính toán độc lập) làm nhiệm vụ chuyển đổi tín hiệu analog (dưới dạng điện áp hay dòng điện) thành các giá trị số (digital) đại diện cho cường độ điện áp hay tín hiệu đó.
Có 2 tham số quan trọng của bộ ADC cần lưu ý:
- Tốc độ lấy mẫu (sampling) được tính theo số chu kì chuyển đổi
- Độ phân giải: Tính theo Bit bộ ADC có độ phân giải 10 Bit sẽ có 2^10 = 1024 giá trị
Đọc giá trị tương tự với ESP32 có nghĩa là bạn có thể đo các mức điện áp khác nhau giữa 0V và 3,3V. Điện áp đo được sau đó được gán cho giá trị từ 0 đến 4095, trong đó 0 tương ứng với 0V và 3,3V tương ứng với 4095. Bất kỳ điện áp nào từ 0V đến 3,3V sẽ nhận giá trị tương ứng ở giữa.
Analog Input trong ESP32
Đọc đầu vào tín hiệu tương tự cũng giống như đọc đầu vào tín hiệu số chúng ta chỉ cần một hàm đơn giản đó là analogRead() với tham số truyền vào là số chân GPIO đó.
analogRead(GPIO); example: int value = analogRead(2);
Ngoài ra để có thể cấu hình chi tiết cho Analog Input. Chúng ta có thể sử dụng thêm các hàm sau:
- analogReadResolution(resolution): thiết lập độ phân giải. Giá trị từ 9 (0 – 511) đến 12 bit (0 – 4095). Mặc định là độ phân giải 12 bit.
- analogSetWidth(width): thiết lập độ phân giải. Giá trị từ 9 (0 – 511) đến 12 bit (0 – 4095). Mặc định là độ phân giải 12 bit
- analogSetCycles(cycles): thiết lập số chu kỳ cho một lần lấy mẫu. Mặc định là 8. Phạm vi: 1 đến 255.
- analogSetSamples(samples): đặt số lượng mẫu trong một lần lấy mẫu. Mặc định là 1 mẫu. Nó có tác dụng làm tăng độ nhạy.
- analogSetClockDiv(attenuation): đặt bộ chia cho clock ADC. Mặc định là 1. Phạm vi: 1 đến 255.
- adcAttachPin(pin): Gắn một chân vào chế độ ADC (cũng xóa bất kỳ chế độ tương tự nào khác được bật trên chân đó). Trả về kết quả TRUE hoặc FALSE.
- adcStart(pin): bắt đầu chuyển đổi ADC trên chân
- adcBusy(pin): Kiểm tra xem chân có đang bận chuyển đổi không (trả về TRUE hoặc FALSE).
- resultadcEnd(pin): Nhận kết quả của chuyển đổi: trả về số nguyên 16 bit.
Ví dụ lập trình ESP32 Analog Input đọc giá trị biến trở và in ra màn hình Serial
Trong bài này, chúng ta sẽ sử dụng biến trở để thay đổi điện áp đầu vào, sau đó đọc giá trị và in ra màn hình Serial.
Chúng ta cần chuẩn bị:
- Kit ESP32
- Breadboard: bo cắm
- Biến trở
- Dây dẫn
Sơ đồ kết nối
Kết nối chân thứ 2 của biến trở vào chân 34. Hai chân còn lại chúng ta kết nối với 3.3V và GND. Khi đó biến trở sẽ tạo thành một mạch phân áp. Giá trị điện áp sẽ dao động từ 0 – 3.3V
Code và giải thích code
Tạo một project với Platform IO, sau đó sử dụng code sau
#include <Arduino.h> // định nghĩa chân kết nối ADC const int potPin = 34; // giá trị đo được int potValue = 0; void setup() { Serial.begin(115200); delay(1000); } void loop() { // Đọc giá trị analog potValue = analogRead(potPin); Serial.println(potValue); delay(500); }
Giái thích code:
Định nghĩa chân 34 được kết nối với biến trở
const int potPin = 34;
Khởi tạo serial để truyền lên monitor
Serial.begin(115200);
Đọc giá trị của chân ra biến potValue
potValue = analogRead(potPin);
In kết quả lên Serial Monitor
Serial.println(potValue);
Nạp Code và kết quả
Nhấn biểu tượng mũi tên để nạp. Sau đó nhấn biểu tượng monitor.
Chỉnh giá trị của biến trở và xem sự thay đổi.
Kết luận
ESP32 Analog Input là một bài rất đơn giản nhưng cũng cần sử dụng rất nhiều trong lập trình. Hãy tiếp tục đến với những bài tiếp theo trong seri này nhé. Đừng quên tham gia nhóm Nghiện lập trình để kết nối với những người cùng đam mê.
Kit esp32 mà. Anh đang nhầm chỗ STM32 rồi
😀 anh nhầm, để sửa lại haha
Bạn cho mình hỏi ADC của con ESP32 đóng vai trò gì ở đây? Có phải nó nhận đầu vào là điện áp của chân GPIO rồi chuyển thành số không?
Đúng rồi bạn
alo
bạn cho mình hỏi phần void setup() .. Mình k cần khởi tạo đây là chân ADC nữa hả bạn . mình thấy bài 1 còn phải khởi tạo PinMode là Input or Output mà … tại sao bài này lại k cần vậy bạn ???
đối với đọc tín hiệu Analog, ko cần thiết phải khai báo pinMode chân đó
t có 2 cảm biến. cùng muốn đọc tín hiệu Analog nhưng ESP 8266 chỉ có 1 cổng A0 thì phải làm thế nào ạ