🧩 1. ความหมายของ Function

Function (ฟังก์ชัน) คือ “ชุดคำสั่งที่รวมกันเพื่อทำงานเฉพาะอย่างหนึ่ง” สามารถ เรียกใช้ซ้ำได้หลายครั้ง โดยไม่ต้องเขียนโค้ดซ้ำ

📘 ตัวอย่างเช่น:

C++
digitalWrite(2, HIGH);
delay(500);

ฟังก์ชัน digitalWrite() และ delay() คือฟังก์ชันของระบบ Arduino นั่นเอง


⚙️ 2. ประโยชน์ของการใช้ฟังก์ชัน

ประโยชน์อธิบาย
✅ ทำให้โค้ดสั้นและเข้าใจง่ายรวมงานที่ซ้ำกันไว้ในที่เดียว
✅ แก้ไขได้ง่ายเปลี่ยนที่เดียว โค้ดทั้งหมดปรับตาม
✅ นำกลับมาใช้ซ้ำได้ใช้ซ้ำได้หลายที่ / หลายโปรเจกต์
✅ แบ่งส่วนการทำงานได้ชัดเจนเหมาะกับงานหลายขั้นตอน เช่น sensor / LED / motor
✅ ช่วยในการดีบักทดสอบทีละฟังก์ชันได้

🔹 3. โครงสร้างของฟังก์ชัน (Function Syntax)

C++
return_type function_name(parameter1, parameter2, ...) {
    // คำสั่งภายในฟังก์ชัน
    return value;   // ส่งค่ากลับ (ถ้ามี)
}
ส่วนความหมาย
return_typeชนิดข้อมูลที่ฟังก์ชันส่งกลับ เช่น int, float, void
function_nameชื่อฟังก์ชัน เช่น blinkLED
parameterตัวแปรรับค่า (argument)
returnคำสั่งส่งค่ากลับ (ใช้ได้เฉพาะถ้าไม่ใช่ void)

🔸 4. ฟังก์ชันแบบไม่คืนค่า (void function())

ใช้เมื่อไม่ต้องส่งค่ากลับ เช่น คำสั่งควบคุม LED

📘 ตัวอย่าง:

C++
void blinkLED() {
  digitalWrite(2, HIGH);
  delay(300);
  digitalWrite(2, LOW);
  delay(300);
}

การเรียกใช้:

C++
void loop() {
  blinkLED();   // เรียกฟังก์ชันให้ทำงาน
}

🔸 5. ฟังก์ชันที่คืนค่า (return)

ใช้เมื่อเราต้องการผลลัพธ์จากการคำนวณ เช่น การบวกตัวเลข

📘 ตัวอย่าง:

C++
int addNumbers(int a, int b) {
  int sum = a + b;
  return sum;
}

void setup() {
  Serial.begin(115200);
  int result = addNumbers(5, 7);
  Serial.println(result);  // 12
}

🔹 6. ฟังก์ชันที่มีพารามิเตอร์ (Arguments)

พารามิเตอร์คือ “ค่าที่ส่งเข้าไปในฟังก์ชันตอนเรียกใช้”

📘 ตัวอย่าง:

C++
void blink(int pin, int t) {
  digitalWrite(pin, HIGH);
  delay(t);
  digitalWrite(pin, LOW);
  delay(t);
}

void loop() {
  blink(2, 200);   // ขา 2 กระพริบเร็ว
  blink(4, 500);   // ขา 4 กระพริบช้า
}

🔹 7. ฟังก์ชันแบบไม่มีพารามิเตอร์

C++
void sayHello() {
  Serial.println("Hello!");
}

void loop() {
  sayHello();
  delay(1000);
}

🔹 8. ฟังก์ชันคืนค่าแบบอื่น ๆ

ชนิดตัวอย่างผลลัพธ์
intint getValue()คืนค่าจำนวนเต็ม
floatfloat getTemp()คืนค่าทศนิยม
charchar getKey()คืนค่าตัวอักษร
boolbool isPressed()คืนค่าจริง/เท็จ
StringString readName()คืนค่าข้อความ
voidvoid blink()ไม่มีค่ากลับ

🔹 9. การเรียกใช้ฟังก์ชัน (Function Call)

รูปแบบ:

C++
ชื่อฟังก์ชัน(ค่าพารามิเตอร์);

📘 ตัวอย่าง:

C++
float temp = readTemperature();
displayTemp(temp);

🔹 10. การประกาศฟังก์ชัน (Function Prototype)

ถ้าฟังก์ชันถูกเรียกก่อนประกาศจริง ต้อง “ประกาศต้นแบบ” ไว้ก่อน

C++
float getVoltage(int pin);  // <-- prototype

void setup() {
  Serial.begin(115200);
  Serial.println(getVoltage(34));
}

float getVoltage(int pin) {
  int raw = analogRead(pin);
  return (float)raw * 3.3 / 4095.0;
}

🔹 11. การส่งค่าผ่านพารามิเตอร์

ประเภทคำอธิบายตัวอย่าง
Pass by Valueส่ง “ค่าคัดลอก” เข้าไป (ค่าต้นฉบับไม่เปลี่ยน)void f(int x)
Pass by Referenceส่ง “ที่อยู่หน่วยความจำ” → เปลี่ยนค่าจริงได้void f(int &x)

📘 ตัวอย่าง:

C++
void increase(int &num) {   // ส่งแบบ reference
  num++;
}

void setup() {
  int value = 5;
  increase(value);
  Serial.println(value); // แสดง 6
}

🔹 12. ฟังก์ชันแบบมีค่าเริ่มต้น (Default Parameter)

C++
void blink(int pin = 2, int t = 500) {
  digitalWrite(pin, HIGH);
  delay(t);
  digitalWrite(pin, LOW);
  delay(t);
}

void loop() {
  blink();        // ใช้ค่าเริ่มต้น
  blink(4, 200);  // กำหนดใหม่
}

🔹 13. ฟังก์ชันซ้อน (Nested Function Call)

สามารถใช้ผลลัพธ์ของฟังก์ชันหนึ่งไปเป็นพารามิเตอร์ของอีกฟังก์ชันได้

C++
int square(int n) { return n * n; }
int add(int a, int b) { return a + b; }

void setup() {
  Serial.begin(115200);
  Serial.println(square(add(2, 3))); // (2+3)² = 25
}

🔹 14. ตัวอย่างฟังก์ชันประยุกต์ใน Arduino

🔸 คำนวณอุณหภูมิจากเซนเซอร์

C++
float readTemp(int pin) {
  int val = analogRead(pin);
  float volt = (float)val * 3.3 / 4095.0;
  return volt * 100.0; // LM35: 10 mV/°C
}

void loop() {
  float temp = readTemp(34);
  Serial.println(temp);
  delay(1000);
}

🔸 ควบคุม LED ด้วยฟังก์ชัน

C++
void ledOnOff(int pin, bool state) {
  digitalWrite(pin, state ? HIGH : LOW);
}

void loop() {
  ledOnOff(2, true);
  delay(500);
  ledOnOff(2, false);
  delay(500);
}

🔹 15. การใช้ฟังก์ชันร่วมกับโครงสร้างควบคุม

C++
float getVoltage(int pin) {
  return (float)analogRead(pin) * 3.3 / 4095.0;
}

void loop() {
  float v = getVoltage(34);
  if (v < 1.5)
    Serial.println("LOW");
  else
    Serial.println("HIGH");
  delay(1000);
}

🧠 16. เคล็ดลับ

✅ แบ่งโปรแกรมใหญ่ แยกเป็น “ฟังก์ชันย่อย” เช่น

  • readSensor()
  • showDisplay()
  • controlMotor()

✅ ให้เห็นความแตกต่างระหว่าง

  • ฟังก์ชัน มีการคืนค่า (int, float)
  • ฟังก์ชัน ไม่มีการคืนค่า (void)

✅ ใช้โครงงานง่าย ๆ เช่น “ปุ่มเปิด–ปิดไฟ”, “อ่านค่าอุณหภูมิ”, “ระบบกระพริบไฟ”
ให้ฝึกเขียนฟังก์ชันแยกแต่ละส่วน แล้วเรียกใน loop()


📚 17. สรุปตาราง “Functions” ภาษาไทย

หัวข้อตัวอย่างความหมาย
ฟังก์ชันไม่มีค่าvoid blink()ทำงาน ไม่คืนค่า
ฟังก์ชันมีค่าint add(int a, int b)คืนค่าผลรวม
การส่งค่าเข้าblink(2,500)ส่งพารามิเตอร์เข้า
การส่งค่าออกreturn sum;ส่งผลลัพธ์กลับ
ค่าเริ่มต้นvoid f(int x=5)ถ้าไม่ส่ง จะใช้ 5
Prototypeint readTemp(int);ประกาศก่อนใช้งาน
By Referencevoid f(int &x)เปลี่ยนค่าตัวแปรจริง
ซ้อนฟังก์ชันf(g(x));ใช้ผลจากฟังก์ชันหนึ่ง
เรียกซ้ำ (Recursive)fact(n)ฟังก์ชันเรียกตัวเอง

🧩 18. ทดลอง

1️⃣ สร้างฟังก์ชัน blinkLED(pin, delayTime) ให้รับขาและเวลาหน่วง แล้วกระพริบ LED
2️⃣ เขียนฟังก์ชัน float readTemp(int pin) อ่านค่าเซนเซอร์แล้วคืนค่าอุณหภูมิ
3️⃣ เขียนฟังก์ชัน int add(int a, int b, int c) คืนค่าผลรวมสามตัว
4️⃣ เขียนฟังก์ชัน bool isEven(int x) คืนค่า true ถ้าเป็นเลขคู่
5️⃣ ทดลองเขียนฟังก์ชัน sum = add(square(2), square(3)); เพื่อแสดงการเรียกซ้อน


🧾 19. สรุปแนวคิดสำคัญ

แนวคิดอธิบาย
Function คือชุดคำสั่งย่อยที่เรียกใช้ได้หลายครั้ง
มีสองประเภทมีค่าคืน (return) / ไม่มีค่าคืน (void)
มีพารามิเตอร์รับค่าจากภายนอกตอนเรียกใช้
Prototypeต้องประกาศก่อนถ้าเรียกก่อนประกาศจริง
By Referenceเปลี่ยนค่าจริงของตัวแปรได้
Default Parameterกำหนดค่าเริ่มต้นได้
ใช้ซ้ำได้เรียกใช้หลายครั้ง ประหยัดโค้ด