สวัสดีครับ เคยไหมครับ เขียนโปรแกรมบน Arduino ไปบางครั้งโปรแกรมไม่ได้ทำงานตามที่คาดหวัง เราจึงอยากทราบว่าตอนนี้โปรแกรมคิดอะไร คำนวณอะไรได้ยังไง เลยเอา Serial.print() ซึ่งเป็นฟังก์ชันที่ใช้คุยกับคอมพิวเตอร์ผ่าน USB port เพื่อส่งข้อมูลเป็นอักขระออกมายังหน้าจอ Serial monitor ถึงจะทราบว่าเอ๊ะ ตอนนี้โปรแกรมคำนวณถึงขั้นตอนไหน ค่าที่คำนวณควรเป็นเท่าไร ลำพังค่าเดียวไม่ค่อยเท่าไร แต่พอมีหลายๆค่าที่ต้องดูเข้า โค้ดเราก็ยาวจนเวียนหัวคล้ายจะเป็นลม ยกตัวอย่างเช่น เราต้องการรู้ว่าตอนนี้ความดันและอุณหภูมิเป็นเท่าไร ให้มันปริ้นออกมายังหน้าจอคอมเรา โดยทั่วไปเราก็ใช้ Serial.print แบบนี้ใช่ไหมครับ
-----
-----
ด้วยวัตถุประสงค์เดียวกัน หากเราย้อนกลับไปเขียน c++ ในคอมพิวเตอร์ เราใช้ฟังก์ชัน printf เราใช้แค่บรรทัดเดียวสำหรับงานนี้จะได้เป็น
-----
-----
จะเห็นได้ว่า เราสามารถนำตัวแปรวางไว้บรรทัดเดียวกับอักขระอื่น ๆ ได้อย่างง่ายดาย เพียงแค่กำหนดตำแหน่งวางค่าตามประเภทตัวแปรให้มัน (%d แทนการวางตัวแปร int, %f แทนการวางตัวแปร float, %s แทนการวางตัวแปร string เป็นต้น)
อ่าว ในเมื่อ Arduino ก็เขียนด้วย C++ แล้วทำไมเราไม่ใช้ printf บน Arduino ซะเลยล่ะ... โชคร้าย... Arduino ไม่มีฟังก์ชันนั้นครับ เลยเหลือตัวเลือกไม่มากนอกจากต้องใช้ Serial.print
แต่เราจะเห็นว่าเราสามารถสั่งให้ Serial.print พิมพ์ตัวแปรที่เป็นประเภท String ออกมาได้ดังนี้
-----
-----
เนื่องด้วยฟังก์ชัน String ใน Arduino พัฒนาขึ้นมาเพื่อเลียนแบบ std::string() (ซึ่งตัว string เดิม ๆ แล้วใช้กับ Arduino ไม่ได้) แต่เพิ่มฟังก์ชันบางอย่างที่ทำให้ง่ายต่อการใช้งาน ลองมาดูตัวอย่างการใช้ String กับตัวแปรประเภทต่าง ๆ กันครับ
String stringOne = "Hello String"; // using a constant String
String stringOne = String('a'); // converting a constant char into a String
String stringTwo = String("This is a string"); // converting a constant string into a String object
String stringOne = String(stringTwo + " with more"); // concatenating two strings
String stringOne = String(13); // using a constant integer
String stringOne = String(analogRead(0), DEC); // using an int and a base
String stringOne = String(45, HEX); // using an int and a base (hexadecimal)
String stringOne = String(255, BIN); // using an int and a base (binary)
String stringOne = String(millis(), DEC); // using a long and a base
String stringOne = String(5.698, 3); // using a float and the decimal places
จะเห็นว่า String แทบจะใช้ได้กับค่าตัวแปรได้เกือบทุกชนิด String ยังมีคุณสมบัติดำเนินการเหมือน string เช่น คุณสมบัติในการต่อข้อความ, การดูอักขระตามตำแหน่ง, การเปรียบเทียบระหว่างสอง String และอื่น ๆ ดังข้อมูลด้านล่าง
อย่างง่ายที่สุดที่เราเอามาใช้ได้ทันทีคือการต่อ String ด้วย + เช่น
String stringOne="Value : ";
String stringTwo="STR two";
String stringThree;
// adding a constant integer to a string:
stringThree = stringOne + 123;
// adding a constant long integer to a string:
stringThree = stringOne + 123456789;
// adding a constant character to a string:
stringThree = stringOne + 'A';
// adding a constant string to a string:
stringThree = stringOne + "abc";
// adding two Strings together:
stringThree = stringOne + stringTwo;
ref. https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/ตัวอย่างการใช้ String อื่น ๆ ที่ควรศึกษา สามารถดูได้ในหัวข้อที่ 8 จากhttps://www.arduino.cc/en/Tutorial/BuiltInExamples#stringsด้วยคุณสมบัติการรับค่าตัวเลขแล้วแปลงเป็น String และคุณสมบัติการ + ของ String ตามข้างต้น เราสามารถจับเอา String ไปใส่ใน Serial.print ได้ดังนี้-----
-----
หรือลดรูปเข้าไปอีก ด้วยการไม่ใส่ String ครอบตัวอักขระ เพราะระบบจะเข้าใจว่าคือ String โดยธรรมชาติอยู่แล้ว จะได้เป็น-----
-----
เห็นไหมครับว่าเราจะลดบรรทัดในการเขียนโปรแกรมลงได้อีกมาก หากนำหลักการนี้ไปใช้ในทุกครั้งในการคุยกับ Computer ด้วย Serial.print ธนบดี บุหลันศรีชาติผู้เขียน