🧩 1. ความหมายของ Serial Communication

Serial Communication (การสื่อสารแบบอนุกรม) คือการส่งข้อมูลทีละบิต (bit-by-bit) ผ่านสายเพียง 1 เส้นสำหรับข้อมูล และอีก 1 เส้นสำหรับรับข้อมูล ต่างจากแบบขนาน (Parallel) ที่ส่งหลายบิตพร้อมกัน

💡 ใช้หลัก “TX → RX”

  • TX (Transmit) = ส่งข้อมูลออก
  • RX (Receive) = รับข้อมูลเข้า

⚙️ 2. Serial ใน Arduino / ESP32

บอร์ดพอร์ต Serial หลักหมายเหตุ
Arduino UNOSerial (ใช้ขา 0, 1)ใช้สื่อสารกับ USB (PC)
Arduino MEGASerial1, Serial2, Serial3มีหลายพอร์ต
ESP32Serial, Serial1, Serial2ทุกพอร์ตกำหนดขา RX/TX เองได้

📘 โดยทั่วไป Serial0 (หรือ Serial) จะเชื่อมกับพอร์ต USB ใช้พิมพ์ข้อความดูผลลัพธ์ผ่าน Serial Monitor ใน Arduino IDE


🔹 3. การเริ่มต้นใช้งาน Serial

ใช้คำสั่ง Serial.begin(baud_rate)
เพื่อเริ่มการสื่อสาร โดยระบุ ความเร็ว (baud rate)

C++
void setup() {
  Serial.begin(115200);  // เริ่มสื่อสารที่ 115200 bps
}
Baud Rateความเร็วหมายเหตุ
9600ปกติใช้ทั่วไป
57600เร็วกว่าปานกลางใช้กับ MCU ที่ต้องการเร็วขึ้น
115200ความเร็วสูงนิยมใช้กับ ESP32
230400+สูงมากใช้ในงานเฉพาะ เช่น Debug Trace

ถ้าใช้ ESP32 แนะนำให้ใช้ 115200 เพื่อความเร็วสูงและเสถียรครับ ✅


🔹 4. การส่งข้อมูลออก (Serial Output)

ใช้คำสั่ง:

  • Serial.print() → แสดงข้อมูลต่อเนื่อง (ไม่ขึ้นบรรทัดใหม่)
  • Serial.println() → แสดงข้อมูลแล้วขึ้นบรรทัดใหม่
  • Serial.printf() → จัดรูปแบบข้อความ (เหมือนภาษา C)

📘 ตัวอย่าง:

C++
void setup() {
  Serial.begin(115200);
  Serial.print("Temperature = ");
  Serial.println(28.5);
  Serial.printf("Voltage = %.2f V\n", 3.3);
}

ผลลัพธ์ใน Serial Monitor:

C++
Temperature = 28.50
Voltage = 3.30 V

🔹 5. การรับข้อมูลเข้า (Serial Input)

ใช้คำสั่ง:

  • Serial.available() → ตรวจว่ามีข้อมูลเข้ามาหรือยัง
  • Serial.read() → อ่านข้อมูลทีละตัวอักษร (char)
  • Serial.readString() → อ่านทั้งหมดเป็น String
  • Serial.readStringUntil('\n') → อ่านจนกว่าจะเจอตัวจบ (เช่น Enter)

📘 ตัวอย่าง:

C++
String data = "";

void setup() {
  Serial.begin(115200);
  Serial.println("Type something:");
}

void loop() {
  if (Serial.available()) {
    data = Serial.readStringUntil('\n');
    Serial.print("You typed: ");
    Serial.println(data);
  }
}

เมื่อพิมพ์ข้อความใน Serial Monitor แล้วกด Enter → โปรแกรมจะพิมพ์กลับออกมา


🔹 6. ตัวอย่างการควบคุมผ่าน Serial

C++
const int LED = 2;

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
  Serial.println("Type ON or OFF:");
}

void loop() {
  if (Serial.available()) {
    String cmd = Serial.readStringUntil('\n');
    cmd.trim();

    if (cmd == "ON") {
      digitalWrite(LED, HIGH);
      Serial.println("LED ON");
    } else if (cmd == "OFF") {
      digitalWrite(LED, LOW);
      Serial.println("LED OFF");
    } else {
      Serial.println("Unknown command");
    }
  }
}

💡 ใช้ Serial Monitor ควบคุม LED ได้เลย พิมพ์ “ON” → เปิดไฟ, “OFF” → ปิดไฟ


🔹 7. การส่งข้อมูลเป็นตัวเลข

สามารถส่งค่าจำนวนเต็มหรือทศนิยมได้โดยตรง
โดยใส่ชนิดข้อมูลใน print() หรือ printf()

📘 ตัวอย่าง:

C++
int adc = analogRead(34);
float volt = adc * 3.3 / 4095.0;
Serial.printf("ADC=%d, Voltage=%.2fV\n", adc, volt);

🔹 8. การกำหนดขา Serial อื่นใน ESP32

ESP32 สามารถสร้าง Serial ใหม่ได้อีก 2 พอร์ต (Serial1, Serial2) และสามารถระบุขา TX / RX เองได้

📘 ตัวอย่าง:

C++
HardwareSerial mySerial(1);  // ใช้ Serial1

void setup() {
  mySerial.begin(9600, SERIAL_8N1, 16, 17); // RX=16, TX=17
  mySerial.println("Hello from Serial1");
}

ใช้ได้สูงสุด 3 ช่องทางพร้อมกัน:

  • Serial → USB
  • Serial1 → กำหนดขาเอง
  • Serial2 → กำหนดขาเอง

🔹 9. การส่งข้อมูลแบบไบต์ (Binary Data)

นอกจากข้อความ ยังสามารถส่งข้อมูลแบบ “ตัวเลขดิบ” ได้ด้วย

คำสั่งความหมาย
Serial.write(value)ส่งข้อมูล 1 byte
Serial.write(buffer, length)ส่งข้อมูลหลาย byte

📘 ตัวอย่าง:

C++
byte data[3] = {0xAA, 0xBB, 0xCC};
Serial.write(data, 3);  // ส่งไบต์ 3 ตัว

🔹 10. การเชื่อมต่อ Serial ระหว่าง 2 บอร์ด

ต่อสาย TX → RX และ GND ร่วมกัน

📘 ตัวอย่าง:

  • บอร์ด A (ส่งข้อมูล)
C++
void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.println("Hello Board B");
  delay(1000);
}
  • บอร์ด B (รับข้อมูล)
C++
void setup() {
  Serial.begin(9600);
}
void loop() {
  if (Serial.available()) {
    String msg = Serial.readStringUntil('\n');
    Serial.println("Received: " + msg);
  }
}

✅ ใช้สื่อสารระหว่าง Arduino ↔ Arduino หรือ ESP32 ↔ Arduino ได้


🔹 11. Serial Plotter (แสดงกราฟแบบ Real-Time)

Arduino IDE มี “Serial Plotter” ใช้ดูค่ากราฟจาก Serial ได้

📘 ตัวอย่าง:

C++
void loop() {
  int sensor = analogRead(34);
  Serial.println(sensor);
  delay(50);
}

เปิด Tools → Serial Plotter จะเห็นกราฟการเปลี่ยนแปลงของค่า sensor

ใช้ได้ดีในการสอนเรื่องสัญญาณแอนะล็อก, การตรวจจับเสียง, LDR, อุณหภูมิ ฯลฯ


🔹 12. การใช้ Serial สำหรับ Debug (ดีบักโปรแกรม)

เรามักใช้ Serial เพื่อดูค่าตัวแปรระหว่างทำงาน
เหมือน “หน้าต่างมองภายในสมองของบอร์ด”

📘 ตัวอย่าง:

C++
int count = 0;
void loop() {
  count++;
  Serial.print("Count = ");
  Serial.println(count);
  delay(500);
}

ครูสามารถให้นักเรียนใช้ Serial แสดงค่าทุกตัวที่ต้องการตรวจสอบ เช่น เซนเซอร์, เงื่อนไข, สถานะ LED ฯลฯ


🔹 13. ฟังก์ชัน Serial ที่ใช้บ่อย

คำสั่งความหมายหมายเหตุ
Serial.begin(baud)เริ่มการสื่อสารต้องอยู่ใน setup()
Serial.end()ปิดการสื่อสารน้อยครั้งที่จะใช้
Serial.available()ตรวจจำนวน byte ที่รออ่านใช้ใน if()
Serial.read()อ่านข้อมูล 1 ตัวอักษรกลับค่าเป็น char
Serial.readString()อ่านข้อมูลทั้งหมดเป็น Stringใช้ง่ายแต่ช้ากว่า
Serial.readStringUntil('\n')อ่านจนถึงตัวจบใช้กับ Serial Monitor
Serial.print() / println()แสดงข้อความออกทาง Serialขึ้นบรรทัด / ไม่ขึ้น
Serial.printf()แสดงข้อความแบบจัดรูปแบบเหมือน printf() ใน C
Serial.write()ส่งข้อมูลดิบ (binary)ใช้กับ byte array

📚 14. แบบฝึกหัด

1️⃣ เขียนโปรแกรมให้รับคำสั่งจาก Serial เช่น “ON” / “OFF” เพื่อควบคุม LED
2️⃣ เขียนโปรแกรมให้พิมพ์ค่า ADC จาก LDR ทุก 0.5 วินาที
3️⃣ เขียนโปรแกรมส่งค่าอุณหภูมิจากบอร์ด A ไปยังบอร์ด B ผ่านสาย TX/RX
4️⃣ ใช้ Serial Plotter แสดงกราฟอุณหภูมิจาก LM35 แบบ Real-time
5️⃣ เขียนฟังก์ชัน Debug ที่ใช้ Serial พิมพ์ค่าตัวแปรเมื่อเงื่อนไขเกิดขึ้น


🧾 15. สรุปแนวคิดสำคัญ

หัวข้ออธิบาย
Serial Communicationการส่งข้อมูลทีละบิตระหว่างอุปกรณ์
TX / RXขาส่ง / ขารับ
Baud Rateความเร็วในการสื่อสาร (bps)
Serial.begin()เริ่มต้นการเชื่อมต่อ
Serial.print / printlnแสดงข้อความออกทาง Serial
Serial.read / readStringอ่านข้อมูลจาก Serial
Serial.availableตรวจสอบว่ามีข้อมูลเข้ามาหรือไม่
Serial Plotterแสดงกราฟข้อมูลจาก Serial
Debugใช้ Serial เพื่อตรวจสอบค่าระหว่างรันโปรแกรม
Multi-Serial (ESP32)มีหลายพอร์ต Serial ใช้ได้พร้อมกัน