🧩 1. ความหมายของ Input / Output (I/O)
Input (อินพุต) คือ ข้อมูลหรือสัญญาณที่ “เข้ามา” สู่ไมโครคอนโทรลเลอร์
Output (เอาต์พุต) คือ ข้อมูลหรือสัญญาณที่ “ออกไป” จากไมโครคอนโทรลเลอร์
| ประเภท | ตัวอย่างจริง | คำอธิบาย |
|---|---|---|
| Input | ปุ่มกด, เซนเซอร์, ข้อมูล Serial | MCU “อ่านค่า” เข้ามา |
| Output | LED, Buzzer, จอ LCD, รีเลย์ | MCU “ส่งสัญญาณ” ออกไป |
⚙️ 2. หมุดขา (Pin) บนบอร์ด Arduino / ESP32
ทุกขามีหน้าที่เฉพาะ และสามารถกำหนดให้เป็น Input หรือ Output ได้
| หมวด | สัญลักษณ์บนบอร์ด | หน้าที่ |
|---|---|---|
| Digital Pin | D0 – D13 (Arduino) / GPIO0–39 (ESP32) | อ่าน/ส่งสัญญาณดิจิทัล (0/1) |
| Analog Pin | A0 – A5 (Arduino) / GPIO32–39 (ESP32) | อ่านค่าอนาล็อก (0–1023 หรือ 0–4095) |
| PWM Pin | ~ (มีสัญลักษณ์คลื่น) | สร้างสัญญาณคลื่นจำลองอนาล็อก |
| Power Pin | 3.3V / 5V / GND | จ่ายไฟให้วงจร |
| Special Pin | RX/TX, EN, VN, VP, IO2, IO12–15 | ใช้สำหรับ Serial, Boot, Touch ฯลฯ |
🧮 3. การตั้งค่าขา I/O
ใน Arduino/ESP32 ต้องบอกไมโครคอนโทรลเลอร์ก่อนว่าขาไหนจะเป็น Input หรือ Output
โดยใช้คำสั่ง:
pinMode(pin, mode);
| mode | ความหมาย |
|---|---|
INPUT | ขาอ่านข้อมูล |
OUTPUT | ขาส่งสัญญาณ |
INPUT_PULLUP | ขาอ่าน พร้อมเปิดตัวต้านทานภายในแบบ pull-up |
📘 ตัวอย่าง:
pinMode(2, OUTPUT); // ขา 2 เป็น Output
pinMode(15, INPUT); // ขา 15 เป็น Input
pinMode(4, INPUT_PULLUP);// ขา 4 เป็น Input พร้อม pull-up
💡 4. การใช้งานขา Output (Digital Output)
ใช้ส่งสัญญาณ HIGH หรือ LOW ออกไปยังอุปกรณ์ เช่น LED, Relay
| คำสั่ง | ความหมาย |
|---|---|
digitalWrite(pin, HIGH) | ส่งสัญญาณ “1” (5V หรือ 3.3V) |
digitalWrite(pin, LOW) | ส่งสัญญาณ “0” (0V) |
📘 ตัวอย่าง: เปิด-ปิดไฟ LED
const int LED = 2;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH); // เปิดไฟ
delay(500);
digitalWrite(LED, LOW); // ปิดไฟ
delay(500);
}
🔹 5. การใช้งานขา Input (Digital Input)
ใช้รับค่าจากปุ่มกด หรือสวิตช์
| คำสั่ง | ความหมาย |
|---|---|
digitalRead(pin) | อ่านค่าสถานะจากขา (HIGH/LOW) |
📘 ตัวอย่าง: อ่านปุ่มกด
const int button = 4;
const int led = 2;
void setup() {
pinMode(button, INPUT);
pinMode(led, OUTPUT);
}
void loop() {
int state = digitalRead(button);
if (state == HIGH)
digitalWrite(led, HIGH);
else
digitalWrite(led, LOW);
}
⚠️ 6. การใช้ INPUT_PULLUP (ปุ่มไม่ต้องต่อตัวต้านทานภายนอก)
ESP32 / Arduino มี ตัวต้านทาน Pull-up ภายใน (internal resistor)
ช่วยให้ต่อปุ่มได้ง่ายขึ้น (ขา → GND)
📘 ตัวอย่าง:
const int button = 4;
const int led = 2;
void setup() {
pinMode(button, INPUT_PULLUP);
pinMode(led, OUTPUT);
}
void loop() {
if (digitalRead(button) == LOW) // ปุ่มถูกกด (ต่อกราวด์)
digitalWrite(led, HIGH);
else
digitalWrite(led, LOW);
}
🧠 หมายเหตุ: ใช้ INPUT_PULLUP จะได้ค่า กลับด้าน
- ปุ่มไม่กด → HIGH
- ปุ่มกด → LOW
🔹 7. การอ่านค่าจาก Analog Input (ADC)
ใช้กับขาที่รองรับ Analog เช่น A0–A5 (Arduino), GPIO32–39 (ESP32)
| คำสั่ง | ความหมาย |
|---|---|
analogRead(pin) | อ่านค่าจาก 0–1023 (Arduino) / 0–4095 (ESP32) |
📘 ตัวอย่าง: อ่านค่าแสงจาก LDR
const int sensor = 34;
void setup() {
Serial.begin(115200);
}
void loop() {
int value = analogRead(sensor);
Serial.println(value);
delay(500);
}
🔹 8. การแปลงค่า ADC → แรงดัน (Voltage)
int value = analogRead(34);
float voltage = (float)value * 3.3 / 4095.0;
Serial.printf("Voltage = %.2f V\n", voltage);
🔹 9. การส่งออกแบบ Analog Output (PWM)
ESP32/Arduino ไม่มี “DAC จริง” ทุกขา
แต่ใช้เทคนิค PWM (Pulse Width Modulation) จำลองค่า Analog ออกมาได้
| คำสั่ง | ความหมาย |
|---|---|
analogWrite(pin, value) | ส่งค่าระดับ 0–255 (Arduino) |
ledcWrite(channel, value) | ส่ง PWM (ESP32) |
📘 ตัวอย่าง: Arduino UNO
analogWrite(9, 128); // ครึ่งแรงดัน (2.5V)
📘 ตัวอย่าง: ESP32 PWM (แบบใหม่)
const int led = 2;
void setup() {
ledcSetup(0, 5000, 8); // channel, freq, resolution
ledcAttachPin(led, 0);
}
void loop() {
for (int i=0; i<=255; i++) {
ledcWrite(0, i);
delay(5);
}
for (int i=255; i>=0; i--) {
ledcWrite(0, i);
delay(5);
}
}
🔸 ใช้ได้กับ ESP32 ทุกขา (ยืดหยุ่นกว่า Arduino มาก)
🔹 10. ตัวอย่างการใช้ Input/Output ร่วมกัน
📘 ตัวอย่าง: ปุ่มควบคุมไฟ LED
const int button = 4;
const int led = 2;
void setup() {
pinMode(button, INPUT_PULLUP);
pinMode(led, OUTPUT);
}
void loop() {
if (digitalRead(button) == LOW) { // เมื่อกดปุ่ม
digitalWrite(led, HIGH);
} else {
digitalWrite(led, LOW);
}
}
🔹 11. การใช้ Serial I/O (การสื่อสารผ่านพอร์ตอนุกรม)
Serial คือ “ช่องทาง I/O แบบข้อความ”
ใช้สื่อสารระหว่าง Arduino/ESP32 ↔ คอมพิวเตอร์
| คำสั่ง | ความหมาย |
|---|---|
Serial.begin(baud) | เริ่มการสื่อสาร |
Serial.print() | ส่งข้อมูลโดยไม่ขึ้นบรรทัด |
Serial.println() | ส่งข้อมูลพร้อมขึ้นบรรทัดใหม่ |
Serial.read() | อ่านข้อมูลแบบตัวอักษร |
Serial.readString() | อ่านข้อมูลแบบข้อความ |
📘 ตัวอย่าง:
void setup() {
Serial.begin(115200);
}
void loop() {
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
Serial.println("You typed: " + cmd);
}
}
🔹 12. ตัวอย่างรวม: Sensor → LED → Serial Monitor
int sensorPin = 34;
int led = 2;
void setup() {
Serial.begin(115200);
pinMode(led, OUTPUT);
}
void loop() {
int value = analogRead(sensorPin);
float voltage = (float)value * 3.3 / 4095.0;
Serial.printf("Sensor = %d (%.2f V)\n", value, voltage);
if (voltage > 1.5)
digitalWrite(led, HIGH);
else
digitalWrite(led, LOW);
delay(500);
}
🧠 13. สรุปคำสั่งพื้นฐาน I/O
| ประเภท | คำสั่ง | ความหมาย |
|---|---|---|
| ตั้งค่าขา | pinMode(pin, mode) | กำหนดให้ขาเป็น Input/Output |
| อ่านค่า Digital | digitalRead(pin) | อ่าน HIGH/LOW |
| ส่งค่า Digital | digitalWrite(pin, HIGH/LOW) | เขียน HIGH/LOW |
| อ่านค่า Analog | analogRead(pin) | อ่าน 0–1023 (Arduino) / 0–4095 (ESP32) |
| ส่งค่า Analog | analogWrite(pin, value) / ledcWrite() | ส่ง PWM |
| เปิด Pull-up | INPUT_PULLUP | เปิดตัวต้านทานภายใน |
| แปลงแรงดัน | (value * 3.3 / 4095.0) | แปลง ADC เป็นโวลต์ |
| Serial Comm | Serial.begin(), print(), read() | I/O ผ่านพอร์ตอนุกรม |
📚 14. แบบฝึก
1️⃣ เขียนโปรแกรมเปิดไฟ LED กระพริบทุก 1 วินาที
2️⃣ เขียนโปรแกรมอ่านค่าปุ่มกด แล้วเปิด/ปิด LED
3️⃣ เขียนโปรแกรมอ่านค่า LDR แล้วพิมพ์ค่า ADC ออกทาง Serial
4️⃣ เขียนโปรแกรม PWM ควบคุมความสว่าง LED
5️⃣ เขียนโปรแกรมรับข้อความ "ON" / "OFF" จาก Serial แล้วควบคุม LED
🧾 15. สรุป
| แนวคิด | อธิบาย |
|---|---|
| Input | ขาอ่านข้อมูลจากภายนอก |
| Output | ขาส่งสัญญาณออกไปควบคุมอุปกรณ์ |
| Digital | มีแค่ 2 ค่า (0/1 หรือ LOW/HIGH) |
| Analog | มีค่าต่อเนื่อง 0–1023 หรือ 0–4095 |
| pinMode() | กำหนดโหมดของขา |
| digitalRead / Write | อ่าน/เขียนดิจิทัล |
| analogRead / Write | อ่าน/เขียนอนาล็อก |
| PWM | สัญญาณจำลองอนาล็อก (Duty Cycle) |
| Serial I/O | สื่อสารระหว่างบอร์ดกับคอมพิวเตอร์ |
