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

Constant (ค่าคงที่) คือ “ค่าที่ไม่เปลี่ยนแปลงตลอดการทำงานของโปรแกรม” ต่างจากตัวแปร (Variable) ที่ค่าเปลี่ยนได้

ใช้เมื่อคุณต้องการ “กำหนดชื่อแทนค่าตายตัว” เพื่อให้โค้ดอ่านง่าย และลดความผิดพลาดเวลาต้องเปลี่ยนค่าในหลายจุด


⚙️ 2. ประเภทของ Constants ใน Arduino / ESP32

ประเภทลักษณะตัวอย่างหมายเหตุ
Literal Constantค่าที่ระบุโดยตรง10, 'A', 3.14, "Hello"ตัวเลข, ตัวอักษร, ข้อความ ฯลฯ
Symbolic Constant (#define)ค่าคงที่แบบแมโคร (Preprocessor)#define LED 2ถูกแทนค่าก่อนคอมไพล์
Constant Variable (const)ตัวแปรที่ไม่สามารถเปลี่ยนค่าได้const int LED = 2;ปลอดภัยกว่า #define, มีชนิดข้อมูล
Enumeration (enum)กำหนดกลุ่มค่าคงที่เป็นชุดenum State {ON, OFF};ใช้จัดกลุ่มสถานะหรือโหมด
Built-in Constantsค่ามาตรฐานใน Arduino CoreHIGH, LOW, INPUT, OUTPUT, true, falseใช้บ่อยใน I/O

🔹 3. Literal Constants (ค่าที่เขียนตรง ๆ)

ตัวอย่างชนิดความหมาย
100intตัวเลขจำนวนเต็ม
3.1416floatทศนิยม
'A'charตัวอักษร 1 ตัว
"ESP32"Stringข้อความ
0xFFhexเลขฐาน 16 (255)
0b1010binaryเลขฐาน 2 (10)

📘 ตัวอย่าง:

C++
int ledPin = 2;      // ค่าตรง
float pi = 3.1416;   // ค่าทศนิยม
char letter = 'A';   // ตัวอักษร

🔹 4. Symbolic Constants – #define

เป็นคำสั่งของ Preprocessor (ประมวลผลก่อนคอมไพล์) ไม่ใช่ตัวแปรในหน่วยความจำ แต่เป็น “การแทนข้อความ” ก่อนคอมไพล์

C++
#define LED 2
#define DELAY 500

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, HIGH);
  delay(DELAY);
  digitalWrite(LED, LOW);
  delay(DELAY);
}

ข้อดี:

  • สั้น, ใช้งานง่าย
  • ถูกแทนค่าก่อนคอมไพล์ → ทำงานเร็ว

ข้อเสีย:

  • ไม่มีชนิดข้อมูล → Debug ยาก
  • ถ้าใช้เยอะ อ่านยากในโปรเจกต์ใหญ่

🔹 5. Constant Variables – const

เป็นการประกาศ “ตัวแปรที่เปลี่ยนค่าไม่ได้” ปลอดภัยกว่า #define เพราะระบบรู้ชนิดข้อมูล

C++
const int LED = 2;
const unsigned long TIME_DELAY = 500;

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, HIGH);
  delay(TIME_DELAY);
  digitalWrite(LED, LOW);
  delay(TIME_DELAY);
}

ข้อดีของ const

  • มีชนิดข้อมูลแน่นอน → ป้องกันบั๊กจากชนิดผิด
  • เก็บในหน่วยความจำจริง → ใช้ร่วมกับ pointer, function ได้
  • อ่านง่าย เหมาะกับโปรแกรมใหญ่ / ESP32

Arduino/ESP32 Core ใช้ const สำหรับค่าพิน เช่น const int SDA = 21;


🔹 6. Enumeration Constants – enum

ใช้สร้าง “กลุ่มค่าคงที่” ที่มีความสัมพันธ์กัน เช่น สถานะเครื่อง

C++
enum State { OFF, ON };
State ledState = OFF;

void setup() {
  Serial.begin(115200);
}

void loop() {
  if (ledState == OFF) {
    Serial.println("LED OFF");
    ledState = ON;
  } else {
    Serial.println("LED ON");
    ledState = OFF;
  }
  delay(1000);
}

ผลลัพธ์:

Zsh
LED OFF
LED ON
LED OFF
...

💡 enum จะกำหนดค่าเป็นตัวเลขอัตโนมัติ เช่น
OFF = 0, ON = 1 (สามารถระบุเองได้เช่น enum Mode {SLOW=100, FAST=200};)


🔹 7. Built-in Constants (ค่าคงที่ใน Arduino Core)

ค่าคงที่ความหมายใช้กับ
HIGHค่า 1 หรือ 3.3V/5VdigitalWrite, digitalRead
LOWค่า 0VdigitalWrite, digitalRead
INPUTตั้งขาเป็นอินพุตpinMode
OUTPUTตั้งขาเป็นเอาต์พุตpinMode
INPUT_PULLUPอินพุต + ตัวต้านทานดึงขึ้นภายในpinMode
true / falseค่าเชิงตรรกะ (boolean)if, while
PIค่าพาย (3.14159)คณิตศาสตร์
LED_BUILTINขา LED บนบอร์ดdigitalWrite

📘 ตัวอย่าง:

C++
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // เปิดไฟ
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);   // ปิดไฟ
  delay(500);
}

🔹 8. ค่าคงที่เชิงตัวเลข (Numerical Constants)

รูปแบบตัวอย่างหมายเหตุ
เลขฐาน 10255ค่าปกติ
เลขฐาน 160xFFใช้กับสี RGB, บิตมาสก์
เลขฐาน 20b10101010ใช้ในการควบคุมบิต
เลขฐาน 80377ฐานแปด (น้อยใช้)
ตัวเลขทศนิยม3.14, -0.75ค่าทศนิยม
ค่าลอยตัวแบบ long1000Lบังคับชนิด long
ค่าทศนิยมแบบ float2.5fใช้กับ float

🔹 9. การใช้งานร่วมกับ Arrays และ Functions

C++
const int ledPins[] = {2, 4, 5, 18};
const int numLeds = 4;

void setup() {
  for (int i = 0; i < numLeds; i++)
    pinMode(ledPins[i], OUTPUT);
}

void loop() {
  for (int i = 0; i < numLeds; i++) {
    digitalWrite(ledPins[i], HIGH);
    delay(200);
    digitalWrite(ledPins[i], LOW);
  }
}

🔹 10. ข้อดีของการใช้ Constants

ข้อดีรายละเอียด
✅ อ่านง่ายใช้ชื่อสื่อความหมาย แทนตัวเลข
✅ ปรับแก้ง่ายเปลี่ยนค่าที่เดียว โปรแกรมทั้งระบบปรับตาม
✅ ป้องกันบั๊กลดความเสี่ยงพิมพ์ค่าผิด หรือชนิดข้อมูลไม่ตรง
✅ ประสิทธิภาพCompiler จัดการได้ดีขึ้น
✅ ใช้ซ้ำได้นำไปใช้ในหลายฟังก์ชัน/โมดูล

📚 สรุป “Constants”

ประเภทคำสั่ง/รูปแบบตัวอย่างใช้เมื่อ
Literalเขียนค่าโดยตรงdigitalWrite(2, HIGH);ทดลองสั้น ๆ
#define#define LED 2digitalWrite(LED, HIGH);โปรแกรมเล็ก, ค่าตายตัว
constconst int LED=2;ปลอดภัย, มีชนิดข้อมูล
enumenum {ON,OFF};กลุ่มค่าคงที่ เช่น โหมด
Built-inHIGH, LOW, INPUTค่ามาตรฐานของ Arduino

🔧 สรุปแนวปฏิบัติที่ดี (Best Practice)

  1. ใช้ const แทน #define เมื่อทำงานกับตัวแปรใน C/C++ (เพราะมี type checking)
  2. ใช้ชื่อคงที่เป็น ตัวพิมพ์ใหญ่ทั้งหมด เช่น LED_PIN, SENSOR_THRESHOLD
  3. ใช้ enum เมื่อค่าคงที่มีหลายสถานะที่สัมพันธ์กัน
  4. อย่าใช้ค่าตัวเลขดิบ (magic numbers) ในโค้ด
  5. ใช้ constexpr (ESP32 รองรับ) สำหรับค่าคงที่ที่ compiler คำนวณล่วงหน้าได้