ใช้ ตัวต้านทานปรับค่าได้ (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 |
| 3 | LED 3 มม. + ตัวต้านทาน 220Ω | 1 |
| 4 | สาย Jumper | 6–8 เส้น |
| 5 | Breadboard | 1 |
🧠 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)
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
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
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
GPIO 2 ──[220Ω]──►|─── GND
LED
💻 โปรแกรมที่ 2: VR → LED Brightness (ESP32 แบบ ledc)
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) แบบฝึกหัด
- เปลี่ยนค่า
pwmResolutionเป็น 10 บิต (0–1023)- แล้วแก้
map()ให้สอดคล้อง
- แล้วแก้
- แสดงข้อความใน Serial Monitor ว่า:
"Brightness: XX %"แทนค่า PWM ตรง ๆ
- ต่อ LED อีกดวง:
- LED1 = ความสว่างตรงตามค่า VR
- LED2 = กลับด้าน (VR มาก → หรี่, VR น้อย → สว่าง)
- ใช้ 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 Channel | ledcSetup(0, 5000, 8); |
ledcAttachPin(pin, ch) | ผูกขา GPIO กับช่อง PWM | ledcAttachPin(2, 0); |
ledcWrite(ch, val) | เขียนค่า PWM | ledcWrite(0, 128); |
🧾 8) สรุป
| หัวข้อ | สรุป |
|---|---|
| VR | ตัวต้านทานปรับค่า ทำหน้าที่แบ่งแรงดัน |
| Voltage Divider | ทำให้ได้แรงดันแปรผัน 0–3.3V ที่ขากลาง |
| ADC (Analog to Digital Converter) | แปลงแรงดันเป็นตัวเลขดิจิทัล (0–4095) |
| PWM | ปรับความสว่างโดยการเปิด–ปิดไฟด้วย Duty Cycle |
| การประยุกต์ | ปุ่มปรับระดับเสียง, ปรับความสว่างไฟ, ปรับความเร็วพัดลม ฯลฯ |
