🧩 1. ความหมายของ Serial Communication
Serial Communication (การสื่อสารแบบอนุกรม) คือการส่งข้อมูลทีละบิต (bit-by-bit) ผ่านสายเพียง 1 เส้นสำหรับข้อมูล และอีก 1 เส้นสำหรับรับข้อมูล ต่างจากแบบขนาน (Parallel) ที่ส่งหลายบิตพร้อมกัน
💡 ใช้หลัก “TX → RX”
- TX (Transmit) = ส่งข้อมูลออก
- RX (Receive) = รับข้อมูลเข้า
⚙️ 2. Serial ใน Arduino / ESP32
| บอร์ด | พอร์ต Serial หลัก | หมายเหตุ |
|---|---|---|
| Arduino UNO | Serial (ใช้ขา 0, 1) | ใช้สื่อสารกับ USB (PC) |
| Arduino MEGA | Serial1, Serial2, Serial3 | มีหลายพอร์ต |
| ESP32 | Serial, Serial1, Serial2 | ทุกพอร์ตกำหนดขา RX/TX เองได้ |
📘 โดยทั่วไป Serial0 (หรือ Serial) จะเชื่อมกับพอร์ต USB ใช้พิมพ์ข้อความดูผลลัพธ์ผ่าน Serial Monitor ใน Arduino IDE
🔹 3. การเริ่มต้นใช้งาน Serial
ใช้คำสั่ง Serial.begin(baud_rate)
เพื่อเริ่มการสื่อสาร โดยระบุ ความเร็ว (baud rate)
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)
📘 ตัวอย่าง:
void setup() {
Serial.begin(115200);
Serial.print("Temperature = ");
Serial.println(28.5);
Serial.printf("Voltage = %.2f V\n", 3.3);
}
ผลลัพธ์ใน Serial Monitor:
Temperature = 28.50
Voltage = 3.30 V
🔹 5. การรับข้อมูลเข้า (Serial Input)
ใช้คำสั่ง:
Serial.available()→ ตรวจว่ามีข้อมูลเข้ามาหรือยังSerial.read()→ อ่านข้อมูลทีละตัวอักษร (char)Serial.readString()→ อ่านทั้งหมดเป็น StringSerial.readStringUntil('\n')→ อ่านจนกว่าจะเจอตัวจบ (เช่น Enter)
📘 ตัวอย่าง:
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
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()
📘 ตัวอย่าง:
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 เองได้
📘 ตัวอย่าง:
HardwareSerial mySerial(1); // ใช้ Serial1
void setup() {
mySerial.begin(9600, SERIAL_8N1, 16, 17); // RX=16, TX=17
mySerial.println("Hello from Serial1");
}
ใช้ได้สูงสุด 3 ช่องทางพร้อมกัน:
Serial→ USBSerial1→ กำหนดขาเองSerial2→ กำหนดขาเอง
🔹 9. การส่งข้อมูลแบบไบต์ (Binary Data)
นอกจากข้อความ ยังสามารถส่งข้อมูลแบบ “ตัวเลขดิบ” ได้ด้วย
| คำสั่ง | ความหมาย |
|---|---|
Serial.write(value) | ส่งข้อมูล 1 byte |
Serial.write(buffer, length) | ส่งข้อมูลหลาย byte |
📘 ตัวอย่าง:
byte data[3] = {0xAA, 0xBB, 0xCC};
Serial.write(data, 3); // ส่งไบต์ 3 ตัว
🔹 10. การเชื่อมต่อ Serial ระหว่าง 2 บอร์ด
ต่อสาย TX → RX และ GND ร่วมกัน
📘 ตัวอย่าง:
- บอร์ด A (ส่งข้อมูล)
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Hello Board B");
delay(1000);
}
- บอร์ด B (รับข้อมูล)
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 ได้
📘 ตัวอย่าง:
void loop() {
int sensor = analogRead(34);
Serial.println(sensor);
delay(50);
}
เปิด Tools → Serial Plotter จะเห็นกราฟการเปลี่ยนแปลงของค่า sensor
ใช้ได้ดีในการสอนเรื่องสัญญาณแอนะล็อก, การตรวจจับเสียง, LDR, อุณหภูมิ ฯลฯ
🔹 12. การใช้ Serial สำหรับ Debug (ดีบักโปรแกรม)
เรามักใช้ Serial เพื่อดูค่าตัวแปรระหว่างทำงาน
เหมือน “หน้าต่างมองภายในสมองของบอร์ด”
📘 ตัวอย่าง:
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 ใช้ได้พร้อมกัน |
