ใช้ ตัวต้านทานปรับค่าได้ (VR / Potentiometer) ควบคุม ค่าดิจิทัลบน ICON-32 และนำไปใช้ควบคุมความสว่าง LED (PWM)


🎯 จุดประสงค์การเรียนรู้

  • อธิบายได้ว่า VR คืออะไร / ทำหน้าที่อะไรในวงจร
  • เข้าใจแนวคิด ตัวแบ่งแรงดัน (Voltage Divider) อย่างง่าย
  • อ่านค่าแอนะล็อกจากขา ADC ของ ICON-32 (ESP32) ได้
  • ใช้ฟังก์ชัน analogRead() + map() เพื่อแปลงค่า
  • ควบคุมความสว่าง LED ตามค่าจาก VR ด้วย PWM (เช่น ledcWrite() บน ESP32)

🧩 อุปกรณ์ที่ใช้

ลำดับรายการอุปกรณ์จำนวน
1บอร์ดไมโครคอนโทรลเลอร์ ICON-32 (ESP32)1
2ตัวต้านทานปรับค่าได้ (VR) แบบมีแกนหมุน1
3LED 3 มม. + ตัวต้านทาน 220Ω1
4สาย Jumper6–8 เส้น
5Breadboard1

🧠 1) VR คืออะไร?

VR (Variable Resistor / Potentiometer) คือ ตัวต้านทานที่ปรับค่าได้โดยการหมุนแกน
มี 3 ขา:

  • ขา 1 → ต่อกับ VCC
  • ขา 3 → ต่อกับ GND
  • ขา 2 (กลาง, Wiper) → แรงดันแปรผันตามการหมุน (0V–VCC)

แนวคิด: Voltage Divider

เมื่อเราหมุน VR → ค่าแรงดันที่ขากลางจะเปลี่ยนกลายเป็น “แรงดันแอนะล็อก” ที่เรานำไปเข้าขา ADC ของ ESP32 ได้


🔌 2) การต่อวงจร VR เข้ากับ ICON-32

ให้ใช้ แรงดัน 3.3V จาก ICON-32 นะครับ (อย่าใช้ 5V)

C++
ICON-32 (ESP32)

3.3V ──────────┐

             [ VR ]

GND ───────────┘

ขากลาง (Wiper) ของ VR ───► GPIO 34 (ADC)
  • ขา 1 ของ VR → 3.3V
  • ขา 3 ของ VR → GND
  • ขากลาง → ขา ADC (เช่น GPIO 34, 35, 36, 39 ฯลฯ – เลือกขา ADC ได้)

⚙️ 3) การอ่านค่าแอนะล็อกบน ESP32 (ICON-32)

บน ESP32: analogRead(pin) ให้ค่า 0–4095 (12-bit ADC)

💻 โปรแกรมที่ 1: อ่าน VR แล้วแสดงใน Serial Monitor

C++
const int vrPin = 34; // ขา ADC
int value = 0;

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

void loop() {
  value = analogRead(vrPin);   // อ่านค่า 0–4095
  Serial.println(value);
  delay(200);
}

ให้นักเรียน:

  • เปิด Serial Monitor
  • หมุน VR แล้วดูว่าค่าเปลี่ยนจาก ใกล้ 0 → ใกล้ 4095

💡 4) แปลงค่า ADC → ช่วงที่ต้องการ (เช่น 0–100%)

เราสามารถใช้ map() เพื่อแปลงช่วง 0–4095 ให้เป็นเปอร์เซ็นต์ 0–100

C++
const int vrPin = 34;

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

void loop() {
  int raw = analogRead(vrPin);
  int percent = map(raw, 0, 4095, 0, 100);

  Serial.print("RAW = ");
  Serial.print(raw);
  Serial.print("  ,  ");
  Serial.print("PERCENT = ");
  Serial.print(percent);
  Serial.println(" %");

  delay(200);
}

ใช้ตัวอย่างนี้เชื่อมกับเนื้อหาคณิต: สัดส่วน / การสเกลค่า


💡 5) ควบคุมความสว่าง LED ด้วย VR (PWM)

บน ESP32 เราควรใช้ ระบบ PWM แบบ ledcWrite() (เพราะ analogWrite() ไม่มีใน ESP32 core แบบปกติ)

🔌 การต่อวงจร LED

C++
GPIO 2 ──[220Ω]──►|─── GND
                LED

💻 โปรแกรมที่ 2: VR → LED Brightness (ESP32 แบบ ledc)

C++
const int vrPin = 34;   // ขาอ่านค่า VR
const int ledPin = 2;   // ขา PWM ออกไปหา LED

// กำหนดช่องสัญญาณ PWM
const int pwmChannel = 0;
const int pwmFreq = 5000;      // ความถี่ 5 kHz
const int pwmResolution = 8;   // ความละเอียด 8 บิต (0–255)

void setup() {
  Serial.begin(115200);

  // ตั้งค่า PWM
  ledcSetup(pwmChannel, pwmFreq, pwmResolution);
  ledcAttachPin(ledPin, pwmChannel);
}

void loop() {
  int raw = analogRead(vrPin);               // 0–4095
  int pwmValue = map(raw, 0, 4095, 0, 255);  // แปลงเป็น 0–255

  ledcWrite(pwmChannel, pwmValue);

  Serial.print("RAW:");
  Serial.print(raw);
  Serial.print("  PWM:");
  Serial.println(pwmValue);

  delay(50);
}

หมุน VR → ความสว่าง LED จะเพิ่ม–ลดตามค่า จะเห็นความสัมพันธ์ “แรงดันแอนะล็อก → ค่าดิจิทัล → PWM → ความสว่าง”


🧠 6) อธิบายแนวคิด PWM ง่าย ๆ

ไมโครคอนโทรลเลอร์ “เปิด–ปิด” ไฟอย่างรวดเร็วมาก ๆ
ถ้าเปิดนานกว่าปิด → ดูเหมือนไฟสว่าง
ถ้าปิดนานกว่าเปิด → ดูเหมือนไฟหรี่

  • ค่า PWM = 0 → ปิดตลอด (0% duty)
  • ค่า PWM = 127 → เปิดครึ่ง–ปิดครึ่ง (50% duty)
  • ค่า PWM = 255 → เปิดตลอด (100% duty)

🧪 7) แบบฝึกหัด

  1. เปลี่ยนค่า pwmResolution เป็น 10 บิต (0–1023)
    • แล้วแก้ map() ให้สอดคล้อง
  2. แสดงข้อความใน Serial Monitor ว่า:
    • "Brightness: XX %" แทนค่า PWM ตรง ๆ
  3. ต่อ LED อีกดวง:
    • LED1 = ความสว่างตรงตามค่า VR
    • LED2 = กลับด้าน (VR มาก → หรี่, VR น้อย → สว่าง)
  4. ใช้ VR ควบคุม “ความเร็วไฟวิ่ง” (EP2):
    • VR ต่ำ → วิ่งช้า
    • VR สูง → วิ่งเร็ว

📊 ตารางสรุปคำสั่ง

คำสั่งหน้าที่ตัวอย่าง
analogRead(pin)อ่านค่า ADC (0–4095 บน ESP32)int x = analogRead(34);
map(val, inMin, inMax, outMin, outMax)แปลงช่วงค่าmap(raw, 0, 4095, 0, 255);
ledcSetup(ch, freq, res)ตั้งค่า PWM ChannelledcSetup(0, 5000, 8);
ledcAttachPin(pin, ch)ผูกขา GPIO กับช่อง PWMledcAttachPin(2, 0);
ledcWrite(ch, val)เขียนค่า PWMledcWrite(0, 128);

🧾 8) สรุป

หัวข้อสรุป
VRตัวต้านทานปรับค่า ทำหน้าที่แบ่งแรงดัน
Voltage Dividerทำให้ได้แรงดันแปรผัน 0–3.3V ที่ขากลาง
ADC (Analog to Digital Converter)แปลงแรงดันเป็นตัวเลขดิจิทัล (0–4095)
PWMปรับความสว่างโดยการเปิด–ปิดไฟด้วย Duty Cycle
การประยุกต์ปุ่มปรับระดับเสียง, ปรับความสว่างไฟ, ปรับความเร็วพัดลม ฯลฯ