🧩 1. ความหมายของ String (สตริง)

String คือ “ลำดับของตัวอักษร (characters)” ที่ต่อกัน เช่น "Hello" ใช้เพื่อเก็บข้อความ ตัวอักษร หรือข้อมูลที่อ่าน/ส่งออกเป็น “คำพูด”

ใน Arduino มี 2 รูปแบบของ String ที่ต้องเข้าใจให้ชัด:

ประเภทคำอธิบายตัวอย่าง
C-style string (char[])เก็บข้อความแบบ array ของตัวอักษร ลงท้ายด้วย \0char name[] = "ESP32";
String Object (คลาส String)เป็นคลาสที่ Arduino สร้างเพิ่ม ใช้งานง่าย เหมือนใน Python/JavaString name = "ESP32";

⚙️ 2. การประกาศ String

🔸 แบบ C-style (char array)

C++
char msg1[] = "Hello";     // แบบอัตโนมัติ
char msg2[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // ต้องมี '\0' ตอนจบ

🔸 แบบ String Object

C++
String text = "Hello World";

🔹 3. การแสดงผล String

C++
String name = "LIC College";
Serial.println(name);            // LIC College
Serial.println("Hello " + name); // Hello LIC College

หรือแบบ C-string:

C++
char msg[] = "Arduino";
Serial.println(msg);

🔹 4. การต่อข้อความ (Concatenation)

🔸 แบบ String Object

C++
String s1 = "Hello";
String s2 = "ESP32";
String s3 = s1 + " " + s2;
Serial.println(s3); // Hello ESP32

🔸 แบบ C-string

ต้องใช้ strcat() (จาก <string.h>)

C++
char text[20] = "Hello ";
strcat(text, "ESP32");
Serial.println(text);

🔹 5. การเปรียบเทียบข้อความ

🔸 แบบ String Object

C++
String pass = "1234";
if (pass == "1234") {
  Serial.println("Correct!");
}

สามารถใช้ ==, != ได้โดยตรง

🔸 แบบ C-string

ต้องใช้ strcmp()

C++
char pass[] = "1234";
if (strcmp(pass, "1234") == 0) {
  Serial.println("Correct!");
}

ถ้า strcmp() คืนค่า 0 หมายถึง “เท่ากัน”


🔹 6. การหาความยาวข้อความ

รูปแบบคำสั่งตัวอย่าง
String Object.length()text.length()
C-stringstrlen()strlen(msg)

📘 ตัวอย่าง:

C++
String text = "Arduino";
Serial.println(text.length());  // 7

char msg[] = "ESP32";
Serial.println(strlen(msg));    // 5

🔹 7. การเข้าถึงตัวอักษรใน String

🔸 String Object

C++
String word = "Hello";
Serial.println(word[0]); // 'H'
word[0] = 'Y';
Serial.println(word);    // Yello

🔸 C-string

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

📘 ตัวอย่าง:

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

📘 ตัวอย่าง:

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

📘 ตัวอย่าง:

C++
String msg = "https://lic.ac.th";
if (msg.endsWith(".th")) {
  Serial.println("Thai domain");
}

🔹 10. การตัดข้อความ (Substring)

C++
String text = "Hello ESP32";
String part = text.substring(6);     // "ESP32"
String part2 = text.substring(0, 5); // "Hello"

🔹 11. การแปลงตัวพิมพ์ (Case Conversion)

C++
String msg = "Arduino";
msg.toUpperCase();   // "ARDUINO"
msg.toLowerCase();   // "arduino"

🔹 12. การลบช่องว่าง (Trim)

C++
String input = "  Hello  ";
input.trim();        // ตัดช่องว่างหัว-ท้าย
Serial.println(input);  // "Hello"

🔹 13. การเปลี่ยนข้อความ (Replace)

C++
String s = "Hello ESP8266";
s.replace("ESP8266", "ESP32");
Serial.println(s);  // Hello ESP32

🔹 14. การแยกข้อความ (Split Simulation)

Arduino ไม่มี .split() โดยตรง แต่สามารถใช้ substring() + indexOf() จำลองได้

📘 ตัวอย่าง:

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

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

🔸 จัดรูปแบบข้อความแสดงผล

C++
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()ตรวจต้น–ท้ายข้อความ