เขียนโปรแกรม Arduino ด้วยภาษาซี ตัวอย่างที่ 3
บทความนี้จะพาคุณไปเรียนรู้แนวคิดการเขียนโปรแกรมที่สำคัญสองอย่าง นั่นคือ ฟังก์ชัน (Functions) และ โครงสร้างควบคุมเงื่อนไข (Conditional Statements) ซึ่งจะทำให้โค้ดของคุณเป็นระเบียบ, นำกลับมาใช้ใหม่ได้ง่ายขึ้น และมีความสามารถในการตัดสินใจ โดยที่เรายังคงใช้แค่ บอร์ด Arduino Uno และ ไฟ LED ในตัว (Built-in LED) เพื่อให้เห็นผลลัพธ์ได้ง่ายๆ
ทำไมต้องเรียนรู้ฟังก์ชันและโครงสร้างควบคุมเงื่อนไข?
ฟังก์ชัน: เหมือนกับการสร้าง "สูตร" หรือ "ชุดคำสั่ง" ที่สามารถเรียกใช้งานซ้ำๆ ได้ ทำให้โค้ดไม่ซ้ำซ้อน, อ่านง่าย และแก้ไขได้ง่ายขึ้น
โครงสร้างควบคุมเงื่อนไข: ช่วยให้โปรแกรมของคุณสามารถ "คิด" หรือ "ตัดสินใจ" ได้ โดยจะทำงานหรือไม่ทำงานบางส่วนของโค้ด ขึ้นอยู่กับเงื่อนไขที่กำหนด
สิ่งที่คุณต้องเตรียม
บอร์ด Arduino Uno
สาย USB (Type A to Type B)
โปรแกรม Arduino IDE
1. ทำความรู้จักกับ 'ฟังก์ชัน' (Functions)
ฟังก์ชันคือกลุ่มของคำสั่งที่ถูกจัดรวมกันเป็นหน่วยเดียว เพื่อทำงานเฉพาะอย่าง เมื่อคุณต้องการให้งานนั้นๆ เกิดขึ้น คุณก็แค่ "เรียก" ชื่อฟังก์ชันนั้นๆ มาใช้งาน ไม่ต้องเขียนโค้ดซ้ำๆ
โครงสร้างของฟังก์ชัน
returnType functionName(parameter1Type parameter1Name, parameter2Type parameter2Name, ...)
{
// โค้ดที่จะทำงานเมื่อฟังก์ชันถูกเรียกใช้
// ...
return someValue; // (ถ้า returnType ไม่ใช่ void)
}
returnType
: ชนิดของข้อมูลที่ฟังก์ชันจะส่งกลับมา (เช่นint
,float
,bool
) ถ้าฟังก์ชันไม่ได้ส่งค่าอะไรกลับมาเลย ให้ใช้void
functionName
: ชื่อของฟังก์ชันที่คุณตั้งขึ้น ควรเป็นชื่อที่สื่อความหมายparameterType parameterName
: พารามิเตอร์ (หรืออาร์กิวเมนต์) คือข้อมูลที่เราสามารถส่งเข้าไปให้ฟังก์ชันใช้งานได้ (จะไม่มีก็ได้)
ตัวอย่าง:
เราจะสร้างฟังก์ชันสำหรับทำให้ไฟ LED กระพริบ ซึ่งจะทำให้โค้ดใน loop()
ดูเรียบร้อยขึ้น
// ฟังก์ชันสำหรับทำให้ไฟ LED กระพริบ
// รับค่า 'pin' (หมายเลขขา LED) และ 'blinkDelay' (เวลาหน่วงในการกระพริบ)
void blinkLed(int pin, int blinkDelay) {
digitalWrite(pin, HIGH); // เปิดไฟ
delay(blinkDelay); // หน่วงเวลา
digitalWrite(pin, LOW); // ปิดไฟ
delay(blinkDelay); // หน่วงเวลา
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
blinkLed(LED_BUILTIN, 1000); // เรียกใช้ฟังก์ชัน blinkLed ให้ไฟ LED_BUILTIN กระพริบทุก 1 วินาที
blinkLed(LED_BUILTIN, 200); // เรียกใช้ฟังก์ชัน blinkLed ให้ไฟ LED_BUILTIN กระพริบทุก 0.2 วินาที (อีกครั้ง)
}
ในตัวอย่างนี้ เราสามารถเรียกใช้ blinkLed()
ได้หลายครั้งด้วยค่าที่แตกต่างกัน โดยไม่ต้องเขียนโค้ด digitalWrite()
และ delay()
ซ้ำๆ
2. ทำความเข้าใจ 'โครงสร้างควบคุมเงื่อนไข' (Conditional Statements)
โครงสร้างควบคุมเงื่อนไขที่พบบ่อยที่สุดคือ if
, else if
, และ else
ซึ่งช่วยให้โปรแกรมสามารถตัดสินใจว่าจะทำอะไรตามเงื่อนไขที่กำหนด
2.1. if
Statement
จะทำงานเมื่อเงื่อนไขเป็นจริงเท่านั้น
if (condition) {
// โค้ดที่จะทำงานถ้า 'condition' เป็นจริง (true)
}
condition
: นิพจน์ทางตรรกะที่ให้ผลลัพธ์เป็นtrue
หรือfalse
(เช่นx > 10
,sensorValue == 0
)
2.2. if...else
Statement
จะทำงานโค้ดชุดหนึ่งถ้าเงื่อนไขเป็นจริง และทำงานโค้ดอีกชุดหนึ่งถ้าเงื่อนไขเป็นเท็จ
if (condition) {
// โค้ดที่จะทำงานถ้า 'condition' เป็นจริง
} else {
// โค้ดที่จะทำงานถ้า 'condition' เป็นเท็จ
}
2.3. if...else if...else
Statement
ใช้เมื่อมีเงื่อนไขหลายข้อ เพื่อเลือกทำโค้ดชุดใดชุดหนึ่ง
if (condition1) {
// โค้ดที่จะทำงานถ้า 'condition1' เป็นจริง
} else if (condition2) {
// โค้ดที่จะทำงานถ้า 'condition2' เป็นจริง
} else {
// โค้ดที่จะทำงานถ้าเงื่อนไขอื่นๆ ทั้งหมดเป็นเท็จ
}
ตัวดำเนินการเปรียบเทียบ (Comparison Operators) ที่ใช้ในเงื่อนไข:
==
: เท่ากับ (ระวัง! ไม่ใช่=
ซึ่งเป็นการกำหนดค่า)!=
: ไม่เท่ากับ<
: น้อยกว่า>
: มากกว่า<=
: น้อยกว่าหรือเท่ากับ>=
: มากกว่าหรือเท่ากับ
การนำไปใช้จริง: ไฟกระพริบอัจฉริยะ (ด้วยฟังก์ชันและเงื่อนไข)
เราจะเขียนโค้ดที่ทำให้ไฟ LED กระพริบช้า 5 ครั้ง แล้วกระพริบเร็ว 5 ครั้ง สลับกันไปเรื่อยๆ โดยใช้ฟังก์ชันและโครงสร้างควบคุมเงื่อนไข
เปิดโปรแกรม Arduino IDE
คัดลอกโค้ด ด้านล่างนี้ไปวางในหน้าต่าง Arduino IDE:
/* * โปรแกรมไฟกระพริบอัจฉริยะ (Smart Blink) * สาธิตการใช้งานฟังก์ชันและโครงสร้างควบคุมเงื่อนไข (if/else) * ใช้ไฟ LED ในตัวบอร์ด Arduino Uno (ขา 13) */ const int ledPin = LED_BUILTIN; // กำหนดขา LED ที่ต้องการควบคุม (ขา 13) // ตัวแปรสำหรับนับจำนวนรอบการกระพริบ เพื่อใช้ในการเปลี่ยนโหมด int blinkCounter = 0; // ตัวแปรสำหรับเก็บสถานะปัจจุบันของการกระพริบ (true = ช้า, false = เร็ว) bool isSlowBlinkMode = true; // --- ฟังก์ชัน: ทำให้ไฟ LED กระพริบตามจำนวนครั้งและหน่วงเวลาที่กำหนด --- void blinkLedMultipleTimes(int pin, int blinkDelay, int times) { for (int i = 0; i < times; i++) { // วนลูปตามจำนวนครั้งที่กำหนด digitalWrite(pin, HIGH); // เปิดไฟ delay(blinkDelay); // หน่วงเวลา digitalWrite(pin, LOW); // ปิดไฟ delay(blinkDelay); // หน่วงเวลา } } void setup() { // ตั้งค่าขา LED ให้เป็น OUTPUT pinMode(ledPin, OUTPUT); // เริ่มต้น Serial Communication เพื่อดูผลลัพธ์ (ไม่บังคับ แต่มีประโยชน์) Serial.begin(9600); Serial.println("Smart Blink Program Started!"); } void loop() { // เพิ่มค่าตัวนับทุกครั้งที่ loop ทำงาน blinkCounter++; // ตรวจสอบเงื่อนไขว่าตอนนี้ควรจะกระพริบช้าหรือเร็ว if (isSlowBlinkMode == true) { // หรือเขียนย่อๆ ว่า if (isSlowBlinkMode) { Serial.println("Blinking SLOW..."); blinkLedMultipleTimes(ledPin, 500, 5); // กระพริบช้า (500ms) 5 ครั้ง digitalWrite(ledPin, LOW); // ตรวจสอบให้แน่ใจว่าไฟดับหลังกระพริบ delay(1000); // เว้นช่วงก่อนเปลี่ยนโหมด isSlowBlinkMode = false; // เปลี่ยนเป็นโหมดกระพริบเร็วในรอบถัดไป } else { Serial.println("Blinking FAST..."); blinkLedMultipleTimes(ledPin, 100, 5); // กระพริบเร็ว (100ms) 5 ครั้ง digitalWrite(ledPin, LOW); // ตรวจสอบให้แน่ใจว่าไฟดับหลังกระพริบ delay(1000); // เว้นช่วงก่อนเปลี่ยนโหมด isSlowBlinkMode = true; // เปลี่ยนเป็นโหมดกระพริบช้าในรอบถัดไป } // แสดงค่าตัวนับใน Serial Monitor เพื่อให้เห็นว่าโปรแกรมทำงานอยู่ Serial.print("Total loops: "); Serial.println(blinkCounter); Serial.println("--------------------"); }
เสียบสาย USB เชื่อมต่อบอร์ด Arduino Uno
ตั้งค่าบอร์ดและพอร์ต ใน Arduino IDE
อัปโหลดโค้ด: คลิกที่ปุ่ม Upload
ผลลัพธ์ที่ได้
คุณจะเห็นไฟ LED "L" บนบอร์ด Arduino Uno:
กระพริบช้าๆ (ติด 0.5 วินาที, ดับ 0.5 วินาที) เป็นจำนวน 5 ครั้ง
จากนั้นจะหยุดนิ่งไป 1 วินาที
แล้วเริ่ม กระพริบเร็วๆ (ติด 0.1 วินาที, ดับ 0.1 วินาที) เป็นจำนวน 5 ครั้ง
จากนั้นจะหยุดนิ่งไป 1 วินาที
แล้วกลับไปเริ่มกระพริบช้าๆ ใหม่ เป็นแบบนี้ไปเรื่อยๆ
นอกจากนี้ ถ้าคุณเปิด Serial Monitor (Tools > Serial Monitor) และตั้ง Baud rate เป็น 9600
คุณจะเห็นข้อความที่ Arduino พิมพ์ออกมา บอกสถานะการกระพริบและจำนวนรอบที่ทำงานไปแล้ว
สรุปและก้าวต่อไป
ในบทความนี้ คุณได้เรียนรู้สองแนวคิดพื้นฐานแต่ทรงพลังในการเขียนโปรแกรม:
ฟังก์ชัน (
void functionName(...) { ... }
): ช่วยให้คุณจัดกลุ่มโค้ดและนำกลับมาใช้ใหม่ได้ ทำให้โค้ดเป็นระเบียบและจัดการได้ง่ายขึ้นโครงสร้างควบคุมเงื่อนไข (
if
,else if
,else
): ทำให้โปรแกรมของคุณสามารถ "ตัดสินใจ" และเลือกเส้นทางการทำงานตามเงื่อนไขที่กำหนดได้
การผสมผสานฟังก์ชันและโครงสร้างควบคุมเงื่อนไขทำให้คุณสามารถสร้างโปรแกรมที่ซับซ้อนและมีความสามารถมากขึ้นได้ แม้จะยังไม่ต่ออุปกรณ์ภายนอกก็ตาม