Series
Lập Trình ESP32 Cơ Bản
  1. Series Lập Trình ESP32 Cơ Bản – Giới Thiệu: Lộ Trình 19 Bài Từ Số 0
  2. 1Lập trình ESP32 – Bài 1: ESP32 là gì? Hướng dẫn bắt đầu với ESP32 cho người mới
  3. 2Lập trình ESP32 – Bài 2: Kết nối WiFi và kiểm tra Internet với ESP32
  4. 3Lập trình ESP32 – Bài 3: Đọc nút nhấn và điều khiển LED với ESP32
  5. 4Lập trình ESP32 – Bài 4: Đọc nhiệt độ & độ ẩm với cảm biến DHT11
  6. 5Lập trình ESP32 – Bài 5: ESP32 Web Server – Điều khiển LED qua trình duyệt
  7. 6Lập trình ESP32 – Bài 6: Điều khiển LED RGB
  8. 7Lập trình ESP32 – Bài 7: Điều khiển Relay qua Web Server
  9. 8Lập trình ESP32 – Bài 8: WebSocket – Điều khiển LED realtime từ trình duyệt
  10. 9Lập trình ESP32 – Bài 9: Đọc cảm biến ánh sáng (LDR) và hiển thị realtime qua WebSocket
  11. 10Lập trình ESP32 – Bài 10: Điều khiển Servo SG90 qua Web Server
  12. 11Lập trình ESP32 – Bài 11: Đọc các loại biến trở (Potentiometer / Analog Sensor)
  13. 12Lập trình ESP32 – Bài 12: Đọc cảm biến khoảng cách HC-SR04
  14. 13Lập trình ESP32 – Bài 13: ESP32 – Đọc cảm biến nhiệt độ, độ ẩm DHT11 và hiển thị dữ liệu realtime qua WebSocket
  15. 14Lập trình ESP32 – Bài 14: Hiển thị màn hình TFT (SPI)
  16. 15Lập trình ESP32 – Bài 15: Màn hình OLED SSD1306 (I2C)
  17. 16Lập trình ESP32 – Bài 16: Module SIM 4G A7680C – Gọi điện thoại, in thông tin SIM/Module, trạng thái 4G
  18. 17Lập trình ESP32 – Bài 17: Phát nhạc MP3 với module DFPlayer Mini
  19. 18Lập trình ESP32 – Bài 18: Đọc cảm biến khí gas MQ-2 và hiển thị lên màn hình OLED
  20. 19Lập trình ESP32 – Bài 19: Kết nối MQTT, Publish dữ liệu cảm biến & Subscribe điều khiển thiết bị
Kiến thức

Lập trình ESP32 – Bài 11: Đọc các loại biến trở (Potentiometer / Analog Sensor)

Th11 2025
Lập trình ESP32 – Bài 11: Đọc các loại biến trở (Potentiometer / Analog Sensor)

Hướng dẫn lập trình ESP32 đọc giá trị biến trở (potentiometer)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 SerialOLED SSD1306.

Mục lục

  1. Giới thiệu biến trở & tín hiệu analog
  2. Cách ESP32 đọc tín hiệu analog
  3. Chuẩn bị phần cứng
  4. Sơ đồ kết nối
  5. Code ví dụ 1 – Đọc biến trở và in Serial
  6. Code ví dụ 2 – Đọc biến trở và hiển thị OLED
  7. Giải thích mã nguồn
  8. Gợi ý mở rộng
  9. 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ệnSố lượngGhi chú
ESP32 DevKit V11Board chính
Biến trở 10kΩ1Loại 3 chân
OLED SSD1306 I2C (0.96″)1Hiển thị giá trị
Dây nối, breadboard

4) Sơ đồ kết nối

Biến trở PinESP32 PinGhi chú
Chân 13.3VCấp nguồn
Chân 2 (giữa)GPIO34Đọc tín hiệu analog
Chân 3GNDMass

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ỗiNguyên nhânCách xử lý
Giá trị dao độngKhông lọc nhiễuDùng trung bình 10 mẫu
Giá trị sai lệchCấp sai điện áp hoặc GND không chungKiểm tra wiring
OLED không hiển thịSai địa chỉ I2CDò lại địa chỉ (0x3C hoặc 0x3D)