เขียนโปรแกรม Arduino ด้วยภาษาซี ตัวอย่างที่ 3

บทความนี้จะพาคุณไปเรียนรู้แนวคิดการเขียนโปรแกรมที่สำคัญสองอย่าง นั่นคือ ฟังก์ชัน (Functions) และ โครงสร้างควบคุมเงื่อนไข (Conditional Statements) ซึ่งจะทำให้โค้ดของคุณเป็นระเบียบ, นำกลับมาใช้ใหม่ได้ง่ายขึ้น และมีความสามารถในการตัดสินใจ โดยที่เรายังคงใช้แค่ บอร์ด Arduino Uno และ ไฟ LED ในตัว (Built-in LED) เพื่อให้เห็นผลลัพธ์ได้ง่ายๆ




ทำไมต้องเรียนรู้ฟังก์ชันและโครงสร้างควบคุมเงื่อนไข?

  • ฟังก์ชัน: เหมือนกับการสร้าง "สูตร" หรือ "ชุดคำสั่ง" ที่สามารถเรียกใช้งานซ้ำๆ ได้ ทำให้โค้ดไม่ซ้ำซ้อน, อ่านง่าย และแก้ไขได้ง่ายขึ้น

  • โครงสร้างควบคุมเงื่อนไข: ช่วยให้โปรแกรมของคุณสามารถ "คิด" หรือ "ตัดสินใจ" ได้ โดยจะทำงานหรือไม่ทำงานบางส่วนของโค้ด ขึ้นอยู่กับเงื่อนไขที่กำหนด

สิ่งที่คุณต้องเตรียม

  1. บอร์ด Arduino Uno

  2. สาย USB (Type A to Type B)

  3. โปรแกรม 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 ครั้ง สลับกันไปเรื่อยๆ โดยใช้ฟังก์ชันและโครงสร้างควบคุมเงื่อนไข

  1. เปิดโปรแกรม Arduino IDE

  2. คัดลอกโค้ด ด้านล่างนี้ไปวางในหน้าต่าง 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("--------------------");
    }
    
  3. เสียบสาย USB เชื่อมต่อบอร์ด Arduino Uno

  4. ตั้งค่าบอร์ดและพอร์ต ใน Arduino IDE

  5. อัปโหลดโค้ด: คลิกที่ปุ่ม Upload

ผลลัพธ์ที่ได้

คุณจะเห็นไฟ LED "L" บนบอร์ด Arduino Uno:

  • กระพริบช้าๆ (ติด วินาที, ดับ วินาที) เป็นจำนวน ครั้ง

  • จากนั้นจะหยุดนิ่งไป วินาที

  • แล้วเริ่ม กระพริบเร็วๆ (ติด วินาที, ดับ วินาที) เป็นจำนวน ครั้ง

  • จากนั้นจะหยุดนิ่งไป วินาที

  • แล้วกลับไปเริ่มกระพริบช้าๆ ใหม่ เป็นแบบนี้ไปเรื่อยๆ

นอกจากนี้ ถ้าคุณเปิด Serial Monitor (Tools > Serial Monitor) และตั้ง Baud rate เป็น 9600 คุณจะเห็นข้อความที่ Arduino พิมพ์ออกมา บอกสถานะการกระพริบและจำนวนรอบที่ทำงานไปแล้ว

สรุปและก้าวต่อไป

ในบทความนี้ คุณได้เรียนรู้สองแนวคิดพื้นฐานแต่ทรงพลังในการเขียนโปรแกรม:

  • ฟังก์ชัน (void functionName(...) { ... }): ช่วยให้คุณจัดกลุ่มโค้ดและนำกลับมาใช้ใหม่ได้ ทำให้โค้ดเป็นระเบียบและจัดการได้ง่ายขึ้น

  • โครงสร้างควบคุมเงื่อนไข (if, else if, else): ทำให้โปรแกรมของคุณสามารถ "ตัดสินใจ" และเลือกเส้นทางการทำงานตามเงื่อนไขที่กำหนดได้

การผสมผสานฟังก์ชันและโครงสร้างควบคุมเงื่อนไขทำให้คุณสามารถสร้างโปรแกรมที่ซับซ้อนและมีความสามารถมากขึ้นได้ แม้จะยังไม่ต่ออุปกรณ์ภายนอกก็ตาม