Hướng dẫn lập trình ESP32 đọc giá trị biến trở (potentiometer) và các cảm biến analog tương tự như cảm biến ánh sáng (LDR), cảm biến độ ẩm đất, cảm biến nhiệt độ analog… hiển thị kết quả qua Serial và OLED SSD1306.
Mục lục
- Giới thiệu biến trở & tín hiệu analog
- Cách ESP32 đọc tín hiệu analog
- Chuẩn bị phần cứng
- Sơ đồ kết nối
- Code ví dụ 1 – Đọc biến trở và in Serial
- Code ví dụ 2 – Đọc biến trở và hiển thị OLED
- Giải thích mã nguồn
- Gợi ý mở rộng
- Lỗi thường gặp
1) Giới thiệu biến trở & tín hiệu analog
Biến trở (potentiometer) là linh kiện có thể thay đổi giá trị điện trở thông qua xoay trục điều chỉnh.
Khi nối vào ESP32, ta sẽ đọc điện áp ngõ ra (0–3.3V) tương ứng với mức ADC (0–4095).
Công thức chuyển đổi:

2) Cách ESP32 đọc tín hiệu analog
- ESP32 có ADC 12-bit (0–4095).
- Điện áp đọc được nằm trong 0–3.3V.
- Một số chân ADC khuyến nghị dùng: GPIO32, GPIO33, GPIO34, GPIO35, GPIO36, GPIO39.
- Không dùng GPIO0, GPIO2, GPIO15 khi boot.
3) Chuẩn bị phần cứng
| Linh kiện | Số lượng | Ghi chú |
|---|---|---|
| ESP32 DevKit V1 | 1 | Board chính |
| Biến trở 10kΩ | 1 | Loại 3 chân |
| OLED SSD1306 I2C (0.96″) | 1 | Hiển thị giá trị |
| Dây nối, breadboard | — | — |
4) Sơ đồ kết nối

| Biến trở Pin | ESP32 Pin | Ghi chú |
|---|---|---|
| Chân 1 | 3.3V | Cấp nguồn |
| Chân 2 (giữa) | GPIO34 | Đọc tín hiệu analog |
| Chân 3 | GND | Mass |
OLED (I2C):
- SDA → GPIO21
- SCL → GPIO22
- VCC → 3.3V
- GND → GND
5) Code ví dụ 1 – Đọc biến trở và in Serial
#define POT_PIN 34
const float VREF = 3.3;
void setup() {
Serial.begin(115200);
analogReadResolution(12); // 12-bit = 0..4095
Serial.println("ESP32 Potentiometer Read Demo");
}
void loop() {
int raw = analogRead(POT_PIN);
float voltage = raw * VREF / 4095.0;
Serial.print("ADC: ");
Serial.print(raw);
Serial.print("\tVoltage: ");
Serial.print(voltage, 2);
Serial.println(" V");
delay(300);
}
6) Code ví dụ 2 – Hiển thị giá trị lên OLED
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define POT_PIN 34
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const float VREF = 3.3;
void setup() {
Serial.begin(115200);
analogReadResolution(12);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED init failed!"));
while (true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("ESP32 + Potentiometer"));
display.display();
delay(1000);
}
void loop() {
int raw = analogRead(POT_PIN);
float voltage = raw * VREF / 4095.0;
float percent = (voltage / 3.3) * 100.0;
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Analog Read"));
display.setTextSize(2);
display.setCursor(0, 20);
display.print(percent, 1);
display.println("%");
display.setTextSize(1);
display.setCursor(0, 50);
display.print(voltage, 2);
display.println(" V");
display.display();
Serial.printf("ADC=%d, %.2fV (%.1f%%)\n", raw, voltage, percent);
delay(300);
}
7) Giải thích mã nguồn
analogReadResolution(12): Đặt độ phân giải ADC 12-bit (0–4095).- Tính toán điện áp:
V = raw * 3.3 / 4095. - Tính phần trăm:
(V / 3.3) * 100. - OLED hiển thị cả giá trị phần trăm và điện áp, giúp dễ quan sát.
8) Gợi ý mở rộng
- Dùng cảm biến ánh sáng (LDR) hoặc độ ẩm đất thay biến trở (tín hiệu tương tự).
- Dùng servo/motor điều khiển theo giá trị biến trở.
- Gửi dữ liệu qua MQTT hoặc Bluetooth.
- Vẽ biểu đồ realtime trên màn hình TFT hoặc Web.
9) Lỗi thường gặp
| Lỗi | Nguyên nhân | Cách xử lý |
|---|---|---|
| Giá trị dao động | Không lọc nhiễu | Dùng trung bình 10 mẫu |
| Giá trị sai lệch | Cấp sai điện áp hoặc GND không chung | Kiểm tra wiring |
| OLED không hiển thị | Sai địa chỉ I2C | Dò lại địa chỉ (0x3C hoặc 0x3D) |


Để lại một bình luận