🧩 1. ความหมายของ Input / Output (I/O)

Input (อินพุต) คือ ข้อมูลหรือสัญญาณที่ “เข้ามา” สู่ไมโครคอนโทรลเลอร์
Output (เอาต์พุต) คือ ข้อมูลหรือสัญญาณที่ “ออกไป” จากไมโครคอนโทรลเลอร์

ประเภทตัวอย่างจริงคำอธิบาย
Inputปุ่มกด, เซนเซอร์, ข้อมูล SerialMCU “อ่านค่า” เข้ามา
OutputLED, Buzzer, จอ LCD, รีเลย์MCU “ส่งสัญญาณ” ออกไป

⚙️ 2. หมุดขา (Pin) บนบอร์ด Arduino / ESP32

ทุกขามีหน้าที่เฉพาะ และสามารถกำหนดให้เป็น Input หรือ Output ได้

หมวดสัญลักษณ์บนบอร์ดหน้าที่
Digital PinD0 – D13 (Arduino) / GPIO0–39 (ESP32)อ่าน/ส่งสัญญาณดิจิทัล (0/1)
Analog PinA0 – A5 (Arduino) / GPIO32–39 (ESP32)อ่านค่าอนาล็อก (0–1023 หรือ 0–4095)
PWM Pin~ (มีสัญลักษณ์คลื่น)สร้างสัญญาณคลื่นจำลองอนาล็อก
Power Pin3.3V / 5V / GNDจ่ายไฟให้วงจร
Special PinRX/TX, EN, VN, VP, IO2, IO12–15ใช้สำหรับ Serial, Boot, Touch ฯลฯ

🧮 3. การตั้งค่าขา I/O

ใน Arduino/ESP32 ต้องบอกไมโครคอนโทรลเลอร์ก่อนว่าขาไหนจะเป็น Input หรือ Output
โดยใช้คำสั่ง:

C++
pinMode(pin, mode);
modeความหมาย
INPUTขาอ่านข้อมูล
OUTPUTขาส่งสัญญาณ
INPUT_PULLUPขาอ่าน พร้อมเปิดตัวต้านทานภายในแบบ pull-up

📘 ตัวอย่าง:

C++
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

C++
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)

📘 ตัวอย่าง: อ่านปุ่มกด

C++
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)

📘 ตัวอย่าง:

C++
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

C++
const int sensor = 34;

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

void loop() {
  int value = analogRead(sensor);
  Serial.println(value);
  delay(500);
}

🔹 8. การแปลงค่า ADC → แรงดัน (Voltage)

C++
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

C++
analogWrite(9, 128);  // ครึ่งแรงดัน (2.5V)

📘 ตัวอย่าง: ESP32 PWM (แบบใหม่)

C++
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

C++
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()อ่านข้อมูลแบบข้อความ

📘 ตัวอย่าง:

C++
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

C++
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
อ่านค่า DigitaldigitalRead(pin)อ่าน HIGH/LOW
ส่งค่า DigitaldigitalWrite(pin, HIGH/LOW)เขียน HIGH/LOW
อ่านค่า AnaloganalogRead(pin)อ่าน 0–1023 (Arduino) / 0–4095 (ESP32)
ส่งค่า AnaloganalogWrite(pin, value) / ledcWrite()ส่ง PWM
เปิด Pull-upINPUT_PULLUPเปิดตัวต้านทานภายใน
แปลงแรงดัน(value * 3.3 / 4095.0)แปลง ADC เป็นโวลต์
Serial CommSerial.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สื่อสารระหว่างบอร์ดกับคอมพิวเตอร์