🧩 1. ความหมายของ String (สตริง)
String คือ “ลำดับของตัวอักษร (characters)” ที่ต่อกัน เช่น
"Hello"ใช้เพื่อเก็บข้อความ ตัวอักษร หรือข้อมูลที่อ่าน/ส่งออกเป็น “คำพูด”
ใน Arduino มี 2 รูปแบบของ String ที่ต้องเข้าใจให้ชัด:
| ประเภท | คำอธิบาย | ตัวอย่าง |
|---|---|---|
C-style string (char[]) | เก็บข้อความแบบ array ของตัวอักษร ลงท้ายด้วย \0 | char name[] = "ESP32"; |
| String Object (คลาส String) | เป็นคลาสที่ Arduino สร้างเพิ่ม ใช้งานง่าย เหมือนใน Python/Java | String name = "ESP32"; |
⚙️ 2. การประกาศ String
🔸 แบบ C-style (char array)
char msg1[] = "Hello"; // แบบอัตโนมัติ
char msg2[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // ต้องมี '\0' ตอนจบ
🔸 แบบ String Object
String text = "Hello World";
🔹 3. การแสดงผล String
String name = "LIC College";
Serial.println(name); // LIC College
Serial.println("Hello " + name); // Hello LIC College
หรือแบบ C-string:
char msg[] = "Arduino";
Serial.println(msg);
🔹 4. การต่อข้อความ (Concatenation)
🔸 แบบ String Object
String s1 = "Hello";
String s2 = "ESP32";
String s3 = s1 + " " + s2;
Serial.println(s3); // Hello ESP32
🔸 แบบ C-string
ต้องใช้ strcat() (จาก <string.h>)
char text[20] = "Hello ";
strcat(text, "ESP32");
Serial.println(text);
🔹 5. การเปรียบเทียบข้อความ
🔸 แบบ String Object
String pass = "1234";
if (pass == "1234") {
Serial.println("Correct!");
}
สามารถใช้
==,!=ได้โดยตรง
🔸 แบบ C-string
ต้องใช้ strcmp()
char pass[] = "1234";
if (strcmp(pass, "1234") == 0) {
Serial.println("Correct!");
}
ถ้า
strcmp()คืนค่า 0 หมายถึง “เท่ากัน”
🔹 6. การหาความยาวข้อความ
| รูปแบบ | คำสั่ง | ตัวอย่าง |
|---|---|---|
| String Object | .length() | text.length() |
| C-string | strlen() | strlen(msg) |
📘 ตัวอย่าง:
String text = "Arduino";
Serial.println(text.length()); // 7
char msg[] = "ESP32";
Serial.println(strlen(msg)); // 5
🔹 7. การเข้าถึงตัวอักษรใน String
🔸 String Object
String word = "Hello";
Serial.println(word[0]); // 'H'
word[0] = 'Y';
Serial.println(word); // Yello
🔸 C-string
char word[] = "Hello";
Serial.println(word[1]); // e
word[1] = 'a';
Serial.println(word); // Hallo
🔹 8. การแปลงระหว่างข้อความ ↔ ตัวเลข
🔸 String → Number
| ฟังก์ชัน | ตัวอย่าง | ผลลัพธ์ |
|---|---|---|
.toInt() | "123".toInt() | 123 |
.toFloat() | "3.14".toFloat() | 3.14 |
atoi() | atoi("45") | 45 |
atof() | atof("2.7") | 2.7 |
📘 ตัวอย่าง:
String num = "100";
int val = num.toInt();
Serial.println(val + 50); // 150
🔸 Number → String
| วิธี | ตัวอย่าง | ผลลัพธ์ |
|---|---|---|
String(x) | String(123) | "123" |
String(x, HEX) | String(255, HEX) | "FF" |
itoa() | itoa(123, buf, 10) | "123" |
dtostrf() | dtostrf(3.14, 5, 2, buf) | " 3.14" |
📘 ตัวอย่าง:
int val = 123;
String text = "Value = " + String(val);
Serial.println(text);
🔹 9. การค้นหาข้อความ (Search)
| ฟังก์ชัน | คำอธิบาย | ตัวอย่าง |
|---|---|---|
.indexOf() | หาตำแหน่งข้อความ | s.indexOf("WiFi") |
.startsWith() | เริ่มต้นด้วยคำ | s.startsWith("HTTP") |
.endsWith() | ลงท้ายด้วยคำ | s.endsWith(".com") |
📘 ตัวอย่าง:
String msg = "https://lic.ac.th";
if (msg.endsWith(".th")) {
Serial.println("Thai domain");
}
🔹 10. การตัดข้อความ (Substring)
String text = "Hello ESP32";
String part = text.substring(6); // "ESP32"
String part2 = text.substring(0, 5); // "Hello"
🔹 11. การแปลงตัวพิมพ์ (Case Conversion)
String msg = "Arduino";
msg.toUpperCase(); // "ARDUINO"
msg.toLowerCase(); // "arduino"
🔹 12. การลบช่องว่าง (Trim)
String input = " Hello ";
input.trim(); // ตัดช่องว่างหัว-ท้าย
Serial.println(input); // "Hello"
🔹 13. การเปลี่ยนข้อความ (Replace)
String s = "Hello ESP8266";
s.replace("ESP8266", "ESP32");
Serial.println(s); // Hello ESP32
🔹 14. การแยกข้อความ (Split Simulation)
Arduino ไม่มี .split() โดยตรง แต่สามารถใช้ substring() + indexOf() จำลองได้
📘 ตัวอย่าง:
String data = "23.4,45.6,78.9";
int firstComma = data.indexOf(',');
int secondComma = data.indexOf(',', firstComma + 1);
String part1 = data.substring(0, firstComma);
String part2 = data.substring(firstComma + 1, secondComma);
String part3 = data.substring(secondComma + 1);
Serial.println(part1); // 23.4
Serial.println(part2); // 45.6
Serial.println(part3); // 78.9
🔹 15. การใช้ String ในงานจริง (ESP32)
🔸 อ่านคำสั่งจาก Serial Monitor
String command = "";
void loop() {
if (Serial.available()) {
command = Serial.readStringUntil('\n');
command.trim();
if (command == "ON") digitalWrite(2, HIGH);
else if (command == "OFF") digitalWrite(2, LOW);
}
}
🔸 จัดรูปแบบข้อความแสดงผล
int temp = 28;
float hum = 70.5;
String msg = "T=" + String(temp) + "°C, H=" + String(hum, 1) + "%";
Serial.println(msg);
🔹 16. ความแตกต่างระหว่าง String และ char[]
| หัวข้อ | String (Object) | char[] (C-style) |
|---|---|---|
| ใช้งานง่าย | ✅ ใช้ง่าย | ❌ ต้องใช้ฟังก์ชัน |
| ใช้หน่วยความจำ | มากกว่า | น้อยกว่า |
| เหมาะกับ | โค้ดทั่วไป, Prototype | งานหนัก, Wi-Fi, JSON |
| ฟังก์ชันเสริม | .indexOf(), .replace() | strcmp(), strcat() |
| คำแนะนำ | ใช้ String ในโปรเจ็กต์ทั่วไป | ใช้ char[] ถ้าหน่วยความจำน้อย |
🧠 17. เคล็ดลับ
✅ เริ่มด้วยการเทียบ “ข้อความ” กับ “ตัวอักษรในกล่อง array” ให้เห็นภาพ
✅ ใช้ Serial.println() ทดลองแต่ละคำสั่ง เช่น .length(), .substring()
✅ ฝึก “อ่านคำสั่งจาก Serial” เช่น พิมพ์ ON หรือ OFF แล้วเปิด/ปิด LED
✅ ฝึก “ตัดคำจากข้อความ Sensor” เช่น "25.3,1013" → แยกอุณหภูมิ / ความดัน
📚 18. แบบฝึกหัดท้ายบท (แนะนำ)
1️⃣ เขียนโปรแกรมให้พิมพ์ข้อความ “Hello ESP32” ออกทุก 1 วินาที
2️⃣ อ่านข้อความจาก Serial แล้วตรวจสอบว่าเป็น "ON" หรือ "OFF"
3️⃣ สร้างข้อความ "Temp = xx°C" จากค่าตัวเลขจริง
4️⃣ ใช้ .replace() เปลี่ยนคำ "Arduino" เป็น "ESP32"
5️⃣ เขียนฟังก์ชัน splitComma(String text) เพื่อแยกข้อมูล CSV ออกเป็น 3 ส่วน
🧾 19. สรุปแนวคิดสำคัญ
| แนวคิด | อธิบาย |
|---|---|
| String คือ | ข้อความหรือลำดับตัวอักษร |
| มี 2 แบบ | String object และ char[] |
| ใช้ + ต่อข้อความ | "Hello " + name |
ใช้ .length() / strlen() | นับจำนวนตัวอักษร |
ใช้ .substring() | ตัดส่วนข้อความ |
ใช้ .toInt() / .toFloat() | แปลงข้อความเป็นตัวเลข |
ใช้ .replace() | แทนที่ข้อความบางส่วน |
ใช้ .trim() | ตัดช่องว่างหัวท้าย |
ใช้ .indexOf() | หาตำแหน่งคำในข้อความ |
ใช้ .startsWith() / .endsWith() | ตรวจต้น–ท้ายข้อความ |
